8 DAO及其相关实现类
时间:2021-05-30
本文章向大家介绍8 DAO及其相关实现类,主要包括8 DAO及其相关实现类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
DAO及其相关实现类
//对传入的Class进行修改
public abstract class BaseDAO {
public int update(Connection conn,String sql,Object...args) {
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
//1.预编译sql语句:返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//2.填充占位符
for(int i = 0;i < args.length;i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//修改其为自动提交数据
//主要针对于数据连接池的使用
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.资源关闭
JDBCUtils.closeResource(null, ps);
}
return 0;
}
public <T>T getInstance(Connection conn,Class<T> clazz,String sql,Object...args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0;i<args.length;i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()) {
T t = clazz.newInstance();
for(int i =0;i<columnCount;i++ ) {
//处理结果集一行数据中的每一个列
Object columnValue = rs.getObject(i + 1);
//获取列值
String columnLabel = rsmd.getColumnLabel(i + 1);
//给t对象指定的某个属性,赋值为columvalue,通过反射
Field field = t.getClass().getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
}
public abstract class BaseDAO<T> {
private Class<T> clazz = null;
{
/*如同Person类 父类 中有个 eat() 方法中 有个 this.sleep() new Person 调用方法时,这个this是person
* Student 子类 继承父类 调用 方法 这个this是Student的
*
* 静态代码块不能调用非静态的属性
*
* 代码块在构造器前执行,子类构造器中 有super() 加载父类结构
* */
//this 是子类对象 所在类的带泛型的父类
//获取当前BaseDAO的子类继承的父类中的泛型
Type genericSuperclass = this.getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
//获取父类的泛型参数
Type[] typeArguments = paramType.getActualTypeArguments();
clazz = (Class<T>) typeArguments[0];
}
public int update(Connection conn,String sql,Object...args) {
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
//1.预编译sql语句:返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//2.填充占位符
for(int i = 0;i < args.length;i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//修改其为自动提交数据
//主要针对于数据连接池的使用
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.资源关闭
JDBCUtils.closeResource(null, ps);
}
return 0;
}
public T getInstance(Connection conn,String sql,Object...args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0;i<args.length;i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()) {
T t = clazz.newInstance();
for(int i =0;i<columnCount;i++ ) {
//处理结果集一行数据中的每一个列
Object columnValue = rs.getObject(i + 1);
//获取列值
String columnLabel = rsmd.getColumnLabel(i + 1);
//给t对象指定的某个属性,赋值为columvalue,通过反射
Field field = t.getClass().getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
}
原文地址:https://www.cnblogs.com/flypigggg/p/14828982.html
- 如何通过css控制内容显示顺序 第二行的内容优先显示
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法