数据访问层
1.持久化
持久化:持久化是将程序中的数据在瞬时状态和持久状态间转换的机制
DAO 模式的优势就在于它实现了两次隔离。
-
隔离了数据访问代码和业务逻辑代码。
-
隔离了不同数据库实现。
一个典型的 DAO 模式主要由以下几部分组成:
-
DAO 接口:把对数据库的所有操作定义成抽象方法,可以提供多种实现。
-
DAO 实现类:针对不同数据库给出 DAO 接口定义方法的具体实现。
-
实体类:用于存放与传输对象数据。
-
数据库连接和关闭工具类:避免了数据库连接和关闭代码的重复使用,方便修改
Dao:数据库操作放在dao层中
dao层的组成:
1、dao层接口
2、dao层接口实现
3、实体类
2 .分层开发
分层开发优势
每一层专注于自己功能的实现,便于提高质量。
便于分工协作,从而提高效率。
便于代码复用。
便于程序扩展。
使用实体类传递数据
-
实体类的属性一般使用 private 修饰。
-
根据业务需要和封装性要求对实体类的属性提供 getter/setter 方法,负责属性的读取和
赋值,一般使用 public 修饰。
-
对实体类提供无参构造方法,根据业务需要提供相应的有参构造方法。
-
实体类最好实现 java.io.Serializable 接口,支持序列化机制,可以将该对象转换成字节序
列而保存在磁盘上或在网络上传输。
-
如果实体类实现了 java.io.Serializable 接口,就应该定义属性 serialVersionUID,解决不同
版本之间的序列化问题。
2.1.1、编写persion实体对象
import java.util.Date;
public class PersonEntity {
private int id; //人物id
private int masterId;//主公id
private String name; // 昵称
private int typeId; //类型id
private int health ;// 生命值
private Date addTime;//购买时间
private String status; //状态
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getMasterId() {
return masterId;
}
public void setMasterId(int masterId) {
this.masterId = masterId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTypeId() {
return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public Date getAddTime() {
return addTime;
}
public void setAddTime(Date addTime) {
this.addTime = addTime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
2.1.2、编写dao接口
import com.dzqc.cn.test01.entit.PersonEntity;
/**
* persion接口
*
*/
public interface PersionDao {
//执行新增
public int save(PersonEntity pes);
}
2.1.3、编写dao接口实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import com.dzqc.cn.test01.dao.PersionDao;
import com.dzqc.cn.test01.entit.PersonEntity;
/**
* dao接口实现
*
*/
public class PersionDaoImpl implements PersionDao{
@Override
public int save(PersonEntity pes) {
int result = 0;
Connection connection = null;
PreparedStatement pst = null;
//1、加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");//固定写法
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2、建立连接
/**
* url: 连接数据库的链接
*/
String url = "jdbc:mysql://localhost:3306/test";
try {
connection = DriverManager.getConnection(url,"root","020323");//链接数据库
//3、数据操作--新增,修改,删除,查询
/**
* 需要一个Statement 接口 ---里面有执行新增修改,删除,查询的方法
* connection 接口产生
*/
//编写sql语句、
String sql = "insert into person (pname,health) values(?,?)";
//得到一个prepareStatement对象
pst= connection.prepareStatement(sql);
pst.setString(1, pes.getName());
pst.setInt(2, pes.getHealth());
//执行sql-- 新增修改删除 --executeUpdate()
result = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
//4、关闭连接
finally {
try {
if(connection!=null) {
connection.close(); //关闭connection接口
}else if(pst!=null) {
pst.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
2.1.4、编写测试类
import com.dzqc.cn.test01.dao.impl.PersionDaoImpl;
import com.dzqc.cn.test01.entit.PersonEntity;
public class TestPersion {
public static void main(String[] args) {
PersonEntity ps = new PersonEntity();
ps.setName("诺克");
ps.setHealth(100);
PersionDaoImpl persion = new PersionDaoImpl();
int result = persion.save(ps);
System.out.println(result);
}
}
2.2、封装数据库连接代码--BaseDao
package com.dzqc.testStu.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
/**
* 连接数据库的封装类
*
*/
public class BaseDao {
public static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
public static String user = "root";//数据库用户名
public static String pwd = "";//自己数据库的密码
public static Connection connection = null;
public static PreparedStatement ps = null;
//获取数据库连接
public static Connection getConnection() {
if (connection == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, pwd);
System.out.println("连接成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
return connection;
}
/**
* (增删改)
*
* @return Connection
*/
public static Integer getPreparedStatement(String sql, List<Object> objects) {
int execute = 0;
try {
ps = connection.prepareStatement(sql);
for (int i = 0; i < objects.size(); i++) {
ps.setObject(i + 1, objects.get(i));
}
execute = ps.executeUpdate();
System.out.println("更新成功");
} catch (SQLException e) {
e.printStackTrace();
}
return execute;
}
//执行返回结果集
public static ResultSet getResultSet(String sql, List<Object> objects) {
ResultSet rs = null;
try {
if (ps == null) {
ps = connection.prepareStatement(sql);
for (int i = 0; i < objects.size(); i++) {
ps.setObject(i + 1, objects.get(i));
}
rs = ps.executeQuery();
}
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
/**
* 关闭数据库连接
*
*/
public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
// 若结果集对象不为空,则关闭
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.3、三层架构
1、dao层包括: 实体类,basedao-工具类
dao--层和数据库打交道的--链接数据库,执行数据操作的步骤
(1)执行新增修改,删除--executeUpdate();
(2)执行查询方法--executeQuery();
package com.dzqc.cn.daoI.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;
import com.dzqc.cn.daoI.PersionDaoI;
import com.dzqc.cn.tools.BaseDao;
public class PersionDaoImpl extends BaseDao implements PersionDaoI{
//执行新增,修改删除方法
@Override
public int executeUpdate(String sql, List<Object> param) {
//连接数据库成功
Connection connection = BaseDao.getconnection();
//执行新增修改方法
int rsult = BaseDao.getPreparedStatement(sql, param);
//关闭连接
BaseDao.closeAll(connection, null, null);
return rsult;
}
//执行查询
@Override
public ResultSet executeQuery(String sql, List<Object> param) {
//连接数据库成功
Connection connection = BaseDao.getconnection();
//执行查询
ResultSet raResultSet = BaseDao.getResultSet(sql, param);
//关闭连接
// BaseDao.closeAll(connection, null, raResultSet);
return raResultSet;
}
}
2、service-- 业务层
import java.sql.ResultSet;
import java.util.List;
public interface PersonServiceI {
//执行新增
public int addPerson(String sql ,List<Object> param);
//修改、
//删除
//执行查询
public ResultSet SelectPerson(String sql ,List<Object> param);
}
import java.sql.ResultSet;
import java.util.List;
import com.dzqc.cn.daoI.impl.PersionDaoImpl;
import com.dzqc.cn.service.PersonServiceI;
/**
* 业务层代码
* 调用到层接口
*
*/
public class PersonServiceImpl implements PersonServiceI{
PersionDaoImpl person = new PersionDaoImpl();
//执行新增
@Override
public int addPerson(String sql, List<Object> param) {
int rsult = person.executeUpdate(sql, param);
return rsult;
}
//执行查询
@Override
public ResultSet SelectPerson(String sql, List<Object> param) {
ResultSet rs = person.executeQuery(sql, param);
return rs;
}
}
3、测试类
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.dzqc.cn.service.impl.PersonServiceImpl;
public class TestPersonAdd {
public static void main(String[] args) {
PersonServiceImpl per = new PersonServiceImpl();
/*
* String sql = "insert into person (masterId,pname,health) VALUES(?,?,?)";
* List<Object> param = new ArrayList<Object>(); param.add(25); param.add("大乔");
* param.add(500); int result = per.addPerson(sql, param);
* System.out.println(result);
*/
String sql ="select * from person where id = ?";
List<Object> plist = new ArrayList<Object>();
plist.add(14);
ResultSet rs = per.SelectPerson(sql, plist);
try {
while(rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("pname"));
System.out.println(rs.getString("health"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}