package com.newssys.ssm.basedao;
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;
public abstract class BaseDAO<T> {
public final String DRIVER = "com.mysql.cj.jdbc.Driver" ;
public final String URL = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8";
public final String USER = "root";
public final String PWD = "root" ;
protected Connection conn ;
protected PreparedStatement psmt ;
protected ResultSet rs ;
//T的Class对象
private Class entityClass ;
public BaseDAO(){
//getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例
//那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法
//因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class
//所以getGenericSuperclass()获取到的是BaseDAO的Class
Type genericType = getClass().getGenericSuperclass();
//ParameterizedType 参数化类型
Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
//获取到的<T>中的T的真实的类型
Type actualType = actualTypeArguments[0];
try {
entityClass = Class.forName(actualType.getTypeName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected Connection getConn(){
try {
//1.加载驱动
Class.forName(DRIVER);
//2.通过驱动管理器获取连接对象
return DriverManager.getConnection(URL, USER, PWD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return null ;
}
protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){
try {
if (rs != null) {
rs.close();
}
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//给预处理命令对象设置参数
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]);
}
}
}
//执行更新,返回影响行数
protected int executeUpdate(String sql , Object... params){
boolean insertFlag = false ;
insertFlag = sql.trim().toUpperCase().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){
rs = psmt.getGeneratedKeys();
if(rs.next()){
return ((Long)rs.getLong(1)).intValue();
}
}
return count ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(rs,psmt,conn);
}
return 0;
}
//通过反射技术给obj对象的property属性赋propertyValue值
private void setValue(Object obj, String property, Object propertyValue){
Class clazz = obj.getClass();
try {
//获取property这个字符串对应的属性名 , 比如 "fid" 去找 obj对象中的 fid 属性
Field field = clazz.getDeclaredField(property);
if(field!=null){
field.setAccessible(true);
field.set(obj, propertyValue);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
//执行复杂查询,返回例如统计结果
protected Object[] executeComplexQuery(String sql , Object... params){
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
Object[] columnValueArr = new Object[columnCount];
//6.解析rs
if(rs.next()){
for(int i = 0 ; i<columnCount;i++){
Object columnValue = rs.getObject(i+1);
columnValueArr[i]=columnValue;
}
return columnValueArr ;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs,psmt,conn);
}
return null ;
}
//执行查询,返回单个实体对象
protected T load(String sql , Object... params){
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
//6.解析rs
if(rs.next()){
T entity = (T)entityClass.newInstance();
for(int i = 0 ; i<columnCount;i++){
String columnName = rsmd.getColumnName(i+1);
Object columnValue = rs.getObject(i+1);
setValue(entity,columnName,columnValue);
}
return entity ;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
close(rs,psmt,conn);
}
return null ;
}
//执行查询,返回List
protected List<T> executeQuery(String sql , Object... params){
List<T> list = new ArrayList<>();
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
//6.解析rs
while(rs.next()){
T entity = (T)entityClass.newInstance();
for(int i = 0 ; i<columnCount;i++){
String columnName = rsmd.getColumnName(i+1);
Object columnValue = rs.getObject(i+1);
setValue(entity,columnName,columnValue);
}
list.add(entity);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalA
没有合适的资源?快使用搜索试试~ 我知道了~
newssystem.zip
共127个文件
class:49个
java:25个
png:12个
需积分: 0 0 下载量 80 浏览量
2023-12-23
23:28:14
上传
评论
收藏 6.44MB ZIP 举报
温馨提示
newssystem.zip
资源推荐
资源详情
资源评论
收起资源包目录
newssystem.zip (127个子文件)
BaseDAO.class 8KB
BaseDAO.class 8KB
ViewBaseServlet.class 3KB
ViewBaseServlet.class 3KB
ReplyServlet.class 3KB
ReplyServlet.class 3KB
UserBasicServlet.class 3KB
UserBasicServlet.class 3KB
NewsServlet.class 3KB
NewsServlet.class 3KB
News.class 3KB
News.class 3KB
UserBasic.class 3KB
UserBasic.class 3KB
UserNewsDto.class 2KB
UserNewsDto.class 2KB
Reply.class 2KB
Reply.class 2KB
ReplyServiceImpl.class 2KB
ReplyServiceImpl.class 2KB
NewsDAOImpl.class 2KB
NewsDAOImpl.class 2KB
Test.class 2KB
ReplyDAOImpl.class 2KB
ReplyDAOImpl.class 2KB
NewsServiceImpl.class 2KB
NewsServiceImpl.class 2KB
UserBasicDAOImpl.class 1KB
UserBasicDAOImpl.class 1KB
UserBasicServiceImpl.class 1KB
UserBasicServiceImpl.class 1KB
UserNewsDtoDAOImpl.class 1012B
UserNewsDtoDAOImpl.class 1012B
StringUtil.class 635B
StringUtil.class 635B
NewsDAO.class 586B
NewsDAO.class 586B
NewsService.class 556B
NewsService.class 556B
ReplyDAO.class 467B
ReplyDAO.class 467B
ReplyService.class 392B
ReplyService.class 392B
UserBasicService.class 312B
UserBasicService.class 312B
UserBasicDAO.class 307B
UserBasicDAO.class 307B
UserNewsDtoDAO.class 262B
UserNewsDtoDAO.class 262B
mvnw.cmd 7KB
semantic.min.css 551KB
semantic.min.css 551KB
icon.min.css 79KB
icon.min.css 79KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.gitignore 490B
.gitignore 176B
detail.html 5KB
detail.html 5KB
index.html 3KB
index.html 3KB
login.html 1KB
login.html 1KB
mysql-connector-java-8.0.27.jar 2.36MB
protobuf-java-3.11.4.jar 1.58MB
thymeleaf-3.1.1.RELEASE.jar 916KB
javassist-3.29.0-GA.jar 775KB
ognl-3.3.4.jar 259KB
attoparser-2.0.6.RELEASE.jar 241KB
unbescape-1.1.6.RELEASE.jar 170KB
slf4j-api-2.0.5.jar 61KB
BaseDAO.java 8KB
NewsServlet.java 3KB
ViewBaseServlet.java 3KB
ReplyServlet.java 3KB
UserBasicServlet.java 2KB
News.java 2KB
Reply.java 2KB
UserBasic.java 2KB
UserNewsDto.java 1KB
NewsServiceImpl.java 1KB
ReplyServiceImpl.java 1KB
NewsDAOImpl.java 1KB
ReplyDAOImpl.java 861B
UserBasicServiceImpl.java 674B
UserNewsDtoDAOImpl.java 670B
NewsService.java 608B
NewsDAO.java 594B
UserBasicDAOImpl.java 573B
Test.java 570B
ReplyDAO.java 304B
StringUtil.java 298B
ReplyService.java 252B
UserBasicDAO.java 239B
UserBasicService.java 210B
UserNewsDtoDAO.java 183B
semantic.min.js 269KB
semantic.min.js 269KB
共 127 条
- 1
- 2
资源评论
2301_82159919
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_20240517_211955.jpg
- 多语言实现的520爱心表白特效.zip
- Excel模板微信小程序学习心得和案例1.docx
- Modbus Poll version 10.9.0 Build 2194
- Modbus Slave version 9.3.2 Build 2156
- 响应式web前段开发程序源代码
- Excel模板大学实验课程改革与学生创新能力培养学生课程实验.doc
- 使用文件流操作文本文件是什么以及学习了解使用文件流操作文本文件的意义是什么
- SNP指纹图谱软件SNPT ,通过高通量测序获得的SNP,用最少的SNP数据区分尽量多的样品
- windowsBat脚本备份mysql数据库
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功