一、 目的:简化书写
二、分析:
需求不想传递参数,但是还要保证工具类的通用性
解决:配置文件
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;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工具类的全部认识和简单的运用方法,不足之处欢迎大家批评指正!