利用反射机制拼写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+工厂模式自己做的练习!
我想你的意思是想根据一个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语句的主要内容,如果未能解决你的问题,请参考以下文章