本文共 4110 字,大约阅读时间需要 13 分钟。
把驱动注册和释放连接资源封装了一个工具类
package com.yidongxueyuan.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/* * 对JDBC 进行封装: */public class JdbcUtils2 { //准备数据库的四大参数: private static final String driver ="com.mysql.jdbc.Driver"; private static final String url ="jdbc:mysql://localhost:3306/jdbc01"; private static final String username ="root"; private static final String password ="root"; /* * 驱动: 只需要注册一次就OK * */ static{ try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /* * 1:创建工具类: 直接获得一个连接对象: */ public static Connection getConnection (){ try { Connection connection = DriverManager.getConnection(url, username, password); return connection; } catch (SQLException e) { throw new RuntimeException(e); } } /* * 定义一个方法: 释放资源: 直接将rs stmt conn 全部释放: */ public static void release(ResultSet rs ,Statement stmt , Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs=null; } if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt=null; } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn=null; } } }
/结果集的封装: 将rs 封装到javaBean 当中:
package com.yidongxueyuan.dbassist;import java.lang.reflect.Field;import java.sql.ResultSet;import java.sql.ResultSetMetaData;//提供一种结果处理器: 将rs 封装到javaBean 当中: class BeanHandler implements ResultSetHandler { //准备一个目的: private Class clazz; //目标对象: public BeanHandler(Class clazz){ this.clazz = clazz; } @Override public Object handler(ResultSet rs) { /* * rs 封装了结果集: * rs当中的结果集设定到javaBean当中 * * rs ----> 元数据对象: 列的名称: 列的个数: * id name money ---->属性名称: ---->反射:Field * Field.set(); */ try { while(rs.next()){ //目标对象: Object bean = clazz.newInstance();//无参数构造器: //获得是: 结果集的元数据: ResultSetMetaData rsmd = rs.getMetaData(); //列的个数: int count = rsmd.getColumnCount(); for(int i = 0 ; i< count ; i++){ //字段的名称: 字段的名称和列的名称对应: String fieldname = rsmd.getColumnName(i+1); //设置值: Object fieldValue = rs.getObject(fieldname); //反射: Field field = clazz.getDeclaredField(fieldname); //私有的不能直接访问; field.setAccessible(true); field.set(bean, fieldValue); } return bean; } } catch (Exception e) { throw new RuntimeException(e); } return null; }}
读和写的封装:
package com.yidongxueyuan.dbassist;import java.sql.Connection;import java.sql.ParameterMetaData;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import com.yidongxueyuan.utils.C3P0Util;import com.yidongxueyuan.utils.DBCPUtil;/* * 设定一个框架: * 能够完成数据库的读和写的操作: * select * from tableName where id=? and username=? * 定义读的方法; query(String sql, Object[] params ); * * 写操作: * delete from tableName where id=? * update tableName set name=? , password=? where id=? * insert into tableName values(?,?,?); * 定义写的方法: update(String sql , Object [] params ); * * 总结: 删除, 修改, 插入, 都属于数据库的写操作: 只有sql 语句不同, * 通过动态的传递sql 语句, sql 语句里面的占位符的个数不确定, 所以 * 可变参数的数据来传递。 * */public class DBAssist { //写的操作; public void update(String sql, Object ... params) throws Exception{ //获得链接对象; Connection connection = C3P0Util.getConnection(); //stmt容器: PreparedStatement pstmt = connection.prepareStatement(sql); //设置sql 语句当中的占位符号: //参数的元数据对象: ParameterMetaData pmd = pstmt.getParameterMetaData(); //获得?的个数: int count = pmd.getParameterCount(); //循环遍历每一个?, 给每一个?赋值, 值来源于可变参数的数组: if(count > 0){ // 增强健壮性; if(params == null){ throw new RuntimeException("必须传递参数的值"); } if(params.length != count){ throw new RuntimeException("传递的参数个数不正确"); } for(int i =0 ;i0){ // 增强健壮性; if(params == null){ throw new RuntimeException("必须传递参数的值"); } if(params.length != count){ throw new RuntimeException("传递的参数个数不正确"); } for(int i =0 ;i
转载地址:http://twqen.baihongyu.com/