一、自制DbUtils

一成不变的生活,太让人难受了,于是我便动手编写了个属于自己的Dbutils 。尽管是有"重复造轮子"一说,可是这让我成长了,让我认识到我和大牛之间的差距。
为了区别其它DbUtils.jar,我用DbUtils的全称DatabaseUtilities来命名文件,即"DatabaseUtilities.jar"

二、运行展示

1.使用SqlRunner对象进行查询操作

1.1 代码

package com.ytt.test;import com.liurui.growth.*;
import com.ytt.domain.User;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;public class SqlRunnerTest {@Testpublic void testQuery() throws ClassNotFoundException, IOException, SQLException {Properties properties = new Properties();properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");Class.forName(driver);Connection connection = DriverManager.getConnection(url, username, password);//------------------------------------------------------------------------------------SqlRunner sqlRunner = new SqlRunner(connection);List<User> userList = sqlRunner.query("select * from user where name like ?",new BeanListHandler<User>(User.class), "%a%");User user = sqlRunner.query("select * from user where id=?",new BeanHandler<User>(User.class), 2);Map<String, Object> map = sqlRunner.query("select * from user where id=?",new MapHandler<User>(User.class), 30);List<Map<String, Object>> mapList = sqlRunner.query("select * from user where birthdate in(?,?)",new MapListHandler<User>(User.class), "1993-10-03","2000-10-10");//------------------------------------------------------------------------------------System.out.println("userList\r\n"+userList);System.out.println("user\r\n"+user);System.out.println("map\r\n"+map);System.out.println("mapList");for (Map<String, Object> stringObjectMap : mapList) {System.out.println(stringObjectMap);}}
}

1.2 运行结果

2. 使用SqlRunner对象进行删除操作

2.1 操作代码

package com.ytt.test;import com.liurui.growth.*;
import com.ytt.domain.User;
import org.junit.Test;import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;public class SqlRunnerTest {@Testpublic void testQuery() throws ClassNotFoundException, IOException, SQLException {Properties properties = new Properties();properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");Class.forName(driver);Connection connection = DriverManager.getConnection(url, username, password);connection.setAutoCommit(false);//不自动提交事务,不作真正的删除操作//为了明显地看出删除的效果,这里查询两次//------------------------------------------------------------------------------------SqlRunner sqlRunner = new SqlRunner(connection);List<User> userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n" + userList);Integer row = sqlRunner.delete("delete from user where id in(?,?,?)", 25,26,27);System.out.println("删除id为25,26,27的记录");System.out.println("rows affected:\t" + row);userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n" + userList);//------------------------------------------------------------------------------------}
}

2.2 运行结果

3. 使用SqlRunner对象进行插入,批量插入操作

3.1 操作代码

package com.ytt.test;import com.liurui.growth.*;
import com.ytt.domain.User;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;public class SqlRunnerTest {@Testpublic void testQuery() throws ClassNotFoundException, IOException, SQLException {Properties properties = new Properties();properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");Class.forName(driver);Connection connection = DriverManager.getConnection(url, username, password);connection.setAutoCommit(false);//不自动提交事务//为了明显地看出插入记录的效果,// 先删除所有记录,// 再插入一条记录,查询一次,// 最后一次性插入三条记录,查询一次//------------------------------------------------------------------------------------SqlRunner sqlRunner = new SqlRunner(connection);Integer rows = sqlRunner.delete("delete from user");//删除所有记录System.out.println("删除所有记录");System.out.println("rows affected:\t"+rows);rows = sqlRunner.insert("insert into user(name) values(?)", "盖亚奥特曼");System.out.println("插入一条记录");System.out.println("rows affected:\t"+rows);List<User> userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n"+userList);Object[][] arguments=new Object[][]{{"梦比优斯奥特曼"},{"雷欧奥特曼"},{"迪加奥特曼"}};rows = sqlRunner.insertBatch("insert into user(name) values(?)", arguments);System.out.println("插入三条记录");System.out.println("rows affected:\t"+rows);userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n"+userList);//------------------------------------------------------------------------------------}
}

3.2 运行结果

4. 使用SqlRunner对象进行修改操作

4.1 操作代码

package com.ytt.test;import com.liurui.growth.*;
import com.ytt.domain.User;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;public class SqlRunnerTest {@Testpublic void testQuery() throws ClassNotFoundException, IOException, SQLException {Properties properties = new Properties();properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");Class.forName(driver);Connection connection = DriverManager.getConnection(url, username, password);connection.setAutoCommit(false);//不自动提交事务//------------------------------------------------------------------------------------SqlRunner sqlRunner = new SqlRunner(connection);Integer rows = sqlRunner.delete("delete from user");//删除所有记录System.out.println("删除所有记录");System.out.println("rows affected:\t"+rows);Object[][] arguments=new Object[][]{{"梦比优斯奥特曼"},{"雷欧奥特曼"},{"迪加奥特曼"}};rows = sqlRunner.insertBatch("insert into user(name) values(?)", arguments);System.out.println("插入三条记录");System.out.println("rows affected:\t"+rows);List<User> userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n"+userList);rows = sqlRunner.update("update user set name=?", "欧布奥特曼");System.out.println("修改所有记录,将name的值修改为'欧布奥特曼'");System.out.println("rows affected:\t"+rows);userList = sqlRunner.query("select * from user", new BeanListHandler<User>(User.class));System.out.println("userList\r\n"+userList);//------------------------------------------------------------------------------------}
}

4.2 运行结果

5. 使用SqlRunner对象操作聚合函数及查看系统变量

5.1 操作代码

package com.ytt.test;import com.liurui.growth.*;
import com.ytt.domain.User;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;public class SqlRunnerTest {@Testpublic void testQuery() throws ClassNotFoundException, IOException, SQLException {Properties properties = new Properties();properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");Class.forName(driver);Connection connection = DriverManager.getConnection(url, username, password);connection.setAutoCommit(false);//不自动提交事务//------------------------------------------------------------------------------------SqlRunner sqlRunner = new SqlRunner(connection);List<Map<String, Object>> mapList = sqlRunner.query("select * from user", new MapListHandler<>(User.class));System.out.println("查询所有记录");System.out.println("mapList");for (Map<String, Object> stringObjectMap : mapList) {System.out.println(stringObjectMap);}System.out.println("---------------------------------------------");Integer count = sqlRunner.query("select count(*) from user", new ScalarHandler<>(Integer.class));System.out.println("count(*)\t"+count);Date date = sqlRunner.query("select max(birthdate) from user", new ScalarHandler<Date>(Date.class));System.out.println("max(birthdate)\t"+date);Double maxBalance = sqlRunner.query("select max(balance) from user", new ScalarHandler<Double>(Double.class));System.out.println("max(balance)\t"+maxBalance);String transactionIsolation = sqlRunner.query("select @@transaction_isolation", new ScalarHandler<String>(String.class));System.out.println("transactionIsolation\t"+transactionIsolation);//------------------------------------------------------------------------------------}
}

5.2 运行结果

三、 结构和代码展示

1. 整体结构

2. 代码

2.1 两个接口

2.1.1 ResultSetHandler接口,用来处理ResultSet

package com.liurui.origin;import java.sql.ResultSet;
import java.sql.SQLException;public interface ResultSetHandler <T>{T handle(ResultSet resultSet) throws SQLException;}

2.1.2 Runner 接口,用来处理SQL语句

package com.liurui.origin;import java.sql.Connection;
import java.sql.SQLException;public interface Runner {<T> T query(String sql, ResultSetHandler<T> resultSetHandler) throws SQLException;<T> T query(String sql, ResultSetHandler<T> resultSetHandler, Object... arguments) throws SQLException;<T> T query(Connection connection, String sql, ResultSetHandler<T> resultSetHandler) throws SQLException;<T> T query(Connection connection, String sql, ResultSetHandler<T> resultSetHandler, Object... arguments) throws SQLException;Integer delete(String sql, Object... arguments);Integer delete(String sql);Integer delete(Connection connection, String sql, Object... arguments);Integer delete(Connection connection, String sql);Integer insert(String sql, Object... arguments);Integer insert(String sql);Integer insert(Connection connection, String sql, Object... arguments);Integer insert(Connection connection, String sql);Integer insertBatch(String sql, Object arguments[][]);Integer insertBatch(String sql);Integer insertBatch(Connection connection, String sql, Object arguments[][]);Integer insertBatch(Connection connection, String sql);Integer update(String sql, Object... arguments);Integer update(Connection connection, String sql, Object... arguments);Integer update(String sql);Integer update(Connection connection, String sql);void close();}

2.2 六个实现接口类

2.2.1 BeanHandler类

实现ResultSetHandler接口,将ResultSet中的数据封装在一个JavaBean类中,并返回JavaBean对象。
使用场景:当ResultSet只有一条数据库表记录时。

package com.liurui.growth;import com.liurui.origin.ResultSetHandler;
import com.liurui.utilities.ResultSetProcessor;
import java.sql.ResultSet;public class BeanHandler<T> implements ResultSetHandler<T> {private Class<T> beanClass;private ResultSetProcessor<T> resultSetProcessor;public BeanHandler(Class<T> beanClass){this(beanClass,new ResultSetProcessor<T>());}public BeanHandler(Class<T> beanClass,ResultSetProcessor<T> resultSetProcessor){this.beanClass=beanClass;this.resultSetProcessor=resultSetProcessor;}@Overridepublic T handle(ResultSet resultSet) {if (resultSet == null)return null;return resultSetProcessor.getBean(resultSet,beanClass);}
}

2.2.2 BeanListHandler类

实现ResultSetHandler接口,将ResultSet中的数据封装在一个List集合中,并返回List对象。
使用场景:当ResultSet有多条数据库表记录时。

package com.liurui.growth;
import com.liurui.origin.ResultSetHandler;
import com.liurui.utilities.ResultSetProcessor;
import java.sql.ResultSet;
import java.util.List;public class BeanListHandler<T> implements ResultSetHandler<List<T>> {private Class<T> beanClass;private ResultSetProcessor<T> resultSetProcessor;public BeanListHandler(Class<T> beanClass){this(beanClass, new ResultSetProcessor<>());}public BeanListHandler(Class<T> beanClass, ResultSetProcessor<T> resultSetProcessor){this.beanClass=beanClass;this.resultSetProcessor=resultSetProcessor;}@Overridepublic List<T> handle(ResultSet resultSet){if(resultSet==null)return null;return resultSetProcessor.getBeanList(resultSet,beanClass);}
}

2.2.3 MapHandler类

实现ResultSetHandler接口,将ResultSet中的数据封装在一个Map<String, Object>集合中,并返回Map对象。
使用场景:当ResultSet有一条数据库表记录时。

package com.liurui.growth;import com.liurui.origin.ResultSetHandler;
import com.liurui.utilities.ResultSetProcessor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;public class MapHandler<T> implements ResultSetHandler<Map<String,Object>> {private Class<T> beanClass;private ResultSetProcessor resultSetProcessor;public MapHandler(Class<T> beanClass){this(beanClass,new ResultSetProcessor<>());}public MapHandler(Class<T> beanClass,ResultSetProcessor<T> resultSetProcessor) {this.beanClass=beanClass;this.resultSetProcessor=resultSetProcessor;}@Overridepublic Map<String, Object> handle(ResultSet resultSet) throws SQLException {return resultSetProcessor.getMap(resultSet,beanClass);}
}

2.2.4 MapListHandler类

实现ResultSetHandler接口,将ResultSet中的数据封装在一个List<Map<String, Object>>集合中,并返回List对象。
使用场景:当ResultSet有多条数据库表记录时。

package com.liurui.growth;import com.liurui.origin.ResultSetHandler;
import com.liurui.utilities.ResultSetProcessor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;public class MapListHandler<T> implements ResultSetHandler<List<Map<String,Object>>> {private Class<T> beanClass;private ResultSetProcessor<T> resultSetProcessor;public MapListHandler(Class<T> beanClass){this(beanClass,new ResultSetProcessor<T>());}public MapListHandler(Class<T> beanClass,ResultSetProcessor<T> resultSetProcessor){this.beanClass=beanClass;this.resultSetProcessor=resultSetProcessor;}@Overridepublic List<Map<String, Object>> handle(ResultSet resultSet) throws SQLException{return resultSetProcessor.getMapList(resultSet,beanClass);}
}

2.2.5 ScalarHandler类

实现ResultSetHandler接口,将ResultSet中的数据封装在一个指定的数据类型(主要有:java.sql.Date,String,Integer,Long,Double,Float)中,并返回指定数据类型的对象。
使用场景:执行SQL聚合函数后得到的ResultSet

package com.liurui.growth;import com.liurui.origin.ResultSetHandler;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;public class ScalarHandler<T> implements ResultSetHandler<T> {private final String columnName;//表中字段名private final Integer columnIndex;//表中字段索引,从1开始private Class<T> outcomeClass;//将查询出来的结果封装到指定类的Classpublic ScalarHandler(Class<T> outcomeClass, Integer columnIndex) {this(outcomeClass, null, columnIndex);}public ScalarHandler(Class<T> outcomeClass) {this(outcomeClass, null, 1);//为字段索引指定默认值1,即第一列}public ScalarHandler(Class<T> outcomeClass, String columnName) {this(outcomeClass, columnName, 1);//为字段索引指定默认值1}private ScalarHandler(Class<T> outcomeClass, String columnName, Integer columnIndex) {this.outcomeClass = outcomeClass;this.columnName = columnName;this.columnIndex = columnIndex;}@Overridepublic T handle(ResultSet resultSet) throws SQLException {//不管有没有通过构造函数传入的参数为this.columnIndex赋值,this.columnIndex都会赋默认值1//而this.columnName必须由构造函数传入的参数为其赋值,否则this.columnName为nullString outcomeString=null;try{if (resultSet.next()) {outcomeString = columnName == null ?resultSet.getObject(columnIndex).toString() :resultSet.getObject(columnName).toString();T entityObject = transform(outcomeClass, outcomeString);return entityObject;}}catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e){e.printStackTrace();}return null;}private T transform(Class<T> toClass, String fromString) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {if(fromString.getClass()==toClass){return (T)fromString;}Method valueOfMethod = toClass.getMethod("valueOf",String.class);//取出静态方法valueOfT entityObject =(T)valueOfMethod.invoke(null, fromString);return entityObject;}}

2.2.6 SqlRunner类

实现Runner接口,执行SQL语句
使用场景:通过Connection对象,Sql语句, ,Sql语句的参数,指定的ResultSetHandler实现类,执行Sql语句,并根据指定的ResultSetHandler实现类,生成对应的返回值

package com.liurui.growth;import com.liurui.origin.ResultSetHandler;
import com.liurui.origin.Runner;import java.sql.*;/*主操作类通过SqlRunner对象来执行SQL语句
*/
public class SqlRunner implements Runner {private Connection connection;private PreparedStatement preparedStatement;private ResultSet resultSet;public SqlRunner() {}public SqlRunner(Connection connection) {this.connection = connection;}private void fillArguments(PreparedStatement preparedStatement, Object... arguments)//给PreparedStatement填充参数{if (preparedStatement == null)return;if (arguments == null)return;ParameterMetaData parameterMetaData;try {parameterMetaData = preparedStatement.getParameterMetaData();int parameterCount = parameterMetaData.getParameterCount();if (parameterCount != arguments.length)return;for (int i = 0; i < parameterCount; i++) {preparedStatement.setObject(i + 1, arguments[i]);}} catch (SQLException e) {e.printStackTrace();}}private <T> T executeDQL(Connection connection, String sql, ResultSetHandler<T> resultSetHandler, Object... arguments){T outcome = null;try {if ((this.connection == null || this.connection.isClosed()) && connection != null) {this.connection = connection;}if ((this.connection == null || this.connection.isClosed()) && connection == null) {throw new SQLException("There is no Database Connectivity");}if (sql == null || sql.trim() == "" || resultSetHandler == null)return null;this.preparedStatement = this.connection.prepareStatement(sql);fillArguments(this.preparedStatement,arguments);this.resultSet = this.preparedStatement.executeQuery();outcome = resultSetHandler.handle(resultSet);} catch (SQLException e) {e.printStackTrace();}return outcome;}@Overridepublic <T> T query(String sql, ResultSetHandler<T> resultSetHandler) {return executeDQL(null, sql, resultSetHandler, null);}@Overridepublic <T> T query(String sql, ResultSetHandler<T> resultSetHandler, Object... arguments) {return executeDQL(null, sql, resultSetHandler, arguments);}@Overridepublic <T> T query(Connection connection, String sql, ResultSetHandler<T> resultSetHandler) throws SQLException {return executeDQL(connection, sql, resultSetHandler, null);}@Overridepublic <T> T query(Connection connection, String sql, ResultSetHandler<T> resultSetHandler, Object... arguments) throws SQLException {return executeDQL(connection, sql, resultSetHandler, arguments);}private int executeDML(Connection connection, String sql, Object... arguments){int affectedRow = 0;try {if ((this.connection == null || this.connection.isClosed()) && connection != null) {this.connection = connection;}if ((this.connection == null || this.connection.isClosed()) && connection == null) {throw new SQLException("There is no Database Connectivity");}if (sql == null || sql.trim() == "")return -1;this.preparedStatement = this.connection.prepareStatement(sql);fillArguments(this.preparedStatement, arguments);affectedRow = preparedStatement.executeUpdate();return affectedRow;} catch (SQLException e) {e.printStackTrace();}return affectedRow;}@Overridepublic Integer delete(String sql, Object... arguments) {return executeDML(null, sql, arguments);}@Overridepublic Integer delete(String sql) {return executeDML(null, sql, null);}@Overridepublic Integer delete(Connection connection, String sql, Object... arguments) {return executeDML(connection, sql, arguments);}@Overridepublic Integer delete(Connection connection, String sql) {return executeDML(connection, sql, null);}@Overridepublic Integer insert(String sql, Object... arguments) {return executeDML(null, sql, arguments);}@Overridepublic Integer insert(String sql) {return executeDML(null, sql, null);}@Overridepublic Integer insert(Connection connection, String sql, Object... arguments) {return executeDML(connection, sql, arguments);}@Overridepublic Integer insert(Connection connection, String sql) {return executeDML(connection, sql, null);}private int executeBatchDML(Connection connection, String sql, Object[][] arguments){int affectedRow = 0;try {if ((this.connection == null || this.connection.isClosed()) && connection != null) {this.connection = connection;}if ((this.connection == null || this.connection.isClosed()) && connection == null) {throw new SQLException("There is no Database Connectivity");}if (sql == null || sql.trim() == "")return -1;this.preparedStatement = this.connection.prepareStatement(sql);if(arguments!=null){for (int i = 0; i < arguments.length; i++) {fillArguments(this.preparedStatement, arguments[i]);this.preparedStatement.addBatch();}}affectedRow = preparedStatement.executeBatch().length;return affectedRow;} catch (SQLException e) {e.printStackTrace();}return affectedRow;}@Overridepublic Integer insertBatch(String sql,Object arguments[][]){return executeBatchDML(null, sql, arguments);}@Overridepublic Integer insertBatch(String sql) {return executeBatchDML(null,sql,null);}@Overridepublic Integer insertBatch(Connection connection, String sql, Object arguments[][]){return executeBatchDML(connection,sql,arguments);}@Overridepublic Integer insertBatch(Connection connection, String sql) {return executeBatchDML(connection,sql,null);}@Overridepublic Integer update(String sql, Object... arguments) {return executeDML(null, sql, arguments);}@Overridepublic Integer update(String sql) {return executeDML(null, sql, null);}@Overridepublic Integer update(Connection connection, String sql) {return executeDML(connection, sql, null);}@Overridepublic Integer update(Connection connection, String sql, Object... arguments) {return executeDML(connection, sql, arguments);}public void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {try {if (connection != null && !connection.isClosed())connection.close();if (preparedStatement != null && !preparedStatement.isClosed())preparedStatement.close();if (resultSet != null && !resultSet.isClosed())resultSet.close();} catch (SQLException e) {e.printStackTrace();}}public void close(Connection connection) {close(connection, this.preparedStatement, this.resultSet);}@Overridepublic void close() {close(this.connection, this.preparedStatement, this.resultSet);}}

2.3 两个工具类

2.3.1 BeanUtilities

该类中都是静态方法,用作bean和map之间的转换

package com.liurui.utilities;import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;public class BeanUtilities {/*该Map用作缓冲,Key存储JavaBean的全限定类名,Value存储JavaBeanClass中Field对象的List集合*/private final static Map<String, List<Field>> bufferMap=new TreeMap<>();/*使用内省获取JavaBeanClass中所有的Field对象传入参数:JavaBean的Class对象返回参数:装载JavaBeanClass中所有Field对象的List集合*/public static <T> List<Field> getBeanFieldList(Class<T> beanClass){if(bufferMap.containsKey(beanClass.getName()))//若Map的Key中已存储JavaBean的全限定类名{return bufferMap.get(beanClass.getName());//则直接返回已装载JavaBeanClass中所有Field对象的List集合}BeanInfo beanInfo;String property;Method writeMethod;Method readMethod;Field field;List<Field> fieldList = null;try {beanInfo = Introspector.getBeanInfo(beanClass);//运用内省PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();fieldList = new ArrayList<>();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) //遍历Field描述器或属性描述器{property = propertyDescriptor.getName();//获取Field的名字writeMethod = propertyDescriptor.getWriteMethod();//Field对应的写方法readMethod = propertyDescriptor.getReadMethod();//Field对应的读方法if (writeMethod != null && readMethod != null) //排除getClass()方法{field = beanClass.getDeclaredField(property);//由Field的名字取出Field对象field.setAccessible(true);//暴力反射fieldList.add(field);}}} catch (IntrospectionException | NoSuchFieldException ex) {ex.printStackTrace();}bufferMap.put(beanClass.getName(),fieldList);return fieldList;}public static <T> Map<String, Object> beanToMap(T beanObject, Class<T> beanClass){if (beanObject == null || beanClass == null)return null;List<Field> beanFieldList = getBeanFieldList(beanClass);//通过JavaBeanClass获取其所有的Field对象的List集合Map<String, Object> beanMap = null;try{beanMap = new TreeMap<>();for (Field field : beanFieldList)//遍历List{beanMap.put(field.getName(), field.get(beanObject));//取出Field对象的名字和Field在JavaBean对象中对应的值}}catch (IllegalAccessException e){e.printStackTrace();}return beanMap;}public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {if (map == null || beanClass == null)return null;if (map.size() == 0)return null;T beanObject = null;try {beanObject = beanClass.getConstructor().newInstance();//通过反射,创建JavaBean对象List<Field> beanFieldList = getBeanFieldList(beanClass);通过JavaBeanClass获取其所有的Field对象的List集合for (Field field : beanFieldList) //遍历List{field.set(beanObject,map.get(field.getName()));//为JavaBean对象的每一个Field赋值}} catch (InstantiationException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}return beanObject;}
}

2.3.2 ResultSetProcessor

该类中主要用来处理ResultSet,供ResultSetHandler的实现类使用

package com.liurui.utilities;import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class ResultSetProcessor<T> {public List<T> getBeanList(ResultSet resultSet, Class<T> beanClass){ResultSetMetaData resultSetMetaData;List<T> beanList = null;String fieldName;Object value;T beanObject;Field declaredField;try {resultSetMetaData = resultSet.getMetaData();int columnCount = resultSetMetaData.getColumnCount();beanList = new ArrayList<>();while (resultSet.next()) //不论ResultSet对象中有一个还是多个记录,都遍历它,{beanObject = beanClass.getConstructor().newInstance();//创建存储数据库表记录的JavaBean对象for (int i = 0; i < columnCount; i++){fieldName = resultSetMetaData.getColumnLabel(i + 1);value = resultSet.getObject(i + 1);declaredField = beanClass.getDeclaredField(fieldName);declaredField.setAccessible(true);declaredField.set(beanObject, value);//将表中记录的每一列的值存储于JavaBean的属性中}beanList.add(beanObject);//将JavaBean对象装入List集合中}} catch (Exception e) {e.printStackTrace();}//若ResultSet对象有一条记录,那么List对象的size为1,若ResultSet对象有10条记录,那么List对象的size为10//若ResultSet对象没有记录,那么List对象的size为0return beanList;}public T getBean(ResultSet resultSet, Class<T> beanClass){return BeanUtilities.mapToBean(getMap(resultSet,beanClass),beanClass);}public Map<String,Object> getMap(ResultSet resultSet, Class<T> beanClass){List<T> beanList = getBeanList(resultSet, beanClass);if(beanList==null || beanList.size()==0)return null;T beanObject= beanList.get(0);return BeanUtilities.beanToMap(beanObject,beanClass);}public List<Map<String,Object>> getMapList(ResultSet resultSet, Class<T> beanClass){List<T> beanList = getBeanList(resultSet, beanClass);if(beanList==null || beanList.size()==0)return null;List<Map<String,Object>> mapList=new ArrayList<>();Map<String,Object> map;for (T t : beanList) {map = BeanUtilities.beanToMap(t, beanClass);mapList.add(map);}return mapList;}}

四、总结

纸上得来终觉浅,绝知此事要躬行!只有理性的认识,不足以把握事物,我们还得亲身去接触事物,感受事物,反复认识事物,才能越来越接近事物的本质。

自制DbUtils.jar相关推荐

  1. JavaWeb:JDBC之数据库连接池

    JDBC系列阅读 JavaWeb:用JDBC操作数据库 JavaWeb:JDBC之事务 JavaWeb:JDBC之数据库连接池 使用JDBC实现水果超市管理系统 1. 池参数(所有池参数都有默认值) ...

  2. JDBC: Java连接MySQL

    文章目录 一.Java连接MySQL数据库步骤 二.JDBC基本操作:CRUD 2.1 Statement 2.2 ResultSet 之滚动结果集(了解) 2.3 示例: 查询用户 2.4 DBUt ...

  3. 简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)

    实现功能主要技术点: Listener(监听器) 使用Java发送邮件(JavaMail的使用) 代码示例 创建web工程,写一个监听器监听ServletContext对象的创建(创建时机:启动服务器 ...

  4. JAVA+MySQL综合笔记

    Java+MySQL综合运用笔记 一.Java连接使用mysql的5个思路过程 ​ 首先导入JDBC驱动jar包放到lib文件夹里面. 1.加载驱动方法 ①注册驱动:DriverManager.reg ...

  5. BaseDao.java

    修改项目2连接数据库步骤:1.导入相关jar包和配置文件mysql-connection.jardruid.jar+配置文件[注意修改配置文件 账号密码 连接的数据库名]dbutils.jar 2.创 ...

  6. JavaWeb基础知识总结

     [Java面试题]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l ...

  7. 3.JavaWeb基础知识总结

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  8. JDBC核心技术 - 下篇

    文章目录 6.数据库事务 6.1 数据库事务介绍 6.2 JDBC事务处理 6.3 事务的ACID属性 6.3.1 数据库的并发问题 6.3.2 四种隔离级别 6.3.3 在MySql中设置隔离级别 ...

  9. mysql数据库的简单基本操作以及连接数据库步骤以及mysql的安装等等

    第一章 数据库简介 1.1 简介 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合. 数据库管理系统(DataBase Man ...

最新文章

  1. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  2. jQuery UI在Server 2008 IE8下DatePicker问题修复
  3. 《openssl 编程》之大数
  4. php调用数据二行一组,PHPCMS v9指定行数从第2条或第N条开始调用数据的方法
  5. 均分纸牌(洛谷-P1031)
  6. Java 两个复数求和
  7. 使用Docker安装mysql,挂载外部配置和数据
  8. 性能分析工具Linux perf使用经验
  9. Java的GUI学习四(事件监听机制)
  10. 2018-2-13-win10-uwp-如何让WebView标识win10手机
  11. 微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码
  12. 【元胞自动机】基于元胞自动机模拟和改进遗传算法的动态网络分配模型分析matlab仿真
  13. android日记app常用,只是意外 - 用这些 APP 来记录生活,再也不用担心无法坚持写日记 - Android 应用 - 【最美应用】...
  14. P2000 拯救世界(生成函数裸题+NTT高精)
  15. 学习高效编程之 Vim 方法
  16. 云计算技术体系结构由这四点组成
  17. Unity VR开发教程 OpenXR+XR Interaction Toolkit (二) 手部动画
  18. 微信小程序实现图片预览功能
  19. 第二次作业:《国际贸易学》—自由贸易理论
  20. 【大会信息分享】新一代推荐算法核心技术与实践

热门文章

  1. Pycharm安装FLASK出现错误,无法安装
  2. Nmap入门:隐私刺探
  3. 浏览器在线或离线状态检测
  4. Ymir安装问题汇总
  5. 网易暑期实习面经(二面凉)
  6. 聚力赋能·共享共创|吉鼎科技与厦门6大高校“敏捷开发教学研讨会”圆满成功!
  7. Mybatis新增数据后,报ERROR: Field * doesn‘t have a default value
  8. 职场中你是“麦克利兰激励需要理论”中的哪类人
  9. 英特奇android刷机,英特奇E88线刷刷机教程_英特奇E88线刷rom包_系统刷机包
  10. 香港服务器能不能确保数据存储安全?