我是靠谱客的博主 爱笑水蜜桃,最近开发中收集的这篇文章主要介绍java的model层实例_java框架--Model层框架 sorm,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部