利用反射机制拼写SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用反射机制拼写SQL语句相关的知识,希望对你有一定的参考价值。

利用反射机制得到VO内的字段名称拼出SQL语句
在拼写insert into tableName(tt1,tt2,tt3,tt4) values(?,?,?,?)
不知道该如何拼写

这是我拼写出的select语句
public void selectSql(String className)

int a = className.indexOf(".");

String xx = "select * from " + className.substring(a + 1) + "(?,?,?,?)";
String sql = "select * from " + className.substring(a + 1) + "(";
try
Class c = Class.forName(className);
Field[] fds = c.getDeclaredFields();
System.out.println(fds.length);
for (int i = 0; i < fds.length; i++)
sql = sql + "?,";

sql = sql.substring(0, sql.length() - 1) + ")";
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();

System.out.println(sql);

没错!是逻辑问题!不过我现在已经想到了,我用MVC+工厂模式自己做的练习!

你想insert还是select啊,新手吧,好多错哦

我想你的意思是想根据一个java bean类和table来生成insert语句,比如写一个UserBean(里面有get/set方法),建一个表usertable,然后自动生成insert语句,给你个示范:

/**
* 获取sql和params
*
* @param bean
* @param table
* @return
*/
public static Map getInsertSql(Object bean, String table)
String sql = "insert into table (";
String values = "";
// params是插入的参数值,用于PreparedStatement.set...
ArrayList params = new ArrayList();
Map map = new HashMap();

// 取出bean里的所有字段
Class beanClass = bean.getClass();
Field[] fields = beanClass.getDeclaredFields();

// 将map里的值赋给bean
try
for (int i = 0; i < fields.length; i++)
String fieldname = fields[i].getName();
if (i == 0)
sql += fieldname;
else
sql += ", " + fieldname;

// 调用get方法获取变量值
Class fieldtype = fields[i].getType();
String methodname = getMethodName(fieldname, "get");
Method method = beanClass.getMethod(methodname);
Object fieldvalue = method.invoke(bean);
if (i == 0)
values += "?";
else
values += ", ?";
params.add(fieldvalue);

catch (Exception e)
e.printStackTrace();

sql += ") values(" + values + ")";

map.put("sql", sql);
map.put("params", params);
return map;


/**
* 获取字段的get/set方法名
*
* @param fieldname
* @return
*/
private static String getMethodName(String fieldname, String type)
char upper = Character.toUpperCase(fieldname.charAt(0));
return type + upper + fieldname.substring(1);


/**
* 设置参数:用于变量绑定中参数的设置
*
* @param pst
* @param params
* @throws SQLException
*/
public static void setStatementParameters(PreparedStatement pst,
Object[] params) throws SQLException
for (int i = 0; i < params.length; ++i)
Object obj = params[i];
if (null == obj)
pst.setNull(i + 1, Types.CHAR);
else if (obj instanceof java.sql.Date)
pst.setDate(i + 1, (java.sql.Date) obj);
else if (obj instanceof java.sql.Timestamp)
pst.setTimestamp(i + 1, (java.sql.Timestamp) obj);
else
pst.setObject(i + 1, obj);




public static void main(String[] args) throws SQLException
UserBean user = new UserBean();
//user.setName(name);
//.....给user赋值
Map map = getInsertSql(user, "user_tab");
String sql = (String)map.get("sql");
ArrayList params = (ArrayList)map.get("params");
Connection conn = null;
PreparedStatement pstmt = null;
//....获取conn
pstmt = conn.prepareStatement(sql);
setStatementParameters(pstmt, params.toArray());
pstmt.execute();
pstmt.close();
conn.close();
参考技术A String className
这个参数是什么,表名。
for (int i = 0; i < fds.length; i++)
sql = sql + "?,";

这句是干什么啊?

写点注释!
参考技术B 首先,类里的变量名要对应数据库表里的项目名,然后用你那方法取出所有的变量名(数据库字段名),拼成第一个小括号里面的部分,再利用反射机制,通过`GET`方法取出变量里的值,拼成第二个小括号的部分,这个东西我做过,`INSERT UPDATE DELETE都有,把你的信箱给我,我把代码给你发过去 参考技术C 报什么错误?

MyBatis动态sql

MyBatis中的sql语句可以用动态生成,及用条件判断来拼写sql语句

  1.使用if+where 来拼写sql语句

  技术分享图片

  如图,根据传入的参数用if判断来拼写sql

  2.使用trim+if实现sql的拼写

  技术分享图片

  如图:trim中有一些属性:

      《1》prefix:前缀

      《2》prefixOverrides="and | or" 重写前缀,避免出现对于的and或者or

      《3》suffix=“” 后缀,及在trim结尾加

      《4》suffixOverrides=""后缀重写,在每个if中sql语句后加,避免多余

  3.更新用if+set  (set会自动忽略掉结尾的,)

   技术分享图片

  4.当需要用到范围操作的时候通常用foreach

  如:

  技术分享图片

  用foreach循环便利出传入参数list中的变量。foreach的属性如图所示:

  collection=“”:如果传入的参数为数字则写 Array,如果传入的参数为list的话则写list,如果传入参数为map则写map中对应的键名

  item:指的是当前对象

  open:开头

  close:结尾

  separator:分隔符

  5.使用choose(when,otherwise)类似于java中switch

    技术分享图片

  otherwise指的是其他条件

以上是关于利用反射机制拼写SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

如何利用java的反射机制动态创建对象

注解与反射

注解与反射

Java学习总结(十四)——java反射机制,利用反射动态创建对象

利用反射机制,对对象的属性值进行自动设置

利用java反射机制实现动态导出excel