Java中针对数据库的操作,为了将低级别的数据访问逻辑和高级别的业务处理分离,一般采用数据访问对象(DAO)的设计模式。使用这个模式,我们就不需要修改代码就可以对底层数据库进行更换,也能够让程序逻辑更见清晰,利于扩展。
程序分层
一般我们把程序的结构划分为以下几个层次:
- 表现层(view)
- 服务层(service)
- 领域层(domain)
- 数据访问层(dao)
表现层一般是客户端的展示,服务层为表现层提供功能和服务,领域层是系统领域内的活动,数据访问层数据访问对象通过领域实体对数据库进行操作。
设计时一般从服务层开始,先确定服务层提供的功能和服务,设计接口,再向下设计领域层和数据访问层
具体分析
我们以一个对用户的增删改查过程来进行简单的描述。
定义实体类对象
实体类对象对于我们的数据库中的字段进行映射,在这个我们的用户登录中我们需要定义用户类并对其进行封装。
package bean;
public class User {
private int id;//用户id
private String name;//用户名
private String pwd;//用户密码
//2.get set
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//3.构造方法
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public User() {
}
//4.toString 方法重写
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
数据库连接类
在JDBC连接数据库的步骤中有些步骤在我们访问数据库进行操作时是重复出现的,所以为了提高重用性,我们将这一部分代码段单独封装成工具类,统一为上层DAO提供对于数据库的访问。在本例当中我们使用的数据库MySQL,建立用户表tb_user.
具体实现如下:
import java.sql.*
public class DBUtil{
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/java3?useSSL=true&characterEncoding=utf-8";
private static String user = "root";
private static String password = "123456";
static {
try {
//1.获取驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//2.创建连接
public static Connection get_Conn() throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
//3.关闭资源
public static void close_Conn(ResultSet rs , PreparedStatement prst,Connection conn) throws SQLException {
if (rs != null) {
rs.close();
}
if (prst != null) {
prst.close();
}
if (conn != null) {
conn.close();
}
}
DAO接口和实现类
在DAO层我们定义操作用户数据的接口以及接口的实现类。
接口:
public interface UserDao{
//1.新增
public boolean InsertUser(User user);
//2.删除
public boolean DeleteUser(String userName);
//3.查询
public List<User> SelectUser();
//修改
public boolean UpdateUser(User user);
}
实现类给出部分代码:
public class UserDAOImpl implements UserDAO{
protect Connection conn = null;
protect prepareStatement prst = null;
protect Result rt = null;
//新增
public static boolean InsertUser(User user){
try{
//1.获取连接对象
conn = DBUtil.get_Conn();
//2.编写sql
String sql = "insert into tb_user values(?,?,?)";
//3.获取对象,对sql预处理
prst = conn.prepareStatement(sql);
prst.setInt(1,user.id);
prst.setString(2,user.name);
prst.setString(3,user.pwd);
//4.执行sql
if(prst.executeUpdate() != 0)
return true;
}
catch(Exception e){
e.printStackTrace();
}
finally{
//5.关闭资源
try {
DBUtil.get_CloseConn(rs,prst,conn);
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
//其他实现 略
//基本模式是一样,特别的在查询时需要对结果集进行处理再返回
}
完成DAO层后就可以去实现业务层,用DAO层提供的实现类方法获取数据进行业务处理。
以上就是我们基本的一个DAO设计模式。