6 MySQL数据库--数据库连接池( 六 )


2 JDBC框架 2.1 为什么要有JDBC框架
dao层的重复代码
定义必要的信息、获取数据库的连接、释放资源都是重复的代码!
而我们最终的核心功能仅仅只是执行一条sql语句而已啊!
所以我们可以抽取出一个JDBC模板类,来封装一些方法(、query),专门帮我们执行增删改查的sql语句!
将之前那些重复的操作,都抽取到模板类中的方法里 。就能大大简化我们的使用步骤!
2.2 自定义JDBC框架 (1)数据库的源信息(2)练习
【6MySQL数据库--数据库连接池】/*学生实体类*/public class Student {private Integer sid;private String name;private Integer age;private Date birthday;public Student() {}public Student(Integer sid, String name, Integer age, Date birthday) {this.sid = sid;this.name = name;this.age = age;this.birthday = birthday;}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}}ResultSetHandler接口/*用于处理结果集的接口*/public interface ResultSetHandler {//处理结果集的抽象方法 。 T handler(ResultSet rs);}BeanHandler实现类/*实现类1:用于完成将查询出来的一条记录,封装到Student对象中*/public class BeanHandler implements ResultSetHandler {//1.声明对象类型变量private Class beanClass;//2.有参构造对变量赋值public BeanHandler(Class beanClass) {this.beanClass = beanClass;}/*将ResultSet结果集中的数据封装到beanClass类型对象中*/@Overridepublic T handler(ResultSet rs) {//3.声明对象T bean = null;try{//4.创建传递参数的对象bean = beanClass.newInstance();//5.判断是否有结果集if(rs.next()) {//6.得到所有的列名//6.1先得到结果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//6.2还要得到有多少列int columnCount = rsmd.getColumnCount();//6.3遍历列数for(int i = 1; i <= columnCount; i++) {//6.4得到每列的列名String columnName = rsmd.getColumnName(i);//6.5通过列名获取数据Object columnValue = http://www.kingceram.com/post/rs.getObject(columnName);//6.6列名其实就是对象中成员变量的名称 。于是就可以使用列名得到对象中属性的描述器(get和set方法)PropertyDescriptor pd = new PropertyDescriptor(columnName.toLowerCase(),beanClass);//6.7获取set方法Method writeMethod = pd.getWriteMethod();//6.8执行set方法,给成员变量赋值writeMethod.invoke(bean,columnValue);}}} catch (Exception e) {e.printStackTrace();}//7.将对象返回return bean;}}BeanListHandler实现类/*实现类2:用于将结果集封装到集合中*/public class BeanListHandler implements ResultSetHandler {//1.声明对象变量private Class beanClass;//2.有参构造为变量赋值public BeanListHandler(Class beanClass) {this.beanClass = beanClass;}@Overridepublic List handler(ResultSet rs) {//3.创建集合对象List list = new ArrayList<>();try{//4.遍历结果集对象while(rs.next()) {//5.创建传递参数的对象T bean = beanClass.newInstance();//6.得到所有的列名//6.1先得到结果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//6.2还要得到有多少列int columnCount = rsmd.getColumnCount();//6.3遍历列数for(int i = 1; i <= columnCount; i++) {//6.4得到每列的列名String columnName = rsmd.getColumnName(i);//6.5通过列名获取数据Object columnValue = http://www.kingceram.com/post/rs.getObject(columnName);//6.6列名其实就是对象中成员变量的名称 。于是就可以使用列名得到对象中属性的描述器(get和set方法)PropertyDescriptor pd = new PropertyDescriptor(columnName.toLowerCase(),beanClass);//6.7获取set方法Method writeMethod = pd.getWriteMethod();//6.8执行set方法,给成员变量赋值writeMethod.invoke(bean,columnValue);}//7.将对象保存到集合中list.add(bean);}} catch (Exception e) {e.printStackTrace();}//8.返回结果return list;}}ScalarHandler实现类/*实现类3:用于返回一个聚合函数的查询结果*/public class ScalarHandler implements ResultSetHandler {@Overridepublic Long handler(ResultSet rs) {//1.声明一个变量Long value = null;try{//2.判断是否有结果if(rs.next()) {//3.获取结果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//4.获取第一列的列名String columnName = rsmd.getColumnName(1);//5.根据列名获取值value = rs.getLong(columnName);}} catch(Exception e) {e.printStackTrace();}//6.将结果返回return value;}}JDBCTemplate类public class JDBCTemplate {private DataSource dataSource;private Connection con;private PreparedStatement pst;private ResultSet rs;public JDBCTemplate(DataSource dataSource) {this.dataSource = dataSource;}/*专用于执行聚合函数sql语句的方法*/public Long queryForScalar(String sql, ResultSetHandler