一、 目的:简化书写 二、分析:
1,注册驱动2,抽取一个方法获取连接对象需求不想传递参数,但是还要保证工具类的通用性 解决:配置文件
jdbc.properties url =jdbc:mysql://localhost:3306/ username =root password =gcy123456 driver =com.mysql.jdbc.Driver Connection conn = null; Statement state = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","root"); String sql = "select *from stu"; state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { Singer singer = new Singer(); singer.setId(rs.getInt("id")); singer.setUsername(rs.getString("username")); singer.setAge(rs.getInt("age")); singer.setSex(rs.getInt("sex")); singer.setGrade(rs.getInt("grade")); ls.add(singer); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { //判断一下防止空指针异常 if (rs!=null) { rs.close(); } if (state!=null) { state.close(); } if (conn!=null) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }增: 说明:预期目的是为了将(’‘18000001’’,小红,’‘18’’,1,’‘78’’)数据插入到数据库中,运行后结果如图所示。
package com.gcy.javaweb.preparedstatement; import java.io.InputStream; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Properties; import org.junit.Test; public class PreparedStatementTest { @Test //向student表中插入一条数据 public void testInsert(){ Connection con = null; PreparedStatement ps = null; try { //1.读取配置文件的4个基本信息 InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties"); Properties pros = new Properties(); pros.load(is); String user = pros.getProperty("user"); String password = pros.getProperty("password"); String url = pros.getProperty("url"); String driverClass = pros.getProperty("driverClass"); //2.加载驱动 Class.forName(driverClass); //3.获取连接 con = DriverManager.getConnection(url,user,password); System.out.println(con); //4.预编译SQL语句,返回PreparedStatement的实例 String sql = "insert into student(id,username,age,sex,grade)values(?,?,?,?,?)";//?:占位符 ps = con.prepareStatement(sql); //5.填充占位符 ps.setString(1, "18000001"); ps.setString(2, "小红"); ps.setString(3, "18"); ps.setString(4, "1"); ps.setString(5, "78"); //6.执行SQL ps.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //7.资源关闭 try { if(ps != null) ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if(con != null) con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }删: 说明:预期目的是为了将学号为18000000数据从数据库中删除,运行后结果如图所示。
@Test public void testCommonUpdate() { String sql = "DELETE FROM 'student'WHERE id='18000000'"; update(sql,2); } //通用的增删改操作 public void update(String sql,Object ...args){//sql中占位符的个数与可变形参长度相同 Connection con = null; PreparedStatement ps = null; try { //1.获取数据库连接 con = JDBCUtils.getConnection(); //2.预编译SQL语句,返回PraparedStatement的实例 ps = con.prepareStatement(sql); //3.填充占位符 for(int i=0;i<args.length;i++) { ps.setObject(i+1, args[i]);//参数声明:列号从1开始 } //4.执行SQL ps.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //5.资源的关闭 JDBCUtils.closeResource(con,ps); } }改: 说明:预期目的是为了将学号为18000000数据姓名改为小兰,运行后结果如图所示。
//修改student表的一条记录 @Test public void testUpdate() { //1.获取数据库连接 Connection con = null; PreparedStatement ps = null; try { con = JDBCUtils.getConnection(); //2.预编译SQL语句,返回PraparedStatement的实例 String sql = "update student set username =? where id = ?"; ps = con.prepareStatement(sql); //3.填充占位符 ps.setObject(1, "小兰"); ps.setObject(2, "18000000");//第二列 第三行 //4.执行SQL ps.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //5.资源的关闭 JDBCUtils.closeResource(con,ps); } } }查: 说明:预期目的是为了在数据库中查找学号为18036059的学生信息,运行后结果如图所示。
package com.javaweb3.preparedstatement; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; import com.javaweb4.util.JDBCUtils; /** * 针对于student表的查询 * @author gcy * */ public class StudentForQuery { @Test public void testQuery1(){ Connection con = null; PreparedStatement ps = null; //执行并返回结果集 ResultSet resultSet = null; try { con = JDBCUtils.getConnection(); String sql = "select id,username,age,sex,grade from student where id = ?"; ps = con.prepareStatement(sql); ps.setObject(1, "18036059"); resultSet = ps.executeQuery(); //处理结果集 if(resultSet.next()) {//判断结果集的下一条是否有数据,如果有数据返回true,并且指针下移;如果返回false,指针不会下移 //获取当前字条数据的各个字段值 int id = resultSet.getInt(1); String username = resultSet.getString(2); String age = resultSet.getString(3); String sex = resultSet.getString(4); String grade = resultSet.getString(5); // Date birth = resultSet.getDate(4); /*处理结果集 * 方式一: */ System.out.println(id+","+username+","+age+","+sex+","+grade); // //方式二: // Object[] data = new Object[] {id,name,email,birth}; // for(int i=0;i<data.length;i++) { // System.out.print(data[i]+" "); // } } }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //关闭资源 JDBCUtils.closeResource(con, ps, resultSet); } } }三、对以上代码的说明 以上对数据库数据的增删查操作全都是使用PreparedStatement实现的,PreparedStatement是从Statement扩展而来的。不使用Statement是因为它不仅需要拼写sql语句,更严重的是存在SQL注入的问题。PreparedStatement是预编译的,对于批量处理可以大大提高效率。
四、总结 以上就是本人对JDBC和DBUtils工具类的全部认识和简单的运用方法,不足之处欢迎大家批评指正!
