jdbc操作mysql(四):利用反射封装
2021/6/18 2:33:01
本文主要是介绍jdbc操作mysql(四):利用反射封装,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
- 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法
- 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢
实践操作
- 工具类:获取connection对象
public class JDBCUtil { public static Connection getConnection() { try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost/jdbctest"; String user = "root"; String password = "root"; Connection connection = DriverManager.getConnection(url, user, password); return connection; } catch (Exception e) { e.printStackTrace(); } return null; } }
- 拼接sql语句,利用反射封装
public interface BaseMapper<T> { /** * default关键字,修饰接口中的方法时,方法可以拥有方法体 * 拼接sql语句,例如向user表插入数据:insert into user (id, username, age, sex, password) value (?, ?, ?, ?, ?); */ default int insert(T t) throws Exception { StringBuilder sb = new StringBuilder("insert into "); // 动态构建 sb.append(t.getClass().getSimpleName()); // 获取类名 sb.append("("); Method[] methods = t.getClass().getDeclaredMethods(); int i = 0; for(Method m : methods) { if(m.getName().startsWith("get")) { // startsWith方法用于判断是否以指定前缀开头 Object o = m.invoke(t, null); // 将获取的方法名参数化 if(o != null) { sb.append(m.getName().substring(3)); sb.append(","); i ++; } } } //截取掉最后一个逗号,添加一个右括号 String s = sb.substring(0, sb.length() -1) + ")"; StringBuilder sb1 = new StringBuilder(s); sb1.append(" values("); for(int j = 0; j < i; j++) { sb1.append("?,"); } //截取掉最后一个逗号,添加一个右括号 String sql = sb1.substring(0, sb1.length()-1) + ")"; Connection conn = JDBCUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); int j = 1; for(Method m : methods) { if(m.getName().startsWith("get")) { Object o = m.invoke(t, null); if(o != null) { ps.setObject(j, o); // 注入对应的参数 j++; } } } int insert = ps.executeUpdate(); return insert; } /** * 获取表中所有数据 * 例如获取user表中的所有数据:select * from user; */ default List<T> getAll(Class<T> t) throws Exception { String sql = "select * from " + t.getSimpleName(); Connection conn = JDBCUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); List<T> lists = new ArrayList<T>(); while(rs.next()) { T t1 = t.newInstance(); Method[] methods = t1.getClass().getMethods(); for(Method m : methods) { if(m.getName().startsWith("set")) { // getName().substring(3) 获取属性名 m.invoke(t1, rs.getObject(m.getName().substring(3))); // 这里是按列名获取完一个对象后 初始化,再获取下一个对象的值 } } lists.add(t1); // 将对象添加到list集合 } return lists; } }
这篇关于jdbc操作mysql(四):利用反射封装的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-25MySQL报错Duplicate entry '0' for key 'PRIMARY'
- 2024-05-29阿里 Canal 实时同步 MySQL 增量数据至 ClickHouse 数据库
- 2024-05-24在Linux下管理MySQL的大小写敏感性
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享