pojo类的属性与数据库表字段名一样时,java通过反射拼凑出相应的sql.
2008-11-18 12:33
1091 查看
转自csdn http://topic.csdn.net/u/20081102/09/2d46728d-fc23-47bc-b6da-e4638eb0d298.html备忘:package hl.ghost.dao;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class Session implements RowMapper {
private JdbcTemplate jdbcTemplate;
private Class clazz;
public int save(Object target, String table) {
StringBuilder sb = new StringBuilder("insert into ");
List list = new ArrayList();
sb.append(table);
sb.append(" (");
for (Field field : target.getClass().getDeclaredFields()) {
Object result = this.getObjectValue(field,target);
sb.append(field.getName()).append(",");
list.add(result);
}
sb.replace(sb.length() - 1, sb.length(), ")");
sb.append(" values(");
for (int i = 0; i < target.getClass().getDeclaredFields().length; i++) {
sb.append("?,");
}
sb.replace(sb.length() - 1, sb.length(), ")");
return this.jdbcTemplate.update(sb.toString(), list.toArray());
}
public int delete(Object target, String table) {
try {
return this.jdbcTemplate.update("delete from " + table
+ " where id=?", new Object[] { getObjectValue(target.getClass()
.getDeclaredField("id"),target) });
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public List <Object> selectObjectsByProperties(Object target, String table)
{
clazz=target.getClass();
StringBuilder sb = new StringBuilder("select * from " + table
+ " where 1=1 ");
List <Object> list = new ArrayList <Object>();
if (null != target) {
for (Field field : target.getClass().getDeclaredFields()) {
Object result = this.getObjectValue(field,target);
if (result != null) {
sb.append(" and ").append(field.getName()).append("=? ");
list.add(result);
}
}
}
return this.jdbcTemplate.query(sb.toString(), list.toArray(), this);
}
public Object mapRow(ResultSet rs, int arg1) throws SQLException {
Object object = null;
try {
object = clazz.getConstructor(null).newInstance();
for (Field field : clazz.getDeclaredFields()) {
Method method = clazz.getMethod("set"
+ new StringBuffer(field.getName()).replace(0, 1, field
.getName().substring(0, 1).toUpperCase()),
new Class[] { field.getType() });
method.invoke(object, new Object[] { rs.getObject(field
.getName())});
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
public Object getObjectValue(Field field,Object target) {
Object result = null;
try {
Method method = target.getClass().getMethod(
"get"
+ new StringBuffer(field.getName()).replace(0, 1,
field.getName().substring(0, 1)
.toUpperCase()), null);
result = method.invoke(target,null);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
这是建立在jdbcTemplate上的ormapping,只要你的类的属性与数据表的字段名字一样,且有id这个主键,那么就可以用这个Session做增删查,比如你有个表 users(id,uname,upassword) ,类User(id,uname,upassword).
那么你就可以用上面的session对users这个表做增删改查,
User user=new User();
user.setId(1);
user.setUname("zhangsan");
user.setUpassword("password");
session.save(user,"users");//增加
session.delete(user,"users");//删除
//他会跟据你user的属性的值进行组合查询,下面是按name,password的组合查询。
User user=new User();
user.setUpassword("password");
user.setUname("zhangsan");
session.selectObjectsByProperties(user,"users");
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class Session implements RowMapper {
private JdbcTemplate jdbcTemplate;
private Class clazz;
public int save(Object target, String table) {
StringBuilder sb = new StringBuilder("insert into ");
List list = new ArrayList();
sb.append(table);
sb.append(" (");
for (Field field : target.getClass().getDeclaredFields()) {
Object result = this.getObjectValue(field,target);
sb.append(field.getName()).append(",");
list.add(result);
}
sb.replace(sb.length() - 1, sb.length(), ")");
sb.append(" values(");
for (int i = 0; i < target.getClass().getDeclaredFields().length; i++) {
sb.append("?,");
}
sb.replace(sb.length() - 1, sb.length(), ")");
return this.jdbcTemplate.update(sb.toString(), list.toArray());
}
public int delete(Object target, String table) {
try {
return this.jdbcTemplate.update("delete from " + table
+ " where id=?", new Object[] { getObjectValue(target.getClass()
.getDeclaredField("id"),target) });
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public List <Object> selectObjectsByProperties(Object target, String table)
{
clazz=target.getClass();
StringBuilder sb = new StringBuilder("select * from " + table
+ " where 1=1 ");
List <Object> list = new ArrayList <Object>();
if (null != target) {
for (Field field : target.getClass().getDeclaredFields()) {
Object result = this.getObjectValue(field,target);
if (result != null) {
sb.append(" and ").append(field.getName()).append("=? ");
list.add(result);
}
}
}
return this.jdbcTemplate.query(sb.toString(), list.toArray(), this);
}
public Object mapRow(ResultSet rs, int arg1) throws SQLException {
Object object = null;
try {
object = clazz.getConstructor(null).newInstance();
for (Field field : clazz.getDeclaredFields()) {
Method method = clazz.getMethod("set"
+ new StringBuffer(field.getName()).replace(0, 1, field
.getName().substring(0, 1).toUpperCase()),
new Class[] { field.getType() });
method.invoke(object, new Object[] { rs.getObject(field
.getName())});
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
public Object getObjectValue(Field field,Object target) {
Object result = null;
try {
Method method = target.getClass().getMethod(
"get"
+ new StringBuffer(field.getName()).replace(0, 1,
field.getName().substring(0, 1)
.toUpperCase()), null);
result = method.invoke(target,null);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
这是建立在jdbcTemplate上的ormapping,只要你的类的属性与数据表的字段名字一样,且有id这个主键,那么就可以用这个Session做增删查,比如你有个表 users(id,uname,upassword) ,类User(id,uname,upassword).
那么你就可以用上面的session对users这个表做增删改查,
User user=new User();
user.setId(1);
user.setUname("zhangsan");
user.setUpassword("password");
session.save(user,"users");//增加
session.delete(user,"users");//删除
//他会跟据你user的属性的值进行组合查询,下面是按name,password的组合查询。
User user=new User();
user.setUpassword("password");
user.setUname("zhangsan");
session.selectObjectsByProperties(user,"users");
相关文章推荐
- java中通过反射遍历属性字段及值
- java中通过反射遍历属性字段及值
- java通过反射Method、属性字段名、值、数据类型
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
- java通过反射给对象设置属性【工具包系列】
- 数据库字段类型与java.sql.types的对应-Sybase
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- Java - 如何通过反射获取和设置对象私有字段的值?
- Java通过反射机制修改只读属性参数
- 数据库中字段类型对应JAVA中属性的类型
- Java通过反射得到其属性的值包含父类属性
- java中反射机制通过字节码文件对象获取字段和函数的方法
- java 通过反射获取调用类方法及属性
- Java.sql.Types,数据库字段类型,java数据类型的对应关系
- 通过java反射获得属性名 和 值
- 通过java反射获取任意对象的字段名及字段值
- JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法