JDBC的封装
什么是DAO
1.Data Access Object(数据存取对象)
2.位于业务逻辑和持久化数据之间
3.实现对持久化数据的访问
采用面向接口编程,可以降低代码间的耦合性、提高代码的可扩展性和可维护性。
注:尽量以对象为单位,而不是以属性为单位来传递参数,给调用者提供面向对象的接口。
DAO(Data Access Object数据存取对象)位于业务逻辑和持久化数据之间,实现对持久化数据的访问,通俗来讲,就是将数据库操作都封装起来,对外提供相应的接口。
在面向对象设计过程中,有一些“套路”用于解决特定问题,称为模式,DAO模式提供了访问关系型数据库所需操作的接口,将数据访问和业务逻辑分离,对上层提供面向对象的数据访问接口。
DAO模式的优势
1、隔离了数据访问代码和业务逻辑代码
2、隔离了不同数据库实现
DAO模式的组成部分:
1、DAO接口
2、DAO实现类
3、实体类
4、数据库连接和关闭工具类
Properties类
Properties配置文件的步骤
1、添加.Properties文件
2、添加文件内容
向配置文件添加配置信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/epet
username=root
password=root
上述代码,等号左边的内容称为键,也就是程序中的变量,等号右边的内容为键所对应的值,也就是根据实际情况为变量赋值。
读取配置文件的信息:
- public static void init(){
- Properties params=new Properties();
- //加载配置文件到输入流中
- InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties"); //配置文件的路径
- try {
- //从输入流中读取属性列表
- params.load(is);
- } catch (IOException e) {
- e.printStackTrace();
- }
- //根据指定的获取对应的值
- driver=pro.getProperty("driver");
- url=pro.getProperty("url");
- user=pro.getProperty("user");
- password=pro.getProperty("password");
- }
读取配置文件
方法 |
描述 |
String getProperty(String key) |
用指定的键在此属性列表中搜索属性,通过参数key得到其所对应的值 |
Object setProperty(String key,String value) |
调用Hashtable的方法put,通过调用基类的put()方法来设置键值对 |
void load(InputStream inStream) |
从输入流中读取属性列表(键和元素对),通过对指定文件进行装载获取文件中所有键值对 |
void clear() |
清除所装载的键值对,该方法由基类Hashtable提供 |
BaseDao类
- private static String driver; // 数据库驱动字符串
- private static String url; // 连接URL字符串
- private static String user; // 数据库用户名
- private static String password; // 用户密码
- Connection conn = null;// 数据连接对象
- static{//静态代码块,在类加载的时候执行
- init();
- }
- /**
- * 初始化连接参数,从配置文件里获得
- */
- public static void init(){
- Properties params=new Properties();
- //加载配置文件到输入流中
- InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
- try {
- //从输入流中读取属性列表
- params.load(is);
- } catch (IOException e) {
- e.printStackTrace();
- }
- //根据指定的获取对应的值
- driver=pro.getProperty("driver");
- url=pro.getProperty("url");
- user=pro.getProperty("user");
- password=pro.getProperty("password");
- }
- /**
- * 获取数据库连接对象。
- */
- public Connection getConnection() {
- if(conn==null){
- // 获取连接并捕获异常
- try {
- Class.forName(driver);
- conn = DriverManager.getConnection(url, user, password);
- } catch (Exception e) {
- e.printStackTrace();// 异常处理
- }
- }
- return conn;// 返回连接对象
- }
- /**
- * 关闭所有连接
- *
- */
- public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
- try {
- if (rs != null) {
- rs.close();
- }
- if (ps != null) {
- ps.close();
- }
- if (conn != null) {
- conn.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 增、删、改的通用方法
- */
- public int executeUpdate(String sql, Object[] obj) {
- conn = getConnection();
- PreparedStatement ps = null;
- int num = 0;
- try {
- ps = conn.prepareStatement(sql);
- if (ps != null) {
- for (int i = 0; i < obj.length; i++) {
- ps.setObject(i + 1, obj[i]);//为预编译的sql设置参数
- }
- }
- num = ps.executeUpdate();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- closeAll(conn, ps, null);//关闭对象
- }
- return num;
- }
- /**
- * 返回结果集
- * @param sql
- * @return
- */
- public ResultSet getResult(String sql) {
- conn = getConnection();
- ResultSet rs = null;
- PreparedStatement ps = null;
- try {
- ps = conn.prepareStatement(sql);
- rs = ps.executeQuery();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return rs;
- }
实体类特征
属性一般使用private修饰
提供public修饰的getter/setter方法
实体类提供无参构造方法,根据业务提供有参构造
实现java.io.Serializable接口,支持序列化机制