package cn.dulian.myssm.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;
/**
* @author dulian
* @create 2022-04-06 22:59
*/
public abstract class BaseDAO<T> {
public final String DRIVER = "com.mysql.cj.jdbc.Driver" ;
public final String URL = "jdbc:mysql://localhost:3306/fruitdb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
public final String USER = "root";
public final String PWD = "240451735Q@" ;
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.通过驱动管理器获取连接对象
System.out.println("连接成功!");
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); //33 苹果 5
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); //fid fname price
Object columnValue = rs.getObject(i+1); //33 苹果 5
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); //fid fname price
Object columnValue = rs.getObject(i+1); //33 苹果 5
setValue(entity,columnName,columnValue);
}
list.add(entity);
}
} catch (SQLException e) {
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java资源
学习javaWeb的知识,为后面的Spring打好基础 (102个子文件)
BaseDAO.class 8KB
FruitDAOImpl.class 2KB
Fruit.class 2KB
AddServlet.class 2KB
FruitDAO.class 427B
index.css 1KB
index.css 1KB
index.css 1KB
index.css 919B
edit.css 803B
add.css 803B
edit.css 803B
add.css 803B
edit.css 803B
add.css 803B
index.html 2KB
index.html 2KB
index.html 2KB
edit.html 1KB
edit.html 1KB
edit.html 1KB
add.html 1KB
add.html 1KB
add.html 1KB
index.html 1KB
add.html 487B
add.html 487B
fruit1.7_thymeleaf.iml 1KB
fruit1.7_thymeleaf.iml 1KB
fruit1.6_thymeleaf.iml 687B
fruit1.5_thymeleaf.iml 687B
fruit_thymeleaf.iml 687B
javaweb-begin.iml 423B
mysql-connector-java-8.0.28.jar 2.36MB
thymeleaf-3.0.12.RELEASE.jar 845KB
javassist-3.20.0-GA.jar 733KB
log4j-1.2.15.jar 383KB
ognl-3.1.26.jar 256KB
attoparser-2.0.5.RELEASE.jar 239KB
unbescape-1.1.6.RELEASE.jar 170KB
slf4j-api-1.7.25.jar 40KB
slf4j-log4j12-1.7.25.jar 12KB
BaseDAO.java 8KB
BaseDAO.java 8KB
BaseDAO.java 8KB
BaseDAO.java 8KB
BaseDAO.java 8KB
FruitServlet.java 6KB
DispatcherServlet.java 6KB
IndexServlet.java 3KB
ViewBaseServlet.java 2KB
ViewBaseServlet.java 2KB
ViewBaseServlet.java 2KB
ViewBaseServlet.java 2KB
FruitDAOImpl.java 2KB
FruitDAOImpl.java 2KB
FruitDAOImpl.java 2KB
UpdataServlet.java 1KB
IndexServlet.java 1KB
FruitDAOImpl.java 1KB
Fruit.java 1KB
Fruit.java 1KB
Fruit.java 1KB
Fruit.java 1KB
Fruit.java 1KB
AddServlet.java 1KB
AddServlet.java 1KB
DelServlet.java 1KB
EditServlet.java 1KB
FruitDAO.java 692B
FruitDAO.java 692B
FruitDAO.java 692B
FruitDAO.java 491B
FruitDAOImpl.java 420B
StringUtil.java 348B
StringUtil.java 348B
StringUtil.java 348B
FruitDAO.java 233B
del.jpg 21KB
del.jpg 21KB
del.jpg 21KB
del.jpg 21KB
index.js 232B
index.js 232B
index.js 212B
jdbc.properties 192B
javaweb-begin-1.0-SNAPSHOT.war 2.24MB
web.xml 1KB
web.xml 1KB
web.xml 1KB
web.xml 1KB
lib.xml 1KB
modules.xml 910B
fruit1_7_thymeleaf_war_exploded.xml 818B
lib_thymeleaf.xml 796B
web.xml 587B
web.xml 587B
applicationContext.xml 279B
misc.xml 258B
mysql_connector_java_8_0_28.xml 244B
共 102 条
- 1
- 2
资源评论
哆啦哆啦S梦
- 粉丝: 139
- 资源: 517
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功