首页 » 排名链接 » 《JDBC》第20节:JDBC之如何使用DAO模式开发代码(执行代码语句创建开发)

《JDBC》第20节:JDBC之如何使用DAO模式开发代码(执行代码语句创建开发)

南宫静远 2024-10-26 11:20:34 0

扫一扫用手机浏览

文章目录 [+]

DAO模式的优点:

封装性:DAO封装了所有对数据源的访问细节,使得高层的应用程序不必了解底层数据存储的细节。
可移植性:由于DAO提供了抽象的数据访问接口,如果需要更换底层数据源或数据库类型,只需要修改DAO层的实现,而不必修改业务逻辑层的代码。
可维护性:将数据访问的逻辑集中在一个地方,便于维护和扩展。
重用性:DAO方法可以被多个不同的业务逻辑组件重用,减少了代码重复。
1.2、创建BaseDAO类

前面我们也自定义了一个JdbcUtil工具类,统一封装了数据库的基本操作方法,对于DAO开发模式下,我们也可以将公用的方法抽象成一个BaseDAO基类,后续其他的DAO都要基础这个BaseDAO类,扩展一些自定义的方法即可,而不需要重复编写相同的代码。

创建BaseDAO基类的目的就是为了减少重复代码,提高代码的复用性。

package com.gitcode.jdbc.chapter20.dao;import java.lang.reflect.Field;import java.sql.;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Objects;/ @author ZhuYouBin @version 1.0.0 @date 2024/7/17 14:59 @description DAO基类 /public class BaseDao<T> { private static final String URL = "jdbc:mysql://localhost:3306/jdbc-study"; private static final String USERNAME = "root"; private static final String PASSWORD = "root"; / 获取数据库连接 / public Connection getConnection() { Connection conn; try { conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { throw new RuntimeException("数据库连接获取失败!
", e); } return conn; } / 执行新增 @param sql 执行的SQL语句 @param params ?占位符参数 @return 返回执行记录数 / public int insert(String sql, Object... params) { return update(sql, params); } / 执行删除 @param sql 执行的SQL语句 @param params ?占位符参数 @return 返回删除记录数 / public int delete(String sql, Object... params) { return update(sql, params); } / 执行更新 @param sql 执行的SQL语句 @param params ?占位符参数 @return 返回执行更新记录数 / public int update(String sql, Object... params) { Connection conn = this.getConnection(); PreparedStatement stmt = null; int result = 0; try { // 预编译语句 stmt = conn.prepareStatement(sql); // 设置参数值 for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); } // 执行SQL语句 result = stmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("执行SQL语句失败!
", e); } finally { this.close(conn, stmt, null); } return result; } / 执行查询 @param sql 执行的SQL语句 @param params ?占位符参数 @return 结果集对象 / public List<T> queryList(String sql, Class<T> clazz, Object... params) { Connection conn = getConnection(); PreparedStatement stmt = null; ResultSet rs = null; List<T> result = new ArrayList<>(); try { stmt = conn.prepareStatement(sql); // 设置参数值 for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); } // 执行SQL语句 rs = stmt.executeQuery(); // 查询所有列字段 ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); while (rs.next()) { T entity = clazz.newInstance(); for (int i = 1; i <= columnCount; i++) { Object value = rs.getObject(i); Field field = clazz.getDeclaredField(metaData.getColumnLabel(i)); field.setAccessible(true); String typeName = field.getGenericType().getTypeName(); if (Objects.equals("java.lang.Long", typeName)) { field.set(entity, Long.parseLong(value.toString())); } else if (Objects.equals("java.util.Date", typeName)) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); try { Date date = formatter.parse(value.toString()); field.set(entity, date); } catch (ParseException e) { System.out.println("日期转换失败!
" + e.getMessage()); } } else { field.set(entity, value); } } result.add(entity); } } catch (Exception e) { throw new RuntimeException("查询失败!
", e); } finally { this.close(conn, stmt, rs); } return result; } / 执行查询 @param sql 执行的SQL语句 @param params ?占位符参数 @return 结果集对象 / public T getOne(String sql, Class<T> clazz, Object... params) { List<T> entityList = this.queryList(sql, clazz, params); if (entityList != null && !entityList.isEmpty()) { return entityList.get(0); } return null; } / 按照顺序,依次释放资源 @param conn 数据库连接对象 @param stmt 语句对象 @param rs 结果集对象 / public void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { throw new RuntimeException("关闭数据库连接资源失败!
", e); } }}
1.3、创建UserDao接口

BaseDao基类创建之后,我们就可以针对每一张数据表创建对应的DAO接口,然后在接口中定义该数据表的操作方法。

《JDBC》第20节:JDBC之如何使用DAO模式开发代码(执行代码语句创建开发) 排名链接
(图片来自网络侵删)

package com.gitcode.jdbc.chapter20.dao;import com.gitcode.jdbc.chapter20.entity.UserEntity;import java.util.List;/ @author ZhuYouBin @version 1.0.0 @date 2024/7/17 15:59 @description 用户表DAO层 /public interface UserDao { int insertUser(UserEntity entity); UserEntity getUserById(int id); List<UserEntity> findAll();}1.4、创建UserDaoImpl实现类

上面将UserDao接口创建之后,还需要创建具体的DAO实现类,另外我们这里写的DAO实现类需要继承自BaseDao基类,这是为了复用代码。

注意:代码中使用的UserEntity实体类代码未给出,该类就是对数据表每一个字段映射成了Java字段。

package com.gitcode.jdbc.chapter20.dao;import com.gitcode.jdbc.chapter20.entity.UserEntity;import java.util.List;/ @author ZhuYouBin @version 1.0.0 @date 2024/7/17 16:02 @description 用户表DAO实现类 /public class UserDaoImpl extends BaseDao<UserEntity> implements UserDao { @Override public int insertUser(UserEntity entity) { String sql = "INSERT INTO `t_user`(`username`, `password`, `create_time`) VALUES (?, ?, ?);"; return insert(sql, entity.getUsername(), entity.getPassword(), entity.getCreateTime()); } @Override public UserEntity getUserById(int id) { String sql = "select id,username,password,create_time AS createTime from t_user where id = ?"; return getOne(sql, UserEntity.class, id); } @Override public List<UserEntity> findAll() { String sql = "select id,username,password,create_time AS createTime from t_user"; return queryList(sql, UserEntity.class); }}1.5、创建测试类

上面几个步骤完成之后,就可以创建对应的测试类,通过UserDao来调用操作t_user表的相关方法啦。

package com.gitcode.jdbc.chapter20.service;import com.gitcode.jdbc.chapter20.dao.UserDao;import com.gitcode.jdbc.chapter20.dao.UserDaoImpl;import com.gitcode.jdbc.chapter20.entity.UserEntity;import java.util.Date;import java.util.List;/ @author ZhuYouBin @version 1.0.0 @date 2024/7/17 16:18 @description 用户表代码 /public class UserService { public static void main(String[] args) { // 1、创建 UserDao 对象 UserDao userDao = new UserDaoImpl(); // 2、通过 UserDao 操作数据库 int success = userDao.insertUser(new UserEntity("张三", "123456", new Date())); System.out.println("新增成功:"+success); // 3、查询人员 List<UserEntity> entityList = userDao.findAll(); for (UserEntity entity : entityList) { System.out.println(entity); } // 查询人员 UserEntity entity = userDao.getUserById(1); System.out.println("id=1的数据:"+entity); }}

使用Dao代码之后,可以看出操作数据库的代码简洁了很多,是不是看着更加的优雅了,这也是使用DAO开发模式的优点之一。

1.6、源代码获取

源代码地址:

https://gitcode.com/qq_39826207/jdbc-study/tree/chapter-jdbc-20

今天就到这里,未完待续~~

标签:

相关文章