[学习笔记] 使用Java实现数据库编程之DAO模式

# 学习 # · 2020-07-28

JDBC的封装

1、数据持久化:将程序中的数据在瞬时状态和持久状态间转换的机制。

2、持久化的实现方式:数据库、XML、普通文件。

3、实现JDBC封装BaseDao类:

import java.sql.*;
/**
 * 数据库连接与关闭工具类
 */
public class BaseDao {
    // 数据库驱动字符串
    private String driver = "com.mysql.jdbc.Driver";
    // 连接URL字符串
    private String url = "jdbc:mysql://localhost:3306/table";
    // 数据库用户名
    private String user = "root";
    // 用户密码
    private String password = "123456";
    // 数据连接对象
    Connection conn = null;

    /**
     * 获取数据库连接对象
     */
    public Connection getConnection() {
        if(conn==null) {
            //获取连接并捕获异常
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, user, password);
            } catch (Exception e) {
                e.printStackTrace();    // 异常处理
            }
        }
        return conn;    // 返回连接对象
    }

    /**
     * 关闭数据库连接
     * @param conn 数据库连接
     * @param stmt Statement对象
     * @param rs 结果集
     */
    public void closeAll(Connection conn,Statement stmt,ResultSet rs) {
        // 若结果集对象不为空,则关闭
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 若Statement对象不为空,则关闭
        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 若数据库连接对象不为空,则关闭
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     /**
     * 增、删、改操作的通用方法
     * @param sql 预编译的 SQL 语句
     * @param param 参数的字符串数组
     * @return 影响的行数
     */
    public int executeUpdate (String preparedSql, Object[] param) {
        PreparedStatement pstsm = null;
        int result = 0;
        conn =  getConnection();
        try {
            pstsm = conn.prepareStatement(preparedSql);
            if (param != null) {
                for (int i = 0; i < param.length; i++) {
                    //为预编译sql设置参数
                    pstsm.setObject(i + 1, param[i]);
                }
            }
            result = pstsm.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            closeAll(conn,pstsm,null);
        }
        return result;
    }
}

4、DAO模式:Data Access Object(数据存取对象),非常流行的数据访问模式,位于业务逻辑和持久化数据之间,实现对持久化数据的访问。

5、DAO模式的组成部分:DAO接口、DAO实现类、实体类、数据库连接和关闭工具类。

6、DAO接口:

public interface PetDao {
    /**
    * 查询所有宠物
    */
    List<Pet> findAllPets() throws Exception;
}

7、DAO实现类:

public class PetDaoImpl extends BaseDao implements PetDao {
    /**
    * 查询所有宠物
    */
    public List<Pet> findAllPets() throws Exception {
        Connection conn=BaseDao.getConnection();
        String sql="select * from pet";
        PreparedStatement stmt= conn.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        List<Pet> petList=new ArrayList<Pet>();
        while(rs.next()) {
            Pet pet=new Pet(
                rs.getInt("id"),
                rs.getInt("owner_id"),
                rs.getInt("store_id"),
                rs.getString("name"),
                rs.getString("type_name"),
                rs.getInt("health"),
                rs.getInt("love"),
                rs.getDate("birthday")
            );
            petList.add(pet);
        }
        BaseDao.closeAll(conn,stmt,rs);
        return petList;
    }
}

8、实体类:

public class Pet {
    private Integer id;
    private Integer ownerId;    //主人ID
    private Integer storeId;    //商店ID
    private String name;        //姓名
    private String typeName;    //类型
    private int health;            //健康值
    private int love;            //爱心值
    private Date birthday;        //生日
    //省略get/set方法
}

Properties类

1、Java中的配置文件常为properties文件,后缀为.properties,格式是“键=值”格式,使用“#”来注释。

2、Properties类的常用方法

(1)String getProperty(String key):用指定的键在此属性列表中搜索属性。通过参数key得到其所对应的值。

(2)Object setProperty(String key,String value):调用Hashtable的方法put。通过调用基类的put()方法来设置键-值对。

(3)void load(InputStream inStream):从输入流中读取属性列表 (键和元素对)。通过对指定文件进行装载获取该文件中所有键-值对。

(4)void clear():清除所装载的键-值对,该方法由基类Hashtable提供。

3、读取配置文件:

(1)database.properties文件:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/table
user=root
password=123456

(2)Java代码:

/**
 * 数据库连接与关闭工具类。
 */
public class 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();
        String configFile = "database.properties";//配置文件路径
        //加载配置文件到输入流中
        InputStream is = BaseDao.class.getClassLoader().getResourceAsStream(configFile);
        try {
            //从输入流中读取属性列表
            params.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //根据指定的获取对应的值
        driver=params.getProperty("driver");
        url=params.getProperty("url");
        user=params.getProperty("user");
        password=params.getProperty("password");
    }
}

使用实体类传递数据

1、实体类特征:

(1)属性一般使用private修饰。

(2)提供public修饰的getter/setter方法。

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

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

如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/35/

评论