前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL的数据访问和DAO模式

MySQL的数据访问和DAO模式

作者头像
JanYork_小简
发布2024-03-07 08:23:26
1150
发布2024-03-07 08:23:26
举报
文章被收录于专栏:小简技术栈小简技术栈

Properties 配置文件

在不同业务场景的实际开发过程中,数据库服务器的 IP 地址,访问数据库的用户名或密码经常会发生变化,维护和修改比较麻烦,而为了避免这种情况,Java 中有一个比较重要的 Properties 类,它可以读取 Java 配置文件,这样就可以把常用的配置信息卸载配置文件中,程序员进行维护和修改。

  1. 添加 .properties 文件

选择 src 文件夹并右击,New → File,命名为 database.properties

  1. 编辑配置文件
代码语言:javascript
复制
 driver=com.mysql.cj.jdbc.Driver
 url=jdbc:mysql://localhost:3306/hospital?serverTimezone=GMT-8
 username=root
 password=123456

格式无需分号结尾,与Java中的Map结构相似,等号之前是键,等号之后是只。在一个配置文件中,键应该唯一,但值可以不唯一,通过一个键就可以找到确定值。

  1. 读取配置文件

使用java.util包下的 Properties类读取配置文件。

Properties 类继承自Hashtable类,其常用方法如下:

方法

描述

String getProperty (String key)

用指定的键在此属性列表中搜索属性

Object setProperty(String key, String value)

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

void load(InputStream streamIn) throws IOException

从输入流中读取属性列表(键和元素对)

void clear()

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

DAO

简介

DAO (DataAccessobjects) 数据存取对象是指位于业务逻辑和持久化数据之间,实现对持久化数据的访问的工作模式。

通俗来讲,就是将数据库操作都封装起来,对外提供相应的接口。

DAO的优势

  1. 提高代码的复用性
  2. 隔离性
    1. 隔离了数据访问代码和业务逻辑代码
    2. 隔离了不同数据库实现
  3. 易维护

DAO 的组成

  1. 数据库连接和关闭工具类:避免了数据库连接和关闭代码的重复使用,方便修改。
  2. 实体类:用于存放与传输对象数据。
  3. DAO 接口:把对数据库的所有操作定义成抽象方法,可以提供多种实现
  4. DAO 实现类:针对不同数据库给出DAO接口定义方法的具体实现。

工具类 连接数据库

代码语言:javascript
复制
 package cn.hospital.dao;
 ​
 import java.io.IOException;
 import java.io.InputStream;
 import java.sql.*;
 import java.util.Properties;
 ​
 /**
  * 数据库通用工具类 即基类
  */
 public class Dao {
     private Connection conn;
     private PreparedStatement ps;
     private static String driver;
     private static String url;
     private static String userName;
     private static String pwd;
     
     // 省略封装
 ​
     static{
         init();
     }
 ​
     public static void init(){
         //创建 Properties 对象
         Properties pt = new Properties();
         String filePath = "database.properties";
         InputStream is = Dao.class.getClassLoader().getResourceAsStream(filePath);
         try {
             pt.load(is);
             //根据键来获取对应的值
             driver = pt.getProperty("driver");
             url = pt.getProperty("url");
             userName = pt.getProperty("user");
             pwd = pt.getProperty("pwd");
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 ​
     public Connection getConnection(){
         if(conn == null) {
             try {
                 // 1.加载驱动
                 Class.forName(getDriver());
                 // 2.获取连接
                 conn = DriverManager.getConnection(getUrl(),getUserName(),getPwd());
             } catch (ClassNotFoundException | SQLException e) {
                 e.printStackTrace();
             }
         }
         return conn;
     }
 ​
     /**
      * 关闭
      * @param rs 结果集
      * @param ps 接口
      * @param conn 数据库连接
      */
     public void closeAll(ResultSet rs , PreparedStatement ps , Connection conn){
         if(null!= rs){
             try {
                 rs.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
 ​
         if(null!= ps){
             try {
                 ps.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
 ​
         if(null!= conn){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
     }
 ​
     public int executeUpdate(String sql , Object ... prams){
         // 受影响的行数
         int result = 0;
         // 1.获取连接
         conn = getConnection();
         try {
             // 2.发送sql语句
             ps = conn.prepareStatement(sql);
             // 3.判断是否有参数
             if (prams != null) {
                 // 4.循环遍历参数
                 for (int i = 0; i < prams.length;i++){
                     ps.setObject(i+1,prams[i]);
                 }
                 // 5.执行 返回受影响的行数
                 result = ps.executeUpdate();
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }
         return result;
     }
     
 }

或者

菜鸟教程 —— 连接数据库

代码语言:javascript
复制
 public class BaseDao {
     private static String driver="com.mysql.jdbc.Driver";
     private static String url="jdbc:mysql://127.0.0.1:3306/epet";
     private static String user="root";
     private static String password="root";
         static {
             try {
                 Class.forName(driver);
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
         }
         
     public static Connection getConnection() throws SQLException {
         return DriverManager.getConnection(url, user, password);    
     }
     
     public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException {
         if(rs!=null) {
             rs.close();
         }
         if(stmt!=null) {
             stmt.close();
         }
         if(conn!=null) {
             conn.close();
         }
     }
     
 ​
     public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException {
         Connection conn = null;
         PreparedStatement pstmt = null;
         /* 处理SQL,执行SQL */
         try {
             conn = getConnection(); // 得到数据库连接
             pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象
             if (param != null) {
                 for (int i = 0; i < param.length; i++) {
                     pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
                 }
             }
         ResultSet num = pstmt.executeQuery(); // 执行SQL语句
         } catch (SQLException e) {
             e.printStackTrace(); // 处理SQLException异常
         } finally {
             try {
                 BaseDao.closeAll(conn, pstmt, null);
             } catch (SQLException e) {    
                 e.printStackTrace();
             }
         }
         return 0;
     }
     
 }

实体类

代码语言:javascript
复制
 package entity;
 ​
 import java.util.Date;
 ​
 /**
  * 实体类
  */
 public class Hospital {
     private int patientID;
     private String patientName;
     private String password;
     private Date birthDate;
     private String gender;
     private String phoneNum;
     private String email;
     private String identityNum;
     private String address;
     
     // 省略封装、无参有参
 }

DAO 接口

代码语言:javascript
复制
 package cn.hospital.dao;
 ​
 import entity.Hospital;
 import java.util.List;
 ​
 public interface HospitalDao {
     /**
      * 添加数据
      */
     public int addPaitent(Hospital h);
     
     /**
      * 根据 id 删除表中数据
      */
     public int deletePaitent(int id);
 ​
     /**
      * 更新值
      */
     public int updatePaitent(Hospital h);
 ​
     /**
      * 查询检查表中的信息
      */
     public List<Hospital> getHospitalList();
 }
 ​

DAO 实现类

代码语言:javascript
复制
 package cn.hospital.dao.impl;
 ​
 import cn.hospital.dao.Dao;
 import cn.hospital.dao.HospitalDao;
 import entity.Hospital;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.Date;
 import java.sql.SQLException;
 import java.util.ArrayList;
 ​
 import java.util.List;
 ​
 /**
  * DAO 实现类
  */
 public class HospitalDemo extends Dao implements HospitalDao {
 ​
     @Override
     public int addPaitent(Hospital h) {
         String sql = "insert into patient(patientName, password, birthDate, gender, phoneNum, email, identityNum, address) " +
                      "values(?,?,?,?,?,?,?,?)";
         return this.executeUpdate(sql,h.getPatientName(),h.getPassword(),h.getBirthDate(),h.getGender(),h.getPhoneNum(),h.getEmail(),h.getIdentityNum(),h.getAddress());
     }
 ​
     @Override
     public int deletePaitent(int id) {
         String sql = "delete from patient where patientID = ?";
         return this.executeUpdate(sql,id);
     }
 ​
     @Override
     public int updatePaitent(Hospital h) {
         String sql = "update patient set patientName = ? where patientName = '张三'";
         return this.executeUpdate(sql,h.getPatientName());
     }
 ​
     /**
      * 查询检查表中的信息
      */
     @Override
     public List<Hospital> getHospitalList() {
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         List<Hospital> list = new ArrayList<>();
         String sql = "select * from patient";
         try {
             // 1.获取连接
             conn = getConnection();
             // 2.发送sql
             ps = conn.prepareStatement(sql);
             // 3.执行sql
             rs = ps.executeQuery();
             // 4.循环遍历输出
             while (rs.next()){
                 //创建 hospital对象,用来存储查询德信息
                 Hospital hospital = new Hospital();
                 hospital.setPatientID(rs.getInt("patientID"));
                 hospital.setPatientName(rs.getString("patientName"));
                 hospital.setBirthDate(rs.getDate("birthDate"));
                 hospital.setPassword(rs.getString("password"));
                 hospital.setGender(rs.getString("gender"));
                 hospital.setPhoneNum(rs.getString("phoneNum"));
                 hospital.setEmail(rs.getString("email"));
                 hospital.setIdentityNum(rs.getString("identityNum"));
                 hospital.setAddress(rs.getString("address"));
                 //将对象添加到集合中
                 list.add(hospital);
             }
         } catch (SQLException e) {
             e.printStackTrace();
         } finally {
             this.closeAll(rs,ps,conn);
         }
         return list;
     }
 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Properties 配置文件
  • DAO
    • DAO的优势
      • DAO 的组成
        • 工具类 连接数据库
          • 实体类
            • DAO 接口
              • DAO 实现类
              相关产品与服务
              云数据库 MySQL
              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档