JDBC(五)-Dao模式
回顾JDBC操作、增删改查数据库操作
数据持久化
将程序中的数据在瞬时状态和持久状态间转换的机制即为数据持久化
通俗理解:JDBC数据没发保存,需要通过数据库、普通文件、或者XML文件来保存数据,完成数据持久化。
DAO模式
传统JDBC代码的缺点
- 可读性差
- 不利于后期的修改和维护
- 不利于代码的复
Dao模式采用面向接口编程,可以降低代码间的耦合性。
- 隔离业务逻辑代码和数据访问代码
- 隔离不同数据库的实现
- 业务逻辑代码调用数据访问访问接口
步骤
- 定义实体类传输数据;
- 将所有增删改查操作抽取成接口;
- 由不同数据库的实现类分别实现接口;
- 将通用的操作(打开、关闭连接、增、删、改、查等)封装到数据库工具类BaseDao的通用方法中。
注:定义实体类User–写数据工具类BaseDao–将所有的增删改查操作抽取成UserDao接口–数据库实现类UserDaoImpl
数据工具类BaseDao
注意事项
数据库工具类BaseDao
- 获取连接的方法、关闭资源的方法、增删改的方法、查的方法
- 增删改executeUpdate()查executeQuery()
- 增删改返回int、查返回ResultSet对象
- 增删改查方法的参数–通过传入sql语句和占位符传入参数的数组作为参数
- 只有查有ResultSet方法,传入参数为(ResultSet rs )增删改在调用关闭资源方法时直接传入null
package cn.kgc.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
//封装jdbc通用操作 1打开数据库连接2封装基本的增删改操作3释放资源
public class BaseDao {
private Connection connection;
private PreparedStatement smt;
public Connection getConnection(){
try {
connection=C3P0Utils.getInstance().getconnection();
} catch (SQLException e) {
e.printStackTrace();
}
return this.connection;
}
//增删改
//通过executeupdate返回修改语句
public int executeUpdate(String sql,Object[]params){
int row =0 ;
try {
Connection connection = this.getConnection();
PreparedStatement smt = connection.prepareStatement(sql);
//判断是否传递参数
if(params!=null){
//设置参数
for (int i = 0; i < params.length; i++) {
smt.setObject(i+1, params[i]);
}
}
row = smt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return row;
}
//释放资源
public void close(ResultSet rs){
try {
if(rs!=null){
rs.close();
}
if(smt!=null){
smt.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//查
public ResultSet executeQuery(String sql,Object[]params){
ResultSet row =null ;
try {
Connection connection = this.getConnection();
PreparedStatement smt = connection.prepareStatement(sql);
//判断是否传递参数
if(params!=null){
//设置参数
for (int i = 0; i < params.length; i++) {
smt.setObject(i+1, params[i]);
}
}
row = smt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return row;
}
}
数据库实现类UserDaoImpl
- 根据需求写
- 传入sql语句
- 传入占位符参数
- 调用BaseDao相关方法
package cn.kgc.housys.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.kgc.housys.dao.UsersDao;
import cn.kgc.housys.entity.Users;
import cn.kgc.housys.utils.BaseDao;
/**
* 数据处理层接口实现
* @author aym
*
*/
public class UsersDaoImpl extends BaseDao implements UsersDao{
@Override
public int add(String name, String password, int gender, String cardId) {
int row =0;
try {
String sql = "insert into users(status,name,password,gender,cardId)values(1,?,?,?,?) ";
Object[]params= {name,password,gender,cardId};
row=super.executeUpdate(sql, params);
} catch (Exception e) {
e.printStackTrace();
}finally{
super.close(null);
}
return row;
}
@Override
public Users findUsersBycardId(String cardId) {
ResultSet rs = null;
Users user =null;
try {
String sql = "select status,name,password,gender,cardId from users where cardId=?";
Object[]params = {cardId};
rs = super.executeQuery(sql, params);
if(rs!=null && rs.next()){
user = new Users();
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setGender(rs.getInt("gender"));
user.setCardId(rs.getString("cardId"));
user.setStatus(rs.getInt("status"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
super.close(rs);
}
return user;
}
}