概述
packagecom.bjsxt.sorm.core;importjava.lang.reflect.Field;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importcom.bjsxt.sorm.bean.ColumnInfo;importcom.bjsxt.sorm.bean.TableInfo;importcom.bjsxt.sorm.utils.JDBCUtils;importcom.bjsxt.sorm.utils.ReflectUtils;/*** 负责查询(对外提供服务的核心类)
*@authorgaoqi ww.sxt.cn
**/@SuppressWarnings("all")public abstract class Query implementsCloneable{publicObject executeQueryTemplate(String sql, Object[] params, Class clazz, CallBack back)
{
Connection conn=DBManager.getConn();
PreparedStatement ps= null;
ResultSet rs= null;try{
ps=conn.prepareStatement(sql);
JDBCUtils.handleParams(ps, params);
System.out.println(ps);
rs=ps.executeQuery();returnback.doExecute(conn, ps, rs);
}catch(Exception e) {
e.printStackTrace();return null;
}finally{
DBManager.close(ps, conn);
}
}/*** 直接执行一个DML语句
*@paramsql sql语句
*@paramparams 参数
*@return执行sql语句后影响记录的行数*/
public intexecuteDML(String sql, Object[] params) {
Connection conn=DBManager.getConn();int count = 0;
PreparedStatement ps= null;try{
ps=conn.prepareStatement(sql);//给sql设参
JDBCUtils.handleParams(ps, params);
System.out.println(ps);
count=ps.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally{
DBManager.close(ps, conn);
}returncount;
}/*** 将一个对象存储到数据库中
* 把对象中不为null的属性往数据库中存储!如果数字为null则放0.
*@paramobj 要存储的对象*/
public voidinsert(Object obj) {//obj-->表中。 insert into 表名 (id,uname,pwd) values (?,?,?)
Class c =obj.getClass();
List params = new ArrayList(); //存储sql的参数对象
TableInfo tableInfo =TableContext.poClassTableMap.get(c);
StringBuilder sql= new StringBuilder("insert into "+tableInfo.getTname()+" (");int countNotNullField = 0; //计算不为null的属性值
Field[] fs =c.getDeclaredFields();for(Field f:fs){
String fieldName=f.getName();
Object fieldValue=ReflectUtils.invokeGet(fieldName, obj);if(fieldValue!=null){
countNotNullField++;
sql.append(fieldName+",");
params.add(fieldValue);
}
}
sql.setCharAt(sql.length()-1, ')');
sql.append(" values (");for(int i=0;i
sql.append("?,");
}
sql.setCharAt(sql.length()-1, ')');
executeDML(sql.toString(), params.toArray());
}/*** 删除clazz表示类对应的表中的记录(指定主键值id的记录)
*@paramclazz 跟表对应的类的Class对象
*@paramid 主键的值*/
public voiddelete(Class clazz, Object id) {//Emp.class,2-->delete from emp where id=2//通过Class对象找TableInfo
TableInfo tableInfo =TableContext.poClassTableMap.get(clazz);//获得主键
ColumnInfo onlyPriKey =tableInfo.getOnlyPriKey();
String sql= "delete from "+tableInfo.getTname()+" where "+onlyPriKey.getName()+"=? ";
executeDML(sql,newObject[]{id});
}/*** 删除对象在数据库中对应的记录(对象所在的类对应到表,对象的主键的值对应到记录)
*@paramobj*/
public voiddelete(Object obj) {
Class c=obj.getClass();
TableInfo tableInfo=TableContext.poClassTableMap.get(c);
ColumnInfo onlyPriKey= tableInfo.getOnlyPriKey(); //主键//通过反射机制,调用属性对应的get方法或set方法
Object priKeyValue =ReflectUtils.invokeGet(onlyPriKey.getName(), obj);
delete(c, priKeyValue);
}/*** 更新对象对应的记录,并且只更新指定的字段的值
*@paramobj 所要更新的对象
*@paramfieldNames 更新的属性列表
*@return执行sql语句后影响记录的行数*/
public intupdate(Object obj, String[] fieldNames) {//obj{"uanme","pwd"}-->update 表名 set uname=?,pwd=? where id=?
Class c =obj.getClass();
List params = new ArrayList(); //存储sql的参数对象//从加载数据库表信息放在map集合里,根据tablebame.class取表信息
TableInfo tableInfo =TableContext.poClassTableMap.get(c);
ColumnInfo priKey=tableInfo.getOnlyPriKey();//获得唯一的主键
StringBuilder sql = new StringBuilder("update "+tableInfo.getTname()+" set ");for(String fname:fieldNames){
Object fvalue=ReflectUtils.invokeGet(fname,obj);
params.add(fvalue);
sql.append(fname+"=?,");
}
sql.setCharAt(sql.length()-1, ' ');
sql.append(" where ");
sql.append(priKey.getName()+"=? ");
params.add(ReflectUtils.invokeGet(priKey.getName(), obj));//主键的值
returnexecuteDML(sql.toString(), params.toArray());
}/*** 查询返回多行记录,并将每行记录封装到clazz指定的类的对象中
*@paramsql 查询语句
*@paramclazz 封装数据的javabean类的Class对象
*@paramparams sql的参数
*@return查询到的结果*/
public List queryRows(final String sql,final Class clazz,finalObject[] params){return (List)executeQueryTemplate(sql, params, clazz, newCallBack(){
@OverridepublicObject doExecute(Connection conn,PreparedStatement ps,ResultSet rs) {
List list=null;try{
ResultSetMetaData metaData=rs.getMetaData();while(rs.next()) {if (list==null) {
list=newArrayList();
}
Object rowObj=clazz.newInstance();for (int i = 0; i < metaData.getColumnCount(); i++) {
String columnName= metaData.getColumnLabel(i + 1);
Object columnValue= rs.getObject(i + 1);
ReflectUtils.invokeSet(rowObj, columnName, columnValue);
}
list.add(rowObj);
}
}catch(Exception e) {
e.printStackTrace();
}returnlist;
}
});
}/*** 查询返回一行记录,并将该记录封装到clazz指定的类的对象中
*@paramsql 查询语句
*@paramclazz 封装数据的javabean类的Class对象
*@paramparams sql的参数
*@return查询到的结果*/
publicObject queryUniqueRow(String sql, Class clazz, Object[] params) {
List list=queryRows(sql, clazz, params);return (list==null&&list.size()>0)?null:list.get(0);
}/*** 查询返回一个值(一行一列),并将该值返回
*@paramsql 查询语句
*@paramparams sql的参数
*@return查询到的结果*/
publicObject queryValue(String sql, Object[] params)
{return executeQueryTemplate(sql, params, null, newCallBack()
{
@OverridepublicObject doExecute(Connection conn, PreparedStatement ps, ResultSet rs) {
Object value= null;try{while(rs.next())
value= rs.getObject(1);
}catch(SQLException e) {
e.printStackTrace();
}returnvalue;
}
});
}/*** 查询返回一个数字(一行一列),并将该值返回
*@paramsql 查询语句
*@paramparams sql的参数
*@return查询到的数字*/
publicNumber queryNumber(String sql, Object[] params) {return(Number)queryValue(sql, params);
}/*** 分页查询*/
public abstract Object queryPagenate(int pageNum,intsize);protectedObject clone()throwsCloneNotSupportedException
{return super.clone();
}
}
最后
以上就是爱笑水蜜桃为你收集整理的java的model层实例_java框架--Model层框架 sorm的全部内容,希望文章能够帮你解决java的model层实例_java框架--Model层框架 sorm所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复