目录
- 什么是DAO?
- DAO模式组成
- DatabaseConnection
- VO
- DAO
- Impl
- Factory
- 示例
- cn.wzl.dao.ConnectionManager:连接数据库(MySql)
- cn.wzl.vo.Person:Person值类
- cn.wzl.dao.IPersonDAO:实现对Person表的操作接口
- cn.wzl.dao.impl.PersonDAOImpl:Person表操作实例化
- cn.wzl.factory.DAOFactory:工厂类
- 前端调用代码片段
- 小结
什么是DAO?
DAO(Data Access Object)数据访问接口。废话不多说(官方定义什么的写了也没人看?),其实就是一种数据设计范化模式,打个比方,我们写的第一个java程序可能把主函数,方法,变量定义等全部写在一个.java文件中,在后续的规范学习中才拆分成不同的包,类等,测试类主函数相应调用即可。同样的,所有JDBC代码都写在JSP页面之中,维护困难,JSP应该只关注于数据的显示,而不关心数据从哪里来,或向哪里存储。 JavaEE的组件层次: 客户端–>表示层–>业务层–>数据层–>数据库 DAO属于JavaEE数据层的操作。即:在DAO中封装了一个数据库中的表在一个项目中所应具有的全部操作。
DAO模式组成
- DatabaseConnection 数据库连接:专门负责数据库的打开与关闭操作的类 命名规范:xxx.dbc.ConnectionManager
- VO 值类:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录 命名规范:xxx.vo.Xxx(与数据库的表名一致)
- DAO DAO接口:主要定义操作的接口,定义一系列数据库的原子操作,如增加、修改、删除、按ID查询等 命名规范:xxx.dao.XxxDAO
- Impl DAO接口真实实现类:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭 命名规范:xxx.dao.impl.XxxDAOImpl
- Factory 工厂类:通过工厂类取得一个DAO的实例化对象,有了工厂类,前端代码不必知道具体的子类名字,只需要统一使用实例的各个操作 命名规范:xxx.factory.XxxDAOFactory
示例
cn.wzl.dao.ConnectionManager:连接数据库(MySql)
代码语言:javascript复制package cn.wzl.dbc;
import java.sql.*;
public class ConnectionManager {
private static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/test? useUnicode=true & characterEncoding=utf-8 & rewriteBatchedStatements=true & useSSL=false & serverTimezone=UTC & allowPublicKeyRetrieval=true";
private static final String DATABASE_USRE = "root";
private static final String DATABASE_PASSWORD = "******";//密码
/** 返回连接 */
public static Connection getConnection() {
Connection dbConnection = null;
try {
Class.forName(DRIVER_CLASS);
dbConnection = DriverManager.getConnection(DATABASE_URL,
DATABASE_USRE, DATABASE_PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return dbConnection;
}
/** 关闭连接*/
public static void closeConnection(Connection dbConnection) {
try {
if (dbConnection != null && (!dbConnection.isClosed())) {
dbConnection.close();
}
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
/**关闭结果集*/
public static void closeResultSet(ResultSet res) {
try {
if (res != null) {
res.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/** 关闭语句*/
public static void closeStatement(PreparedStatement pStatement) {
try {
if (pStatement != null) {
pStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void closeStatement(Statement statement) {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
cn.wzl.vo.Person:Person值类
代码语言:javascript复制package cn.wzl.vo;
public class Person {
private String id;
private String name;
private String password;
public Person(String id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person [id=" id ", name=" name ", password=" password "]";
}
}
cn.wzl.dao.IPersonDAO:实现对Person表的操作接口
代码语言:javascript复制package cn.wzl.dao;
import java.util.List;
import cn.wzl.vo.Person;
public interface IPersonDAO {
//插入
public boolean doInsert(Person per) throws Exception;
//修改
public boolean doUpdate(Person per)throws Exception;
//获取所有用户
public List<Person> doQuery() throws Exception;
//通过id查找
public Person doQueryById(String id) throws Exception;
}
cn.wzl.dao.impl.PersonDAOImpl:Person表操作实例化
代码语言:javascript复制package cn.wzl.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import cn.wzl.dao.IPersonDAO;
import cn.wzl.dbc.ConnectionManager;
import cn.wzl.vo.Person;
public class PersonDAOImpl implements IPersonDAO {
//插入用户记录
@Override
public boolean doInsert(Person per) throws Exception {
boolean flag=false;
String sql="insert into person(id,name,password) values(?,?,?)";
Connection conn=null;
PreparedStatement pstmt=null;
try{
conn=ConnectionManager.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,per.getId());
pstmt.setString(2,per.getName());
pstmt.setString(3,per.getPassword());
if(pstmt.executeUpdate()>0){
flag=true;
}
}catch(Exception e){
System.out.println(e);
}finally{
ConnectionManager.closeStatement(pstmt);
ConnectionManager.closeConnection(conn);
}
return flag;
}
//修改用户记录
@Override
public boolean doUpdate(Person per) throws Exception {
boolean flag=false;
String sql="update person set name=?,password=? where id=?";
Connection conn=null;
PreparedStatement pstmt=null;
try{
conn=ConnectionManager.getConnection();
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,per.getName());
pstmt.setString(2,per.getPassword());
pstmt.setString(3,per.getId());
if(pstmt.executeUpdate()>0){
flag=true;
}
}catch(Exception e){
System.out.println(e);
}finally{
ConnectionManager.closeStatement(pstmt);
ConnectionManager.closeConnection(conn);
}
return flag;
}
//查询所有用户
@Override
public List<Person> doQuery() throws Exception{
List<Person> person = new ArrayList<Person>();
Connection con = null;
PreparedStatement pstms = null;
ResultSet res = null;
try {
con = ConnectionManager.getConnection();// 创建连接
String sql = "select * from person";
pstms = con.prepareStatement(sql);// 创建预处理语句总管
res = pstms.executeQuery();// 语句总管执行查询
while (res.next()) {
String id = res.getString(1);
String name = res.getString(2);
String password = res.getString(3);
Person per = new Person(id,name,password);
person.add(per);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionManager.closeResultSet(res);// 5.关闭结果集 对象、语句总管、连接
ConnectionManager.closeStatement(pstms);
ConnectionManager.closeConnection(con);
}
return person;
}
@Override
public Person doQueryById(String id) throws Exception{
Person person = null;
Connection con = null;
PreparedStatement pstms = null;
ResultSet res = null;
try {
con = ConnectionManager.getConnection(); // 创建连接
String sql = "select * from person where id=?";
pstms = con.prepareStatement(sql); // 创建预处理语句总管
pstms.setString(1, id);
res = pstms.executeQuery(); // 语句总管执行SQL语句
if (res.next()) {
String name = res.getString(2);
String password = res.getString(3);
person = new Person(id,name,password);
}
} catch (SQLException sqlE) {
sqlE.printStackTrace();
} finally {
ConnectionManager.closeResultSet(res);// 关闭结果集 对象、语句总管、连接
ConnectionManager.closeStatement(pstms);
ConnectionManager.closeConnection(con);
}
return person;
}
}
cn.wzl.factory.DAOFactory:工厂类
代码语言:javascript复制package cn.wzl.factory;
import cn.wzl.dao.IMessageDAO;
import cn.wzl.dao.IPersonDAO;
import cn.wzl.dao.IRevertDAO;
import cn.wzl.dao.impl.MessageDAOImpl;
import cn.wzl.dao.impl.PersonDAOImpl;
import cn.wzl.dao.impl.RevertDAOImpl;
public class DAOFactory {
public static IPersonDAO getPersonDAOInstance(){
return new PersonDAOImpl();
}
public static IMessageDAO getMessageDAOInstance(){
return new MessageDAOImpl();
}
public static IRevertDAO getRevertDAOInstance(){
return new RevertDAOImpl();
}
}
前端调用代码片段
代码语言:javascript复制<%
request.setCharacterEncoding("utf-8");
String id =request.getParameter("id");
String password =request.getParameter("password");
Person person =DAOFactory.getPersonDAOInstance().doQueryById(id);
%>
小结
优点:前台显示与后台逻辑操作分离 ,JSP页面的功能就是将DAO返回的结果进行输出。
原创不易,请勿转载(
本不富裕的访问量雪上加霜) 博主首页:https://blog.csdn.net/qq_45034708