关于使用反射和泛型写JDBC
最近学习了用反射和泛型来写JDBC,发现可以省掉很多代码。下面是我个人的理解,有错误的地方请指出。谢谢。
我是做一个简单的小例子,使查询结果输出在控制台。我这里使用的是eclipse、MySQL数据库,随意创建一个表名字为users,里面的字段有id、name、pwd。那个连接数据库的jar包可以去官网下载,我这里也有[https://pan.baidu.com/s/1JjYHbee5JTNyprD9QOIDEg],提取码:kwoz.
新建一个java项目
把jar包放进去Build Path一下,这个时候就开始创建需要的包,我这里用的包如下
首先,我先创建了一个javabean类,里面主要是数据库的字段,代码如下:
package com.hp.bean;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class User{
private int id;
private String name;
private String pwd;
}
我这里用了一个插件jar包,lombok.jar,这样子可以不用写get、set、toString等等方法,直接用@NoArgsConstructor、@AllArgsConstructor、@ToString、@Getter、@Setter这些引入就好了。jar包下载地址:[https://pan.baidu.com/s/19bhDrEnkVmaQZmCz51RVyg]提取码:31ff。这个有的需要运行一下然后配置一点东西,这里网上有很多教程,如果这里不能用的话可以直接用最原始的方式,get set…。
其次,我创建了一个DBUtil类,这个类主要是连接数据库的。代码如下:
package com.hp.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
public static final String url = "jdbc:mysql://localhost:3306/test";
public static final String name = "root";
public static final String pwd = "root";
public static Connection conn;
public static PreparedStatement ps;
public static ResultSet rs;
/**
* 连接数据库
* @return
*/
public static Connection getConn() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, name, pwd);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库
*/
public static void closeConn() {
try {
conn.close();
ps.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
可能写法上有点不一样,不过都是可以用的。
然后,我开始创建接口,dao接口和接口的实现,还有service接口和接口的实现,我这里只用了一个查询的方法。
UserDao.java
package com.hp.dao;
import java.util.List;
import java.util.Map;
public interface UserDao {
/**
* 查询所有
* @return
*/
public <E> List<E> selectType(E e,String sql);
}
UserDaoImpl.java
package com.hp.dao.impl;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.hp.dao.UserDao;
import com.hp.util.DBUtil;
public class UserDaoImpl implements UserDao{
@Override
public <E> List<E> selectType(E e,String sql) {
Connection conn = DBUtil.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
List<E> list = new ArrayList<>();
try {
ps = conn.prepareStatement("select * "+sql);
rs = ps.executeQuery();
while (rs.next()) {
e = (E) e.getClass().newInstance();//通过反射创建实例化对象
Field[] fields = e.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
String cname = fields[i].getName();
fields[i].setAccessible(true);
try {
fields[i].set(e, rs.getObject(cname));
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
}
list.add(e);
}
} catch (Exception e1) {
e1.printStackTrace();
}
return list;
}
}
UserService.java
package com.hp.service;
import java.util.List;
import java.util.Map;
import com.hp.bean.User;
public interface UserService {
/**
* 查询所有
* @return
*/
public <E> List<E> selectType(E e,String sql);
}
UserServiceImpl.java
package com.hp.service.impl;
import java.util.List;
import java.util.Map;
import com.hp.bean.User;
import com.hp.dao.UserDao;
import com.hp.dao.impl.UserDaoImpl;
import com.hp.service.UserService;
public class UserServiceImpl implements UserService{
UserDao userDao = new UserDaoImpl();
@Override
public <E> List<E> selectType(E e,String sql) {
return userDao.selectType(e,sql);
}
}
到最后就是这些服务的调用了。我命名为UserAction.java
package com.hp.action;
import java.util.List;
import com.hp.bean.User;
import com.hp.service.UserService;
import com.hp.service.impl.UserServiceImpl;
public class UserAction {
public static void main(String[] args) {
User user = new User();
UserService userService = new UserServiceImpl();
String sql = "from users";
List<User> list = userService.selectType(user,sql);
System.out.println(list);
}
}
这就是我用反射和泛型写的简单的查询的JDBC.