前言
- 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法
- 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢
实践操作
| 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; |
| } |
| } |
| |
| public interface BaseMapper<T> { |
| |
| |
| |
| |
| 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")) { |
| 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; |
| } |
| |
| |
| |
| |
| |
| 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")) { |
| m.invoke(t1, rs.getObject(m.getName().substring(3))); |
| } |
| } |
| lists.add(t1); |
| } |
| return lists; |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术