在我们学习java的jdbc的时候,我们去获取数据库的数据,在不使用框架的情况,我们只能从ResultSet结果集中去获取,每次去访问,都需要自己根据你查询的不同的表,来进行从ResultSet中把数据取出来,然后封装到对象里去,这样的重复操作,很麻烦很费时间,那么我们今天来就来说一下如果通过java的反射机制,来写一个工具类,来出来查询的结果集,根据自己需求来封装成自己想要的实体对象。
public class JdbcBeanUtil {
//由于我们的链接信息一般是不会改变的,所以我们这个信息我们用了final来修饰,希望不要被别的程序给修改了
private final static String driver = "com.mysql.jdbc.Driver";
private final static String url = "jdbc:mysql://localhost:3306/jdbc";
private final static String username = "root";
private final static String password = "admin";
private Connection conn;
private Statement sm;
//驱动只需要加载一次,那么我们这里就用一个静态块来执行驱动加载
//加载驱动
static{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return
*/
public Connection getConnection(){
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 关闭连接和statement
* @throws SQLException
*/
public void closeConnection() throws SQLException{
if(conn!=null)
conn.close();
if(sm!=null)
sm.close();
}
/**
* 解析一行ResultSet结果集,并返回以字段名为Key,以字段值为value组成的Map集合
* @param rs
* @param T
* @return
* @throws SQLException
*/
public Map<String , Object> getResultMap(ResultSet rs,Class<?> T) throws SQLException{
Field[] fields = T.getDeclaredFields();//获取T类型的类的属性对象
Map<String ,Object> map = new HashMap<String , Object>();
for(Field f : fields){
//通过属性名来过去结果集中对应的值,并以这个属性名为key,结果集中得到的值为map的值
//注意:这里值适合数据库的字段的名称与对应实体类的属性名称一致,
//或者是查询结果集中的字段名与实体类的属性名一致
map.put(f.getName(), rs.getObject(f.getName()));
}
return map;
}
/**
* 动态将对应的结果数据封装到指定类型的类对象里,并将该对象返回
* @param map
* @param T
* @return
* @throws Exception
*/
public Object setValueInBean(Map<String,Object> map,Class<?> T) throws Exception{
//动态创建一个类对象,通过无参构造器创建
Object bean = T.newInstance();
//获取这个类类型的类里的方法
Method[] methods = T.getMethods();
for(Method m : methods){
String name = m.getName();
//判断是否为set方法,因为我们这个时候需要用set方法来想对象中设置对应属性的值
if(m.getName().startsWith("set")){
//获取这个set方法对应的属性名称
name = name.substring(3, 4).toLowerCase()+ name.substring(4, name.length());
Object obj = map.get(name);
//让对象bean执行m方法,参数为obj
m.invoke(bean, obj);
}
}
return bean;
}
/**
* 查询一条数据
* @param sql
* @param T
* @return
*/
public Object selectOne(String sql,Class<?> T){
Object bean = null;
try {
conn = this.getConnection();
sm = conn.createStatement();
ResultSet rs = sm.executeQuery(sql);
//如果结果集中没有数据,就返回一个空的对象
if(rs.next()){
return bean;
}
bean = this.setValueInBean(this.getResultMap(rs, T), T);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
this.closeConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
return bean;
}
/**
* 查询多条数据
* @param sql
* @param T
* @return
*/
public List<? extends Object> selectList(String sql , Class<?> T){
List<Object> list = new ArrayList<Object>();
try {
conn = this.getConnection();
sm = conn.createStatement();
ResultSet rs = sm.executeQuery(sql);
while(rs.next()){
list.add(this.setValueInBean(this.getResultMap(rs, T), T));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
this.closeConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}