前面了解了java.sql.Statement接口,现在了解java.sql.PreparedStatement接口
java.sql.PreparedStatement接口:
表示预编译的SQL语句的对象,可以提高性能。
无论是执行DML还是DQL语句,都必须先设置?占位符参数,然后在执行SQL语句前给对应的?设值,最后执行。
-
-
ResultSet
executeQuery()
执行此
PreparedStatement
对象中的SQL查询,并返回查询PreparedStatement
的ResultSet
对象。int
executeUpdate()
执行在该SQL语句
PreparedStatement
对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT
,UPDATE
或DELETE
; 或不返回任何内容的SQL语句,例如DDL语句。
-
获取 PreparedStatement对象:
-
-
PreparedStatement
prepareStatement(String sql)
创建一个
PreparedStatement
对象,用于将参数化的SQL语句发送到数据库。
-
PreparedStatement 与 Statement的区别:
1)PreparedStatement 拼接SQL语句上,操作更简单。
2)PreparedStatement 安全性更高,可防止SQL注入问题。
3)PreparedStatement 性能会更加高效,但是需要取决于数据库服务器是否支持。
MySQL不支持PreparedStatement 的性能优化,Oracle支持
比如:批处理问题,但是MySQL在新的JDBC驱动中,通过设置参数支持批处理操作,所以推荐使用PreparedStatement。
// PreparedStatement接口新增
@Test
public void testIUD() throws Exception {
String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
//1、加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
//3、创建语句对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"赵子龙"); //从1开始
preparedStatement.setInt(2,17);
//4、执行SQL语句
int rows = preparedStatement.executeUpdate();
//5、释放/关闭资源
preparedStatement.close();
connection.close();
System.out.println(rows); //1
}
一、DAO设计
1、什么是DAO思想?
DAO(Data Access Object)是一个数据访问接口,夹在业务逻辑与数据库资源中间。封装了数据的增删改查(CRUD)操作。
2、DAO设计规范
1)DAO组件:DAO接口和DAO实现类
包名规范:域名倒写.模块名称.组件名称
接口和类名规范:
damain包中的类:存储一个个JavaBean。
dao包中的接口:用于表示一个个JavaBean对象的CRUD操作声明。
dao.impl包中的实现类:用于表示一个个DAO接口的实现类,所以必须实现DAO接口。
2)创建DAO对象
面向接口编程:接口 变量 = new 实现类();
二、DAO设计实现与JdbcUtil工具类
在开发中遵循DRY原则:Don't Repeat Yourself(不要编写重复代码)
需求:简单实现 对t_user表的CRUD操作
1)提取db.properties文件
2)使用PreparedStatement接口
3)提取JdbcUtil工具类
直接看代码
1、db.properties
#key-value格式
#连接数据库的四要素信息
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=123456
2、JdbcUtil.java
重点:静态代码块家在注册驱动和加载 db.properties文件(在项目根路径下加载)
Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
package cn.jq.jdbc.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
// JDBC的工具类
public class JdbcUtil {
private static Properties properties = new Properties();
// 当JdbcUtil类的字节码加载在进JVM时,立即执行
static{
try {
//加载和读取db.properties文件
InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
properties.load(inStream);
Class.forName(properties.getProperty("driverClassName"));
}catch (Exception e){
e.printStackTrace();
}
}
// 创建并返回一个Connection对象
public static Connection getConnection(){
try {
return DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),
properties.getProperty("password"));
}catch (Exception e){
e.printStackTrace();
}
return null;
}
//释放关闭资源
public static void close(Connection conn, Statement st, ResultSet rs){
try {
if(rs != null){
rs.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(st != null){
st.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
3、User.java
package cn.jq.jdbc.domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private Long id;
private String username;
private Integer age;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
4、IUserDAO.java
package cn.jq.jdbc.dao;
import cn.jq.jdbc.domain.User;
import java.util.List;
//封装User对象的CRUD操作
public interface IUserDAO {
/**
* 保存操作
* @param user User对象
*/
void save(User user);
/**
* 根据ID删除操作
* @param id
*/
void delete(Long id);
/**
* 根据ID更新修改操作
* @param user User对象
*/
void update(User user);
/**
* 查询指定ID的User对象
* @param id 被查询User对象的主键id值
* @return 如果id存在,返回该User对象,否则,返回null
*/
User get(Long id);
/**
* 查询所有的User对象
* @return 如果结果集为空,返回一个空的List对象
*/
List listAll();
}
5、UserDAOImpl.java
package cn.jq.jdbc.dao.impl;
import cn.jq.jdbc.dao.IUserDAO;
import cn.jq.jdbc.domain.User;
import cn.jq.jdbc.util.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserDAOImpl implements IUserDAO {
@Override
public void save(User user) {
String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
// 创建语句对象
ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername());
ps.setInt(2,user.getAge());
// 执行SQL语句
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, null);
}
}
@Override
public void delete(Long id) {
String sql = "DELETE FROM t_user WHERE id=?";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
// 创建语句对象
ps = conn.prepareStatement(sql);
ps.setLong(1, id);
// 执行SQL语句
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, null);
}
}
@Override
public void update(User user) {
String sql = "UPDATE t_user SET username=?,age=? WHERE id=?";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
// 创建语句对象
ps = conn.prepareStatement(sql);
ps.setString(1, user.getUsername());
ps.setInt(2, user.getAge());
ps.setLong(3, user.getId());
// 执行SQL语句
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, null);
}
}
@Override
public User get(Long id) {
String sql = "SELECT id,username,age FROM t_user WHERE id=?";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
// 创建语句对象
ps = conn.prepareStatement(sql);
ps.setLong(1, id);
// 执行SQL语句
rs = ps.executeQuery();
if(rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setAge(rs.getInt("age"));
return user;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, rs);
}
return null;
}
@Override
public List listAll() {
List list = new ArrayList();
String sql = "SELECT id,username,age FROM t_user";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
// 创建语句对象
ps = conn.prepareStatement(sql);
// 执行SQL语句
rs = ps.executeQuery();
while(rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setAge(rs.getInt("age"));
list.add(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, rs);
}
return list;
}
}
6、UserDAOTest.java
package cn.jq.jdbc.test;
import java.util.List;
import org.junit.Test;
import cn.jq.jdbc.dao.IUserDAO;
import cn.jq.jdbc.dao.impl.UserDAOImpl;
import cn.jq.jdbc.domain.User;
public class UserDAOTest {
private IUserDAO userDAO = new UserDAOImpl();
@Test
public void testSave() {
User user = new User();
user.setUsername("赵云");
user.setAge(17);
userDAO.save(user);
}
@Test
public void testDelete() {
userDAO.delete(3L);
}
@Test
public void testUpdate() {
User user = new User();
user.setId(2L);
user.setUsername("赵子龙");
user.setAge(28);
userDAO.update(user);
}
@Test
public void testGet() {
User user = userDAO.get(2L);
System.out.println(user);
}
@Test
public void testListAll() {
List list = userDAO.listAll();
list.forEach(System.out::println);
}
}
简单重构出JdbcUtil工具类,还可以继续重构
站在前辈的肩膀上,每天进步一点点
ends~