您的位置:首页 > 编程语言 > Java开发

java DAO模式

2018-03-19 19:08 351 查看

1)JDBC封装

将程序中的数据在瞬时状态和持久状态间转换的机制即为:数据持久化
简介:
    1. DAO(DataAccessObjects , 数据存储对象)位于业务逻辑和持久化数据之间,实现对持久化数据的访问。
通俗来讲,就是将数据库操作都封装起来,对外提供相应的接口
    2. 在面向对象设计过程中,有一些“套路”用于解决特定问题,称为模式。

    3. DAO模式提供了访问关系数据库系统所需操作的接口,将数据库访问和业务逻辑分离,对上层提供面向对象
的数据访问接口
DAO模式的优势就在于它实现了两次隔离
1. 隔离了数据访问代码和业务逻辑代码,业务逻辑代码直接调用DAO方法即可,完全感觉不到数据表的存在。
    分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了耦合性,提高了可复用性

2. 隔离了不同数据库实现,采用面向接口编程,如果底层数据库变化,如由MySQL变成Oracle,
    只要增加DAO接口的新实现类即可,原有MySQL实现不用修改。这符合“开--闭”原则,降低了代码的耦合性

    提高了代码扩展性和系统的可移植性。

DAO模式主要由以下部分组成
    DAO接口:把对数据库的所有操作定义成抽象方法,可以提供多种实现

    DAO实现类:针对不同数据库给出DAO接口定义方法的具体实现。

    实体类:用于存放与传输对象数据

    数据库连接和关闭工具类:避免了数据库连接和关闭代码的重复使用,方便修改/。

代码演示DAO模式封装



连接MySQL数据库工具类:package day01_entity_dao;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class BaseDao {
//数据库加载驱动
private static String driver;
//数据库连接字符串
private static String url;
//数据库用户名
private static String user;
//数据库密码
private static String pwd;
static
{
info();
}
/**
* 从配置文件中读取链接参数
*/
public static void info()
{
Properties ties=new Properties();
String config="database.properties";
//加载配置文件到输入流
InputStream is=BaseDao.class.getClassLoader().getResourceAsStream(config);
//从输入流中读取属性列表
try {
ties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//根据指定的键获取对应的值
driver=ties.getProperty("driver");
url=ties.getProperty("url");
user=ties.getProperty("user");
pwd=ties.getProperty("password");
}
//声明连接对象
private Connection con=null;
/**
* 打开数据库连接
* @return
*/
public Connection getConnection()
{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con=DriverManager.getConnection(url,user,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭连接对象
*/
public void closeAll(Connection con,PreparedStatement ment,ResultSet set)
{
if(set!=null)
{
try {
set.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ment!=null)
{
try {
ment.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null)
{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 增删改通用方法
*/
public int executeUpdate(String sql,Object[] obj)
{
int nums=0;//影响行数
con=this.getConnection();//连接数据库
PreparedStatement stmt=null;//向数据库发送sql语句
try {
stmt=con.prepareStatement(sql);
//为参数赋值
if(obj!=null)
{
for (int i = 0; i < obj.length; i++) {
stmt.setObject((i+1), obj[i]);
}
}
//执行sql语句
nums=stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally
{
//关闭连接
this.closeAll(con, stmt, null);
}
return nums;
}
/**
* 读取数据
*/
public ResultSet set(String sql,Object[] obj)
{
ResultSet result=null;//定义储存容器
PreparedStatement stmt=null;//向数据库发送sql语句
con=this.getConnection();//连接数据库
try {
stmt=con.prepareStatement(sql);
if(obj!=null)
{
for (int i = 0; i < obj.length; i++) {
stmt.setObject((i+1), obj[i]);
}
}
result=stmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}finally
{
this.closeAll(con, stmt, result);
}
return result;
}
}


Reader实体类:package day01_entity;
public class Reader {
private int number;// 编号
private String name;// 姓名
private int num;// 可借数量
private String rAddRess;// 地址
/**
* @return the number
*/
public int getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(int number) {
this.number = number;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the num
*/
public int getNum() {
return num;
}
/**
* @param num the num to set
*/
public void setNum(int num) {
this.num = num;
}
/**
* @return the rAddRess
*/
public String getrAddRess() {
return rAddRess;
}
/**
* @param rAddRess the rAddRess to set
*/
public void setrAddRess(String rAddRess) {
this.rAddRess = rAddRess;
}
}
ReaderDAO接口类:package day01_entity_dao;
import java.util.List;
import day01_entity.Reader;
public interface ReaderDAO {
int save(Reader der);
int del(Reader der);
int update(Reader der);
Reader reader (String name);
List<Reader> list(String name);
List<Reader> type(String type);
}ReaderDaoImpl 具体实现类:package day01_entity_dao_Impl;
import java.util.List;
import day01_entity.Reader;
import day01_entity_dao.BaseDao;
import day01_entity_dao.ReaderDAO;
public class ReaderDaoImpl extends BaseDao implements ReaderDAO {
@Override
public int save(Reader der) {
return 0;
}
@Override
public int del(Reader der) {

return 0;
}
@Override
public int update(Reader der) {
String sql="UPDATE `reader` SET `rName`=1000 WHERE `Rid`=?";
Object[] obj={der.getNumber()};
int nt=super.executeUpdate(sql, obj);
return nt;
}
@Override
public Reader reader(String name) {

return null;
}
@Override
public List<Reader> list(String name) {

return null;
}
@Override
public List<Reader> type(String type) {

return null;
}
}

测试类:

package test_package;
import day01_entity.Reader;
import day01_entity_dao.ReaderDAO;
import day01_entity_dao_Impl.ReaderDaoImpl;
public class Text01 {
public static void main(String[] args) {
ReaderDAO dao=new ReaderDaoImpl();
Reader reader=new Reader();
reader.setNumber(9);
int num=dao.update(reader);
if(num>0)
{
System.out.println("更新成功");
}else
{
System.out.println("更新失败");
}
}
}

 2)properties配置文件

java中的配置文件常为properties文件
    后缀为 . properties

    格式是 “键=值”格式

    使用“#”来注释

Properties 类读取配置文件
    加载配置文件到输入流

    从输入流中读取属性列表

    根据指定的键获取对应的值

    注意:要把他写在静态代码块中。先进行加载

    


java中提供了Properties类来读取配置文件




properties配置文件:




文件读取代码演示:        //数据库加载驱动
private static String driver;
//数据库连接字符串
private static String url;
//数据库用户名
private static String user;
//数据库密码
private static String pwd;

static
{
inf
9a60
o();
}
/**
* 从配置文件中读取链接参数
*/
public static void info()
{
Properties ties=new Properties();
String config="database.properties";
//加载配置文件到输入流
InputStream is=BaseDao.class.getClassLoader().getResourceAsStream(config);
//从输入流中读取属性列表
try {
ties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//根据指定的键获取对应的值
driver=ties.getProperty("driver");
url=ties.getProperty("url");
user=ties.getProperty("user");
pwd=ties.getProperty("password");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: