数据库访问 BaseDao的封装
2022/3/20 19:32:12
本文主要是介绍数据库访问 BaseDao的封装,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
package com.fengmy.javaweb02.base; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Properties; /** * 数据库连接工具类 * * @since 2022/3/11 */ public abstract class BaseDao<T> { public final String DRIVER = "com.mysql.cj.jdbc.Driver"; public final String URL = "jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&useCharacterEncoding=utf-8"; public final String USER = "root"; public final String PWD = "root"; protected Connection conn; protected PreparedStatement psmt; protected ResultSet res; // T 的Class对象 private Class entityClass; public BaseDao() { Type genericSuperclass = getClass().getGenericSuperclass(); Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments(); Type actualType = actualTypeArguments[0]; System.out.println(actualType.getTypeName()); try { entityClass = Class.forName(actualType.getTypeName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取数据库连接 * * @return 数据库连接 */ protected Connection getConn() { try { DruidDataSource dds=new DruidDataSource(); dds.setDriverClassName(DRIVER); dds.setUrl(URL); dds.setUsername(USER); dds.setPassword(PWD); dds.setInitialSize(5); dds.setMaxActive(10); dds.setMaxActive(3000); conn=dds.getConnection(); return conn; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 释放资源 * * @param res 数据集 * @param psmt 预处理 * @param conn 数据库连接 */ protected void close(ResultSet res, PreparedStatement psmt, Connection conn) { try { if (res != null) { res.close(); } if (psmt != null) { psmt.close(); } if (conn != null && !conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 对数据库更新操作的抽取 * * @param sql sql语句 * @param params 预处理数据参数 * @return 返回受影响行数 */ protected int executeUpdate(String sql, Object... params) { boolean insertFlag = false; insertFlag = sql.trim().toUpperCase(Locale.ROOT).startsWith("INSERT"); try { conn = getConn(); if (insertFlag) { psmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); } else { psmt = conn.prepareStatement(sql); } setParams(psmt, params); int count = psmt.executeUpdate(); if (insertFlag) { res = psmt.getGeneratedKeys(); if (res.next()) { return ((Long) res.getLong(1)).intValue(); } } return count; } catch (SQLException e) { e.printStackTrace(); } finally { close(res, psmt, conn); } return 0; } /** * 设置预处理参数 */ private void setParams(PreparedStatement psmt, Object... params) throws SQLException { if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { psmt.setObject(i + 1, params[i]); } } } /** * 通过反射技术给object对象的属性赋值 */ private void setValue(Object obj, String property, Object propertyValue) { Class clazz = obj.getClass(); try { Field field = clazz.getDeclaredField(property); if (field != null) { field.setAccessible(true); field.set(obj, propertyValue); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } /** * 对数据库查询操作的抽取 * * @param sql sql语句 * @param params 预处理数据参数 * @return 返回T类型数据列表 */ protected List<T> executeQuery(String sql, Object... params) { List<T> list = new ArrayList<>(); try { conn = getConn(); psmt = conn.prepareStatement(sql); setParams(psmt, params); ResultSet res = psmt.executeQuery(); ResultSetMetaData rsmd = res.getMetaData(); int columnCount = rsmd.getColumnCount(); while (res.next()) { T entity = getT(columnCount, rsmd, res); list.add(entity); } } catch (SQLException | IllegalAccessException | InstantiationException e) { e.printStackTrace(); } finally { close(res, psmt, conn); } return list; } /** * 获取T对象 * * @param columnCount 列数量 * @param rsmd 元数据 * @param res 数据集 * @return T类型 * @throws InstantiationException 异常 * @throws IllegalAccessException 异常 * @throws SQLException 异常 */ private T getT(int columnCount, ResultSetMetaData rsmd, ResultSet res) throws InstantiationException, IllegalAccessException, SQLException { if (entityClass != null) { T entity = (T) entityClass.newInstance(); for (int i = 0; i < columnCount; i++) { String columnName = rsmd.getColumnName(i + 1); Object columnValue = res.getObject(i + 1); setValue(entity, columnName, columnValue); } return entity; } return null; } /** * 对数据库查询操作的抽取 * * @param sql sql语句 * @param params 预处理数据参数 * @return 返回T类型 */ protected T load(String sql, Object... params) { try { conn = getConn(); psmt = conn.prepareStatement(sql); setParams(psmt, params); ResultSet res = psmt.executeQuery(); ResultSetMetaData rsmd = res.getMetaData(); int columnCount = rsmd.getColumnCount(); if (res.next()) { return getT(columnCount, rsmd, res); } } catch (SQLException | IllegalAccessException | InstantiationException e) { e.printStackTrace(); } finally { close(res, psmt, conn); } return null; } /** * 对数据库复杂查询操作的抽取 * * @param sql sql语句 * @param params 预处理数据参数 * @return 返回T类型 */ protected Object[] executeComplexQuery(String sql, Object... params) { try { conn = getConn(); psmt = conn.prepareStatement(sql); setParams(psmt, params); ResultSet res = psmt.executeQuery(); ResultSetMetaData rsmd = res.getMetaData(); int columnCount = rsmd.getColumnCount(); Object[] columnValueArr = new Object[columnCount]; if (res.next()) { for (int i = 0; i < columnCount; i++) { Object columnValue = res.getObject(i + 1); columnValueArr[i] = columnValue; } return columnValueArr; } } catch (SQLException e) { e.printStackTrace(); } finally { close(res, psmt, conn); } return null; } }
这篇关于数据库访问 BaseDao的封装的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南