使用Java实现数据库编程-Lesson8-DAO模式

JDBC的封装

 

什么是DAO  

 

1.Data Access Object(数据存取对象)

 

2.位于业务逻辑和持久化数据之间

 

3.实现对持久化数据的访问

 

 

采用面向接口编程,可以降低代码间的耦合性、提高代码的可扩展性和可维护性。

 

注:尽量以对象为单位,而不是以属性为单位来传递参数,给调用者提供面向对象的接口。

 

DAOData Access Object数据存取对象)位于业务逻辑和持久化数据之间,实现对持久化数据的访问,通俗来讲,就是将数据库操作都封装起来,对外提供相应的接口。

在面向对象设计过程中,有一些“套路”用于解决特定问题,称为模式,DAO模式提供了访问关系型数据库所需操作的接口,将数据访问和业务逻辑分离,对上层提供面向对象的数据访问接口。

 

DAO模式的优势

1、隔离了数据访问代码和业务逻辑代码

2、隔离了不同数据库实现


DAO模式的组成部分:

1DAO接口

2DAO实现类

3、实体类

4、数据库连接和关闭工具类

 

Properties


Properties配置文件的步骤

1、添加.Properties文件

2、添加文件内容

向配置文件添加配置信息

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/epet

username=root

password=root

上述代码,等号左边的内容称为键,也就是程序中的变量,等号右边的内容为键所对应的值,也就是根据实际情况为变量赋值。

读取配置文件的信息:

  1.  public static void init(){  
  2.             Properties params=new Properties();  
  3.             //加载配置文件到输入流中  
  4.             InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");   //配置文件的路径          
  5.             try {  
  6.                 //从输入流中读取属性列表  
  7.                 params.load(is);  
  8.             } catch (IOException e) {  
  9.                 e.printStackTrace();  
  10.             }  
  11.             //根据指定的获取对应的值  
  12.             driver=pro.getProperty("driver");  
  13.             url=pro.getProperty("url");  
  14.             user=pro.getProperty("user");  
  15.             password=pro.getProperty("password");  
  16.         }     



 

读取配置文件

方法

描述

String getProperty(String key)

用指定的键在此属性列表中搜索属性,通过参数key得到其所对应的值

Object setProperty(String key,String value)

调用Hashtable的方法put,通过调用基类的put()方法来设置键值对

void load(InputStream inStream)

从输入流中读取属性列表(键和元素对),通过对指定文件进行装载获取文件中所有键值对

void clear()

清除所装载的键值对,该方法由基类Hashtable提供

 

BaseDao类

[java]  view plain  copy
  1. private static String driver; // 数据库驱动字符串  
  2.     private static String url; // 连接URL字符串  
  3.     private static String user; // 数据库用户名  
  4.     private static String password; // 用户密码  
  5.     Connection conn = null;// 数据连接对象  
  6.       
  7.     static{//静态代码块,在类加载的时候执行  
  8.         init();  
  9.     }  
  10.       
  11.     /** 
  12.      * 初始化连接参数,从配置文件里获得 
  13.      */  
  14.         public static void init(){  
  15.             Properties params=new Properties();  
  16.             //加载配置文件到输入流中  
  17.             InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");             
  18.             try {  
  19.                 //从输入流中读取属性列表  
  20.                 params.load(is);  
  21.             } catch (IOException e) {  
  22.                 e.printStackTrace();  
  23.             }  
  24.             //根据指定的获取对应的值  
  25.             driver=pro.getProperty("driver");  
  26.             url=pro.getProperty("url");  
  27.             user=pro.getProperty("user");  
  28.             password=pro.getProperty("password");  
  29.         }     
  30.     /** 
  31.      * 获取数据库连接对象。 
  32.      */  
  33.     public Connection getConnection() {  
  34.         if(conn==null){  
  35.             // 获取连接并捕获异常  
  36.             try {  
  37.                 Class.forName(driver);  
  38.                 conn = DriverManager.getConnection(url, user, password);  
  39.             } catch (Exception e) {  
  40.                 e.printStackTrace();// 异常处理  
  41.             }  
  42.         }     
  43.         return conn;// 返回连接对象  
  44.     }  
  45.         /** 
  46.      *  关闭所有连接 
  47.      *   
  48.      */  
  49.     public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {  
  50.         try {  
  51.             if (rs != null) {  
  52.                 rs.close();  
  53.             }  
  54.             if (ps != null) {  
  55.                 ps.close();  
  56.             }  
  57.             if (conn != null) {  
  58.                 conn.close();  
  59.             }  
  60.         } catch (SQLException e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.     }  
  64.     /** 
  65.      * 增、删、改的通用方法 
  66.      */  
  67.     public int executeUpdate(String sql, Object[] obj) {  
  68.         conn = getConnection();  
  69.         PreparedStatement ps = null;  
  70.         int num = 0;  
  71.         try {  
  72.             ps = conn.prepareStatement(sql);  
  73.             if (ps != null) {  
  74.                 for (int i = 0; i < obj.length; i++) {  
  75.                     ps.setObject(i + 1, obj[i]);//为预编译的sql设置参数  
  76.                 }  
  77.             }  
  78.             num = ps.executeUpdate();  
  79.         } catch (SQLException e) {  
  80.             e.printStackTrace();  
  81.         } finally {  
  82.             closeAll(conn, ps, null);//关闭对象  
  83.         }  
  84.         return num;  
  85.     }  
  86.        /** 
  87.      *  返回结果集 
  88.      * @param sql 
  89.      * @return 
  90.      */  
  91.     public ResultSet getResult(String sql) {  
  92.         conn = getConnection();  
  93.         ResultSet rs = null;  
  94.         PreparedStatement ps = null;  
  95.         try {  
  96.             ps = conn.prepareStatement(sql);  
  97.             rs = ps.executeQuery();  
  98.         } catch (SQLException e) {  
  99.             e.printStackTrace();  
  100.         }  
  101.         return rs;  
  102.     }  

 

实体类特征

 

属性一般使用private修饰

提供public修饰的getter/setter方法

实体类提供无参构造方法,根据业务提供有参构造

实现java.io.Serializable接口,支持序列化机制

猜你喜欢

转载自blog.csdn.net/weixin_40544803/article/details/79828874