烟台网站建设公司,本地wordpress安装教程,百度收录多的是哪些网站,甘肃省建设工程安质局网站文章目录 JDBC封装DAO模式实体类DAO接口DAO实现类数据源配置基础DAO类业务逻辑层 单例模式饿汉式懒汉式 JDBC封装
JDBC#xff08;Java Database Connectivity#xff09;封装是一种将 JDBC 的基本操作和常见的数据库访问逻辑封装成易于使用的工具类或框架的方法。这样做的目… 文章目录 JDBC封装DAO模式实体类DAO接口DAO实现类数据源配置基础DAO类业务逻辑层 单例模式饿汉式懒汉式 JDBC封装
JDBCJava Database Connectivity封装是一种将 JDBC 的基本操作和常见的数据库访问逻辑封装成易于使用的工具类或框架的方法。这样做的目的是为了减少重复代码提高代码的可读性和可维护性并且简化数据库访问的过程。 隔离业务逻辑代码和数据访问代码 隔离不同数据库的实现 实现 JDBC 封装
将所有增删改查操作抽取成接口定义实体类传输数据将通用的操作打开、关闭连接等封装到工具类数据库工具类BaseDao增、删、改、查的通用方法
DAO模式
DAOData Access Object 数据存取对象模式将数据访问逻辑封装在单独的类中使得业务逻辑层不需要关心具体的数据库操作细节。
DAO接口定义了对数据库进行访问的方法DAO实现类实现了DAO接口提供了具体的数据访问逻辑实体类表示数据库中的表或记录数据源配置配置数据库连接信息业务逻辑层使用DAO接口来处理业务逻辑而不需要关心具体的数据库操作 DAO 起着转换器的作用将数据在实体类和数据库记录之间进行转换 创建包
com.dao ----放接口文件 UserDao BaseDao数据库工具类com.dao.impl ----放接口实现类 UserDaoImpl
com.entity||pojo ----放实体类 User实体类
代表数据库中的表或记录。每个实体类通常对应一个数据库表并且包含与表字段相对应的属性。
public class SmbmsUser {private Integer id; // idprivate String userCode; // 用户编码private String userName; // 用户名称private String userPassword; // 用户密码private Integer gender; // 性别private Date birthday; // 出生日期private String phone; // 电话private String address; // 地址private Integer userRole; // 用户角色private Integer createdBy; // 创建者private Date creationDate; // 创建时间private Integer modifyBy; // 更新者private Date modifyDate; // 更新时间Overridepublic String toString() {// 重写 toString() 方法...}// getset 方法...
}DAO接口
定义了对数据库进行访问的方法通常是增删改查等基本操作。
公共接口
public interface PublicInterfaceE {/*** 根据ID获取单一实体。* param id 实体的唯一标识* return 返回Optional包装的实体如果没有找到则返回空的Optional*/E findById(Integer id);/*** 获取所有实体。* return 返回包含所有实体的列表*/ListE findAll();/*** 保存或更新实体。* 如果实体已存在则执行更新操作如果不存在则执行插入操作。* param e 要保存或更新的实体* return 操作后的实体*/int save(E e);/*** 删除指定ID的实体。* param id 要删除的实体ID*/int deleteById(Integer id);
}SmbmsUser 类接口
public interface SmbmsUserDao extends PublicInterfaceSmbmsUser{/*** 登录* param name 用户名* param pwd 密码* return 用户对象*/public SmbmsUser login(String name, String pwd);
}DAO实现类
实现了DAO接口提供了具体的数据访问逻辑。这个类中包含了与数据库交互的具体代码。
public class SmbmsUserDaoImpl extends BaseDao implements SmbmsUserDao {Overridepublic SmbmsUser login(String name, String pwd) {try{if(getConnection()){// 3.准备 SQL 语句String sql select id,userCode,userName,userPassword from smbms_user where userCode ? and userPassword ?;ResultSet res query(sql,name,pwd);// 6.处理 resultSet 结果集SmbmsUser smbmsUser null;while(res.next()){smbmsUser new SmbmsUser();smbmsUser.setId(res.getInt(id));smbmsUser.setUserCode(res.getString(userCode));smbmsUser.setUserName(res.getString(userName));smbmsUser.setUserPassword(res.getString(userPassword));}return smbmsUser;}} catch (Exception e) {e.printStackTrace();} finally {closeResources(); // 释放资源}return null;}Overridepublic SmbmsUser findById(Integer id) {// ...}Overridepublic ListSmbmsUser findAll() {try{if(getConnection()){String sql select id,userCode,userName,userPassword from smbms_user;ResultSet res query(sql);ListSmbmsUser list new ArrayList();while(res.next()){SmbmsUser smbmsUser new SmbmsUser();smbmsUser.setId(res.getInt(id));smbmsUser.setUserCode(res.getString(userCode));smbmsUser.setUserName(res.getString(userName));smbmsUser.setUserPassword(res.getString(userPassword));list.add(smbmsUser);}return list;}} catch (Exception e) {e.printStackTrace();} finally {closeResources(); // 释放资源}return null;}Overridepublic int save(SmbmsUser smbmsUser) {try {if (getConnection()) {String sql INSERT INTO smbms_user (userCode, userName, userPassword) VALUES (?, ?, ?);return update(sql, smbmsUser.getUserCode(), smbmsUser.getUserName(), smbmsUser.getUserPassword());}} catch (Exception e) {e.printStackTrace();} finally {closeResources(); // 释放资源}return 0;}Overridepublic int deleteById(Integer id) {try {if (getConnection()) {return update(DELETE FROM smbms_user WHERE id ?,id);}} catch (Exception e) {e.printStackTrace();} finally {closeResources(); // 释放资源}return 0;}
}数据源配置
数据源配置通常在单独的文件中定义例如 jdbc.properties 或 application.properties。
使用属性文件来管理数据库连接信息需要创建 .properties文件存储配置并在 Java 代码中读取这些属性。
# jdbc.properties 数据格式为 键 值
mysql.driver com.mysql.cj.jdbc.Driver
mysql.url jdbc:mysql://127.0.0.1:3306/smbms?useUnicodetruecharacterEncodingutf-8zeroDateTimeBehaviorconvertToNull
mysql.username root
mysql.userpwd rootJava 中提供了 Properties 类来读取配置文件
/*** Description: 读取JDBC.properties文件* 饿汉模式*/
public class ConfigManager {private static Properties properties new Properties();// 只运行一次static {try {InputStream is ConfigManager.class.getClassLoader().getResourceAsStream(jdbc.properties);// 将字节流转换为 properties 对象properties.load(is);System.out.println(properties.getProperty(mysql.driver));} catch (IOException e) {throw new RuntimeException(e);}}public static String getString(String key){return properties.getProperty(key);}
}基础DAO类
BaseDao 类封装了与数据库连接、执行查询和更新操作以及释放资源相关的通用功能。是一个基础的数据访问对象类。
提供了以下功能
获取数据库连接。执行查询操作并返回结果集。执行增删改操作并返回受影响的行数。释放数据库连接和 PreparedStatement 对象。
public class BaseDao {protected Connection conn null;protected PreparedStatement stat null;/*** 获得 conn 对象* return*/public boolean getConnection() {try {// 1.加载驱动Class.forName(ConfigManager.getString(mysql.driver));// 2.创建 Connection 对象(通过 DriverManager)conn DriverManager.getConnection(ConfigManager.getString(mysql.url), ConfigManager.getString(mysql.username), ConfigManager.getString(mysql.userpwd));return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 查询*/public ResultSet query(String sql, Object... objs) throws Exception{// 4.赋值 PreparedStatement 对象(通过 Connection)stat conn.prepareStatement(sql);// 5.执行 SQL 语句(通过 PreparedStatement)if(objs ! null){for (int i 0; i objs.length; i) {stat.setObject((i 1),objs[i]);}}return stat.executeQuery();}/*** 增删改*/public int update(String sql,Object... objs) throws Exception{// 4.赋值 PreparedStatement 对象(通过 Connection)stat conn.prepareStatement(sql);// 5.执行 SQL 语句(通过 PreparedStatement)if(objs ! null){for (int i 0; i objs.length; i) {stat.setObject((i 1),objs[i]);}}return stat.executeUpdate();}/*** 释放资源*/public void closeResources(){// 7. 关闭资源try {if(stat ! null) stat.close();if(conn ! null) conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}
}业务逻辑层
使用DAO接口来处理业务逻辑而不需要关心具体的数据库操作。
public class Main {public static void main(String[] args) {SmbmsUserDao smbmsUserDao new SmbmsUserDaoImpl();// 测试登录SmbmsUser smbmsUser smbmsUserDao.login(liming,0000000);if(smbmsUser ! null){System.out.println(登录成功smbmsUser.getUserName()欢迎您);} else {System.out.println(账号或密码错误登录失败);}// 测试添加用户SmbmsUser newUser new SmbmsUser();newUser.setUserCode(yier);newUser.setUserName(yier);newUser.setUserPassword(1234567);int addResult smbmsUserDao.save(newUser);if (addResult 0) {System.out.println(新用户添加成功);} else {System.out.println(新用户添加失败);}// 测试查询所有ListSmbmsUser allUsers smbmsUserDao.findAll();System.out.println(allUsers);// 测试根据 ID 查询// 假设我们要查询刚刚添加的用户SmbmsUser foundUser smbmsUserDao.findById(newUser.getId());if (foundUser ! null) {System.out.println(该用户为: foundUser);} else {System.out.println(该用户不存在);}// 测试删除用户// 假设我们要删除刚刚添加的用户int i smbmsUserDao.deleteById(newUser.getId());if (i 0) {System.out.println(用户删除成功);} else {System.out.println(用户删除失败);}}
}单例模式
单例模式Singleton Pattern是一种常用的软件设计模式它保证一个类只有一个实例并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的对象或者创建对象需要消耗大量资源的情况。单例模式可以确保系统中某个类的唯一性避免由于多实例导致的数据不一致等问题。
单一实例整个系统运行期间只存在一个该类的实例。私有构造器防止外部通过new关键字直接创建实例。自行创建实例在类内部自行创建唯一的实例。静态私有对象定义一个静态私有的成员变量来保存这个唯一的实例。全局访问点提供一个公共的方法使外界能够获取到这个实例。
饿汉式
Eager Initialization
这种方式在类加载时就完成了初始化所以类加载比较慢但获取对象的速度快。这是线程安全的实现。
/*** Description: 读取JDBC.properties文件* 饿汉模式*/
public class ConfigManager {private static Properties properties new Properties();// 只运行一次static {try {InputStream is ConfigManager.class.getClassLoader().getResourceAsStream(jdbc.properties);// 将字节流转换为 properties 对象properties.load(is);System.out.println(properties.getProperty(mysql.driver));} catch (IOException e) {throw new RuntimeException(e);}}public static String getString(String key){return properties.getProperty(key);}
}懒汉式
Lazy Initialization, 线程不安全
这种方式延迟了实例的创建直到第一次使用时才进行初始化。但是这种方法不是线程安全的在多线程环境下可能会产生多个实例因此需要用到 synchronized 关键字。
/*** Description: 读取JDBC.properties文件* 懒汉模式*/
public class ConfigManager1 {private static ConfigManager1 configManager1 null;private static Properties properties new Properties();public ConfigManager1(){try {InputStream is ConfigManager1.class.getClassLoader().getResourceAsStream(jdbc.properties);// 将字节流转换为 properties 对象properties.load(is);System.out.println(properties.getProperty(mysql.driver));} catch (IOException e) {throw new RuntimeException(e);}}public synchronized static ConfigManager1 getConfigManager1(){if(configManager1 null){configManager1 new ConfigManager1();}return configManager1;}public String getString(String key){return properties.getProperty(key);}
}public class Singleton {private static Singleton instance;// 私有构造函数private Singleton() {}// 提供一个全局访问点public static Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}在整个程序运行期间有且仅有一个实例。若违背这一点所设计的类就不是单例类。 单例模式懒汉模式饿汉模式概念在类加载时不创建实例采用延迟加载的方式在运行调用时创建实例在类加载的时候就完成初始化特点类加载速度快但是运行时获取对象的速度较慢时间换空间类加载较慢但获取对象速度快空间换时间延迟加载lazy loading具备不具备线程安全线程不安全线程安全