什么是 DAO ?
- Data Access Object(数据存取对象)
- 位于业务逻辑和持久化数据之间
- 实现对持久化数据的访问
DAO起着转换器的作用,将数据在实体类和数据库记录之间进行转换。
-----------------------------------------------------
DAO模式的组成部分
- DAO接口
- DAO实现类
- 实体类
- 数据库连接和关闭工具类
优势:
- 隔离了数据访问代码和业务逻辑代码
- 隔离了不同数据库实现
封装JDBC
/**
* 数据库工具类
*/
public class BaseDao {
Connection conn = null;
PreparedStatement ps = null;
//获取Conn对象 打开数据库链接
public boolean getConn() {
boolean bool = false;//默认 false 未打开数据库
try {
//加载驱动 方言
Class.forName("com.mysql.jdbc.Driver");
//准备数据库连接路径
String url = "jdbc:mysql://127.0.0.1:3306/xxshop?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
//用户名与密码
String username = "root";
String userpwd = "root";
//根据路径,用户名,密码 使用DriverManager获取数据库connection连接
conn = DriverManager.getConnection(
url,username,userpwd);
bool = true;//已经打开
} catch (Exception e) {
e.printStackTrace();
bool = false ;//已经打开
}
return bool;
}
/**
* 添加,修改,删除数据
* @param sql
* @param objs
* @return
*/
public int executeUpdate(String sql,Object objs[])
{
int res = 0;//初始化执行结果 失败0
try {
if(getConn())//打开数据库链接
{
ps = conn.prepareStatement(sql);
if(objs!=null){
for (int i = 0; i < objs.length; i++) {
ps.setObject((i+1),objs[i]);
}
}
res = ps.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource();//关闭数据源
}
return res;
}
/**
* 查询
* @param sql
* @param objs
* @return
*/
public ResultSet executeSQL(String sql,Object objs[]){
ResultSet rs = null;
try {
if(getConn())//打开数据库链接
{
ps = conn.prepareStatement(sql);
//判断是否有参数
if (objs != null) {
//循环封装参数
for (int i = 0; i < objs.length; i++) {
ps.setObject((i + 1), objs[i]);
}
}
rs = ps.executeQuery();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource();//释放资源
}
return rs;
}
//关闭资源
public void closeResource(){
try {
if(ps!=null)
{
ps.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
调用工具类
实现类 继承 工具类(BaseDao)
查询:ResultSet rs = this.executeSQL(SQL语句,Object数组<参数数组>)
增,删,改: int i = this.executeUpdate(SQL语句,Object数组<参数数组>)
配置文件连接信息
使用配置文件存储连接信息(properties文件)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/xxshop?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.pwd=root
Properties properties = new Properties();
//读取properties文件 BaseDao为当前所在类
InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties");
//将文件信息转换成properties对象
properties.load(is);
//通过getProperty(KEY)方法获取属性值
String driver = properties.getProperty("jdbc.driver");
写信息
package com.hz.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.hz.dao.BaseDao;
//读取数据库属性文件,获取数据库连接信息
//如何让用户只能创建一个ConfigManger----单例模式:(1)构造方法私有(2)程序提供给别人唯一对象
//ConfigManager.getInstance().getString("jdbc.Driver")
public class ConfigManager {
private static ConfigManager configManager;
private Properties properties;
private ConfigManager() {
String configFile = "database.properties";
// 读取properties文件 BaseDao为当前所在类
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream("database.properties");
properties = new Properties();
try {
// 将文件信息转换成properties对象
properties.load(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//提供给别人一个唯一的ConfigManger对象
//通过 类名. 调用
public static ConfigManager getInstance() {
if (configManager == null) {
configManager = new ConfigManager();
}
return configManager;
}
// 通过getProperty(KEY)方法获取属性值
public String getString(String key) {
return properties.getProperty(key);
}
}
在整个程序运行期间,有且仅有一个实例。若违背这一点,所设计的类就不是单例类。
连接池与数据源
使用JDBC访问数据库时,频繁的连接导致系统的安全性和稳定性差,通过数据源和连接池来解决问题。
连接池
连接池是由容器提供的,用来管理池中连接对象。
数据源
DataSource
- javax.sql.DataSource 接口负责建立与数据库的连接
- 由Tomcat提供,将连接保存在连接池中
- 数据源用来连接数据库,获得连接(Connection)对象
- 连接池用来管理连接( Connection )对象
- 在程序中使用JNDI获取数据源
使用JavaBean封装数据
JavaBean就是一个Java类,作用是封装业务逻辑,封装数据。
应用:
- dao包中的接口以及类主要负责和数据操作相关的事情
- service包中的接口和类对dao的方法进行封装和调用,主要负责和业务逻辑相关的操作。
分层的组成及作用:文章来源:https://www.toymoban.com/news/detail-656883.html
- 表示层:与用户交互、展示数据
- 业务逻辑层:控制业务流程及事务
- 数据访问层:实现数据库操作
分层优点:文章来源地址https://www.toymoban.com/news/detail-656883.html
- 直接清晰,分工明确
- 利于维护扩展
- 利于代码重用
到了这里,关于JDBC封装与设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!