java 泛型转实体_纯Java版本的JDBC基础操作,支持查询结果到泛型实体类的转换...

packagecom.ldj.jdbc;/** 纯Java代码版本的JDBC操作

* 支持查询结果到(泛型)实体类的映射

* 实体类为简单的JAVA Bean,即不包含复杂的对象属性

*

* author: laideju itfky@foxmail.com

* version: 1.0

* date: 2018-10-25

*

**/

importjava.io.InputStream;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Properties;public classSimpleJdbcHelper {private static String driver = "";private static String url="";private static String userName="";private static String password="";static{

Properties props= newProperties();try{

InputStream is= SimpleJdbcHelper.class.getClassLoader().getResourceAsStream("db.properties");

props.load(is);

driver= props.getProperty("driver");

url=props.getProperty("url");

userName=props.getProperty("userName");

password= props.getProperty("password");

}catch(Exception e) {

e.printStackTrace();

}

}public staticString getDriver() {returndriver;

}public staticString getUrl() {returnurl;

}public staticString getUserName() {returnuserName;

}public staticString getPassword() {returnpassword;

}public staticConnection getConnection() {

Connection conn= null;try{

Class.forName(driver);

conn=DriverManager.getConnection(url, userName, password);

}catch(Exception e) {

e.printStackTrace();

}returnconn;

}public static voidclose(ResultSet rs, Statement stat, Connection conn) {if(rs!=null) {try{

rs.close();

rs= null;

}catch(Exception e) {

e.printStackTrace();

}

}if(stat != null) {try{

stat.close();

stat= null;

}catch(Exception e) {

e.printStackTrace();

}

}if(conn != null) {try{

conn.close();

conn= null;

}catch(Exception e) {

e.printStackTrace();

}

}

}/** 批量执行插入、更新、删除*/

public static intbatchExecute(String sql, Object[][] params) {int ret = -1;

Connection conn= null;

PreparedStatement stat= null;try{

conn=getConnection();

stat=conn.prepareStatement(sql);if(params!=null) {for (int i = 0, n = params.length; i < n; i++) {for(int j = 0, m = params[i].length; j < m; j++) {

stat.setObject(j+1, params[i][j]);

}

stat.addBatch();

}

}else { //这里如果不执行 addBatch() 方法,则执行后不会有任何结果

stat.addBatch();

}int[] rowNumList =stat.executeBatch();if(rowNumList != null && rowNumList.length > 0) {

ret= 0;for(intnum : rowNumList) {

ret+=num;

}

}

}catch(Exception e) {

e.printStackTrace();

}finally{

close(null, stat, conn);

}returnret;

}/** 单条记录的插入、删除、更新*/

public static intexecute(String sql, Object[] params) {if(params == null) {return batchExecute(sql, null);

}else{

Object[][] wrapedParams={params};returnbatchExecute(sql, wrapedParams);

}

}/** 获取实体对象*/

public static List queryResult(String sql, Object[] args, Classclazz){

Connection conn= null;

PreparedStatement stat= null;

ResultSet rs= null;

List list = new ArrayList();try{

conn=getConnection();

stat=conn.prepareStatement(sql);if(args!=null) {for(int i=0, n=args.length;i

stat.setObject(i+ 1, args[i]);

}

}

rs=stat.executeQuery();

ResultSetMetaData meta=rs.getMetaData();int totalProps =meta.getColumnCount();//获取单列查询结果, 通常是 COUNT 等统计函数的结果

if(totalProps == 1) {

rs.next();

list.add((T)rs.getObject(1));

}else if(clazz != null) { //获取多列查询结果,通常是获取实体类

Method[] methods=clazz.getDeclaredMethods();

Map methodNameMap = new HashMap();for(Method m:methods) {

String methodName=m.getName().toLowerCase();if(!methodName.startsWith("set")) {continue;

}int mod =m.getModifiers();boolean isInstancePublicSetter = Modifier.isPublic(mod) && !Modifier.isStatic(mod) && !Modifier.isAbstract(mod);if(isInstancePublicSetter) {

methodNameMap.put(methodName, m);

}

}while(rs.next()) {

Object obj=clazz.newInstance();for(int i=1; i <= totalProps; i++) {

Object currentColumnVal=rs.getObject(i);

String currentColumnName=meta.getColumnName(i);

Method m= methodNameMap.get("set"+currentColumnName);if(m!=null) {

m.invoke(obj, currentColumnVal);

}

}

list.add((T)obj);

}

}else { //异常情形:既不是单列结果,也没有指明实体类的类型

throw new Exception("queryResult(String sql, Object[] args, Class clazz) 非单列结果且未指明clazz的值");

}

}catch(Exception e) {

e.printStackTrace();

}returnlist;

}/** 获取统计函数的查询结果*/

public staticNumber getSimpleResult(String sql, Object[] params) {

Number ret=-1;

Connection conn= null;

PreparedStatement stat= null;

ResultSet rs= null;try{

conn=getConnection();

stat=conn.prepareStatement(sql);if(params!=null) {for (int i = 0, n = params.length; i < n; i++) {

stat.setObject(i+1, params[i]);

}

}

rs=stat.executeQuery();if(rs.next()) {

ret= (Number)rs.getObject(1);

}

}catch(Exception e) {

e.printStackTrace();

}finally{

close(rs, stat, conn);

}returnret;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 实体类中属性增删查改的写法可以使用 Java 的反射机制来实现。具体实现步骤如下: 1. 定义一个通用的 DAO 接口,包含增删查改的方法: ```java public interface BaseDao<T> { boolean insert(T entity); boolean delete(T entity); boolean update(T entity); T findById(Serializable id); List<T> findAll(); } ``` 2. 实现这个接口,并使用反射机制实现增删查改的方法: ```java public class BaseDaoImpl<T> implements BaseDao<T> { private Class<T> entityClass; private String tableName; public BaseDaoImpl(Class<T> entityClass) { this.entityClass = entityClass; this.tableName = entityClass.getSimpleName(); } @Override public boolean insert(T entity) { // 使用反射机制获取实体类的属性列表 Field[] fields = entityClass.getDeclaredFields(); StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO ").append(tableName).append("("); // 构建 SQL 语句 for (Field field : fields) { sb.append(field.getName()).append(","); } sb.deleteCharAt(sb.length() - 1); sb.append(") VALUES ("); for (int i = 0; i < fields.length; i++) { sb.append("?,"); } sb.deleteCharAt(sb.length() - 1); sb.append(")"); // 执行 SQL 语句 try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sb.toString())) { for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); ps.setObject(i + 1, fields[i].get(entity)); } return ps.executeUpdate() > 0; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public boolean delete(T entity) { // 使用反射机制获取实体类的主键属性 Field idField = getIdField(); StringBuilder sb = new StringBuilder(); sb.append("DELETE FROM ").append(tableName).append(" WHERE ") .append(idField.getName()).append(" = ?"); // 执行 SQL 语句 try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sb.toString())) { idField.setAccessible(true); ps.setObject(1, idField.get(entity)); return ps.executeUpdate() > 0; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public boolean update(T entity) { // 使用反射机制获取实体类的属性列表和主键属性 Field[] fields = entityClass.getDeclaredFields(); Field idField = getIdField(); StringBuilder sb = new StringBuilder(); sb.append("UPDATE ").append(tableName).append(" SET "); // 构建 SQL 语句 for (Field field : fields) { if (!field.equals(idField)) { sb.append(field.getName()).append(" = ?,"); } } sb.deleteCharAt(sb.length() - 1); sb.append(" WHERE ").append(idField.getName()).append(" = ?"); // 执行 SQL 语句 try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sb.toString())) { int paramIndex = 1; for (Field field : fields) { if (!field.equals(idField)) { field.setAccessible(true); ps.setObject(paramIndex++, field.get(entity)); } } idField.setAccessible(true); ps.setObject(paramIndex, idField.get(entity)); return ps.executeUpdate() > 0; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public T findById(Serializable id) { // 使用反射机制获取实体类的主键属性 Field idField = getIdField(); StringBuilder sb = new StringBuilder(); sb.append("SELECT * FROM ").append(tableName) .append(" WHERE ").append(idField.getName()).append(" = ?"); // 执行 SQL 语句 try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sb.toString())) { ps.setObject(1, id); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { // 创建实体类对象 T entity = entityClass.newInstance(); // 给实体类对象的属性赋值 for (Field field : entityClass.getDeclaredFields()) { field.setAccessible(true); field.set(entity, rs.getObject(field.getName())); } return entity; } else { return null; } } } catch (Exception e) { e.printStackTrace(); return null; } } @Override public List<T> findAll() { StringBuilder sb = new StringBuilder(); sb.append("SELECT * FROM ").append(tableName); // 执行 SQL 语句 try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sb.toString())) { try (ResultSet rs = ps.executeQuery()) { List<T> list = new ArrayList<>(); while (rs.next()) { // 创建实体类对象 T entity = entityClass.newInstance(); // 给实体类对象的属性赋值 for (Field field : entityClass.getDeclaredFields()) { field.setAccessible(true); field.set(entity, rs.getObject(field.getName())); } list.add(entity); } return list; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取实体类的主键属性 */ private Field getIdField() { for (Field field : entityClass.getDeclaredFields()) { if (field.isAnnotationPresent(Id.class)) { return field; } } throw new RuntimeException("No @Id field found in " + entityClass.getName()); } /** * 获取数据库连接 */ private Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); } } ``` 3. 在实体类中使用注解来标识主键属性: ```java public class User { @Id private Long id; private String name; private Integer age; // 省略 getter 和 setter 方法 } ``` 这样,我们就可以通过一个通用的 DAO 接口来实现实体类属性的增删查改,而不需要针对每个实体类都实现一遍 CRUD 操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值