34 jdbc工具封装
java是一门面向对象的语言,对于重复的代码,我们能封装就封装,在32节中,我们写了student表的的dao层,能用,但有很多重复代码,比如加载驱动,获取Connection对象等,我们可以将它们封装到一个类中。
同样地,我们创建一个Util包用来存放封装的工具,创建一个JdbcUtil类用来封装我们的jdbc相关的重复代码。
properties配置文件
我们将加载jdbc的关键数据:driver 驱动器类全地址,url,username数据库登录用户名,password对应密码 封装在一个文件中,起名db.properties 放在src目录下。
注意:文件中的内容应为:属性=属性名形式,多个属性直接回车换行隔开,不适用引号,不留空格。如下:
JdbcUtil类设计思路
- 声明配置文件对应的四个变量
- 静态块加载 读取db.properties文件给上面四个变量赋值,加载驱动面 创建下满几个方法:
- getConnection() 获取Connection对象
- getStatement() 获取Statement对象,只用在查询上(如果用在增删改无法避免sql注入)
- getPreparedStatement() 获取PreparedStatement对象,用在增删改上
- executeDML() 执行SQL语句的方法
- closeAll() 关闭资源的方法
需要注意的知识点
获取db.properties文件中的属性
- 使用Properties类配合配置文件的输入流获取属性
- 动态获取文件流:当前类名.class.getResourceAsStream(相对地址);
- 获取属性:Properties对象.getProperty(属性名)
完整代码
package com.xiaohei.tools; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JdbcUtil { //声明jdbc参数 private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static { //创建properties对象获取属性问价的内容 Properties p = new Properties(); //获取属性文件的读取流对象(动态获取资源) InputStream is = JdbcUtil.class.getResourceAsStream("/db.propreties"); try { //加载配置文件 p.load(is); driver = p.getProperty("driver"); url = p.getProperty("url"); username = p.getProperty("username"); password = p.getProperty("password"); } catch (IOException e) { e.printStackTrace(); } //加载驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取conn public static Connection getConnection() { Connection conn =null; try { conn = DriverManager.getConnection(url,username,password); conn.setAutoCommit(false); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } //获取statement public static Statement getStatement(Connection conn) { Statement stmt = null; try { stmt = conn.createStatement(); return stmt; } catch (SQLException e) { e.printStackTrace(); } return stmt; } //获取PreparedStatement public static PreparedStatement getPreparedStatement(Connection conn,String sql) { PreparedStatement stmt = null; try { stmt = conn.prepareStatement(sql); return stmt; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //DML方法 public static int executeDML(String sql,Object...objs) { //创建连接对象 Connection conn = getConnection(); //创建ps对象 PreparedStatement ps = JdbcUtil.getPreparedStatement(conn,sql); //给占位符赋值 for(int i=0;i<objs.length;i++) { try { ps.setObject(i+1, objs[i]); } catch (SQLException e) { e.printStackTrace(); } } //执行SQL命令 int i = -1; try { i = ps.executeUpdate(); //手动提交 conn.commit(); } catch (SQLException e) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } //关闭资源 JdbcUtil.closeAll(null,ps,conn); //返回结果 return i; } public static void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) { try { if(rs!=null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
StudentDaoImpl的修改
代码:
package com.xiaohei.daoimpl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import com.xiaohei.pojo.Student; import com.xiaohei.tools.JdbcUtil; public class StudentDaoImpl { private ArrayList<Student> list; public StudentDaoImpl() { } /** * 增加一个学生通过姓名,年龄和金钱 * @param sname 学生姓名,sage 学生年龄,money 钱 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数 */ public int insertStu(String sname,int sage,double money) { //sql语句 String sql = "insert into student values(stu_seq.nextval,?,?,?)"; //执行SQL语句 int i = JdbcUtil.executeDML(sql, sname,sage,money); //处理结果 return i; } /** * 删除学生按指定的学号 * @param sno 学生学号 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数 */ public int deleteStu(int sno) { //sql String sql = "delete from student where sno =?"; //执行SQL int i = JdbcUtil.executeDML(sql, sno); //处理结果 return i; } /** * update操作:修改学生姓名,年龄和金钱 通过 学生sno * @param sno 学生学号 * @return */ public int updateStu(int sno,String sname,int sage,double money) { //sql语句 String sql = "update student set sname=?,sage=?,money=? where sno=?"; int i = JdbcUtil.executeDML(sql,sname,sage,money,sno); //处理结果 return i; } /** * 查询 * @return 返回一个ArrayList<Student>对象 */ public ArrayList<Student> queryStu(){ list = new ArrayList<>(); Connection conn = null; try { conn = JdbcUtil.getConnection(); //SQL语句 String sql = "select * from student order by sno"; //stmt Statement stmt = JdbcUtil.getStatement(conn); ResultSet set = stmt.executeQuery(sql); //处理结果 while(set.next()) { Student s = new Student(); s.setSno(set.getInt("sno")); s.setSage(set.getInt("sage")); s.setSname(set.getString("sname")); s.setMoney(set.getDouble("money")); list.add(s); } return list; }catch(SQLException e) { e.printStackTrace(); } return list; } }