使用反射机制创建万能的数据库的增删查改
2017-11-28 16:38
375 查看
package com.huoguo.common; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.huoguo.bean.TbReader; import com.mysql.jdbc.PreparedStatement; public class MyConn { protected Connection conn; protected PreparedStatement sql; protected ResultSet rs; public MyConn() { try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager .getConnection( "jdbc:mysql://localhost:3306/bookmanage?useUnicode=true&characterEncoding=utf-8", "root", ""); } catch (Exception e) { e.printStackTrace(); } } /** * 查询所有记录 * * @param ob * @return */ public ArrayList getList(Object ob) { ArrayList list = new ArrayList(); Class cls = ob.getClass(); // 要求:数据表中的字段必须与类中的属性一一对应 Field[] fi = cls.getDeclaredFields();// 获取类中的所有的属性 String strsql = "select * from " + cls.getSimpleName().replace("Tb", "").toLowerCase();// 获取表名(类名必须与数据表一致) try { sql = (PreparedStatement) conn.prepareStatement(strsql); rs = sql.executeQuery(); while (rs.next()) { Object obj = cls.newInstance();// 创建指定类的实例化对象 for (Field f : fi) { f.setAccessible(true);// 暴力访问 f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值 } list.add(obj); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 通过主键查询 * * @param cl * @param id * @return */ public Object getObjectById(Class cl, int id) { Object obj = null; Field[] fi = cl.getDeclaredFields();// 获取类中的所有的属性 String strsql = "select * from " + cl.getSimpleName().replace("Tb", "").toLowerCase() + " where " + fi[0].getName() + " = " + id;// fi[0].getName()获取数据表中第一列字段 try { sql = (PreparedStatement) conn.prepareStatement(strsql); rs = sql.executeQuery(); if (rs.next()) { obj = cl.newInstance();// 创建指定类的实例化对象 for (Field f : fi) { f.setAccessible(true);// 表示可以访问类中的私有属性 f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值 } } } catch (Exception e) { e.printStackTrace(); } return obj; } /** * 根据数据表中的一个字段和值查询 * * @param cl * @param name * @param value * @return */ public ArrayList getListBySome(Class cl, String name, Object value) { ArrayList list = new ArrayList(); Field[] fi = cl.getDeclaredFields();// 获取类中的所有的属性 String strsql = "select * from " + cl.getSimpleName().replace("Tb", "").toLowerCase() + " where " + name + " = '" + value + "'"; try { sql = (PreparedStatement) conn.prepareStatement(strsql); rs = sql.executeQuery(); while (rs.next()) { Object obj = cl.newInstance(); for (Field f : fi) { f.setAccessible(true);// 暴力访问 f.set(obj, rs.getObject(f.getName()));// 调用类中指定属性的set方法赋值 } list.add(obj); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 添加记录 * * @param ob * @return */ public int insert(Object ob) { int row = 0;// 记录数 Class clz = ob.getClass(); String table = clz.getSimpleName().replace("Tb", "").toLowerCase();// 数据表名 Field[] fi = clz.getDeclaredFields();// 字段名 StringBuilder sb = new StringBuilder();// 拼装sql语句用 // 拼装sql语句 sb.append("insert into ").append(table).append(" ("); for (int i = 0; i < fi.length - 1; i++) { sb.append(fi[i].getName() + ","); } sb.append(fi[fi.length - 1].getName() + ") values (");// 最后一个不加逗号 for (int i = 0; i < fi.length - 1; i++) { sb.append("?,"); } sb.append("?)");// 最后一个不加逗号 // 设置值 try { sql = (PreparedStatement) conn.prepareStatement(sb.toString()); for (int i = 0; i < fi.length; i++) { fi[i].setAccessible(true);// 暴力访问字段 sql.setObject(i + 1, fi[i].get(ob)); } row = sql.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } return row; } /** * 更新数据 * @param obj * @return */ public int update(Object obj) { int row=0; Class clz = obj.getClass(); Field[] fi = clz.getDeclaredFields();// 获取类中的所有的属性 StringBuilder sb = new StringBuilder(); sb.append("update "); sb.append(clz.getSimpleName().replace("Tb", "").toLowerCase()); sb.append(" set "); for (int i = 1; i < fi.length; i++) { sb.append(fi[i].getName());// 获取列名 sb.append(" =? "); if (i != fi.length - 1)// 最后一列不用加逗号 sb.append(","); } sb.append(" where "); sb.append(fi[0].getName()); sb.append(" =? "); try { sql = (PreparedStatement) conn.prepareStatement(sb.toString()); for (int i = 1; i < fi.length; i++) { fi[i].setAccessible(true); sql.setObject(i, fi[i].get(obj)); } //设置主键 fi[0].setAccessible(true); sql.setObject(fi.length, fi[0].get(obj)); row = sql.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } return row; } }
相关文章推荐
- 使用反射机制创建对象实例
- 【Java学习】使用泛型和反射 创建通用的数据库查询方法
- Windows 8 Metro应用中使用C#连接SQLite及创建数据库,数据表的增删改查
- 使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能
- 2.非关系型数据库(Nosql)之mongodb:mongodb显示所有数据库,使用数据库,集合创建(显示和隐式创建),集合查询,初步数据的增删改查,分页
- Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)
- IOS 之使用FMDB进行SQLite数据库操作——表的创建与修改,以及数据的增删改查和多线程操作数据库
- Android 在Java代码中设置style属性--使用代码创建ProgressBar对象(反射机制)
- 使用反射机制完成学生对象的创建并输出学生信息。
- java使用反射实现对数据库的增删改查
- 使用反射机制将纯Java对象放入数据库中
- 使用反射编写万能的DAO实现任意数据表的增删改查
- Java通过反射机制使用非默认构造器创建对象
- sql语法复习:增删查改,各种数据库对象创建和函数使用
- 怎样在JAVA 中封装数据库操作(增删改查)运用反射机制!已贴出删除和查询方法,求增加和修改!
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
- 安卓Android单表通用数据库、万能数据库的设计,(sqlite,java反射,泛型),使用非常方便
- 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建
- 分享一段ios中使用数据库的代码(创建,升级,增删改查)
- 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建