一个实现了和数据库打交道的源文件(组装sql语句版)
来源:互联网 发布:淘宝人群画像 编辑:程序博客网 时间:2024/05/21 10:46
package com.itcast.service.base;
import java.util.LinkedHashMap;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.itcast.util.QueryResult;
/**
* 针对所有实体bean的一个抽象类,所有的实体bean包括ProductType,Product等等
* @author lucky
*
*/
@Transactional
public abstract class DaoSupport implements DAO {
@PersistenceContext protected EntityManager em;
//调用下面的public <T> void delete(Class<T> entityClass,Object[] entityids方法
public <T> void delete(Class<T> entityClass,Object entityid) {
delete(entityClass,new Object[]{entityid});
}
public <T> void delete(Class<T> entityClass,Object[] entityids) {
for(Object id:entityids){
em.remove(em.getReference(entityClass, id));
}
}
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)//说明在执行该方法的时候不需要进行事务处理
public <T> T find(Class<T> entityClass, Object entityid) {
return em.find(entityClass, entityid);
}
/**
* 可以自动管里主键id的生成,但前提是id是自动生成的
* 若id是uuid的话,jpa就不支持自动管理逐渐的功能,子类就必须重写该方法,手动添加主键
*/
public void save(Object entity) {
em.persist(entity);
}
public void update(Object entity) {
em.merge(entity);
}
@SuppressWarnings("unchecked")
@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
/**
* 查询的终极最强版,既可以分页,又可以按序查询,还可以有查询条件,其他的查询都使用这个查询方法
* orderby 语句格式:order by key1 asc,key2 asc 。用到方法buildOrderby(LinkedHashMap<String, String> orderby)
* wherejpql 语句格式:where o.property=?1,o.property=?2。用到方法
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass,String wherejpql,Object[] queryParams,
int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
// if(queryParams != null){
// System.out.println("=================queryParams length is: " + queryParams.length );
// for(int i = 0;i<queryParams.length;i++){
// System.out.println("=================queryParams is " + i +" " +queryParams[i]);
// }
// }
String entityName = getEntityName(entityClass);
QueryResult qr = new QueryResult<T>();
String sql = "select o from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql) + buildOrderby(orderby);
Query query = em.createQuery(sql);
setQueryParams(query,queryParams);
System.out.println("-------------------in DaoSupport :sql is:" + sql);
/**
* 1:查询的时候第一步查询到的都是数据表里所有的记录
* 2:再用query.setFirstResult(firstindex).setMaxResults(maxResult)
* 方法来设置要显示的首记录(即从哪一条开始显示)和要显示的记录条数
* 3:然后保存相关数据,方便前台页面显示
*/
if(firstindex != -1 && maxResult != -1){
query.setFirstResult(firstindex).setMaxResults(maxResult);
}
qr.setResultList(query.getResultList());
/**
* 这里的记录数不是要显示的记录有多少条,而是数据表里一共有多少条记录
*/
query = em.createQuery("select count(o) from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql));
setQueryParams(query,queryParams);
qr.setTotalrecord((Long)query.getSingleResult());
return qr;
}
/**
* 构建order by 语句
* orderby 语句格式:order by key1 asc,key2 asc
* @param orderby
* @return
*/
protected String buildOrderby(LinkedHashMap<String, String> orderby){
StringBuffer orderbySql = new StringBuffer("");
if(orderby !=null && orderby.size()>0){
orderbySql.append(" order by ");
//order by key1 desc,key2 asc
for(String key:orderby.keySet()){
orderbySql.append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbySql.deleteCharAt(orderbySql.length() - 1);
}
return orderbySql.toString();
}
/**
* 给where语句设置参数值
* wherejpql 语句格式:where o.property=?1,o.property=?2。
* @param query
* @param params
*/
protected void setQueryParams(Query query,Object[] params){
if(params != null && params.length > 0){
for(int i=0;i<params.length;i++){
// System.out.println("i+1 = " + (i+1) + " params[i] " + params[i] );
query.setParameter(i+1, params[i]);
}
}
}
/**
* 通过反射机制得到一个类的名字
* @param <T>
* @param entityClass
* @return
*/
protected <T> String getEntityName(Class<T> entityClass){
String entityName = entityClass.getSimpleName();
//创建一个对象的两种方法
Entity entity = entityClass.getAnnotation(Entity.class);
if(entity.name() != null && !"".equals(entity.name())){
entityName = entity.name();
}
return entityName;
}
/**
* 只对查询的结果进行分页,排序,不过滤
* @param <T>
* @param entityClass
* @param firstindex
* @param maxResult
* @param orderby
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
// TODO Auto-generated method stub
return getScrollData(entityClass,null,null,
firstindex, maxResult, orderby);
}
/**
* 只对查询结果进行分页处理,不排序,也不过滤
* @param <T>
* @param entityClass
* @param firstindex
* @param maxResult
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
int firstindex, int maxResult) {
// TODO Auto-generated method stub
return getScrollData(entityClass,null,null,
firstindex,maxResult,null);
}
/**
* 只对查询结果进行分页,过滤,不排序
* @param <T>
* @param entityClass
* @param wherejpql
* @param queryParams
* @param firstindex
* @param maxResult
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
String wherejpql, Object[] queryParams, int firstindex,
int maxResult) {
// TODO Auto-generated method stub
return getScrollData(entityClass,wherejpql,queryParams,
firstindex, maxResult, null);
}
/**
* 查询所有的对象
* @param <T>
* @param entityClass
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass) {
// TODO Auto-generated method stub
return getScrollData(entityClass,null,null,
-1, -1, null);
}
/**
* 不分页,只过滤
* @param <T>
* @param entityClass
* @param wherejpql
* @param queryParams
* @return
*/
public <T> QueryResult<T> getScrollData(Class<T> entityClass,
String wherejpql, Object[] queryParams) {
// TODO Auto-generated method stub
return getScrollData(entityClass,wherejpql,queryParams,
-1, -1, null);
}
}
- 一个实现了和数据库打交道的源文件(组装sql语句版)
- SQL 语句组装类 (JAVA 实现)
- PHP相关系列 - PHP 数据库SQL语句安装组装类
- android SQLite数据库组装sql的源码
- 对数据库的备份和恢复操作,Sql语句实现
- oracle数据库实现行转列和列转行的Sql语句
- 数据库除法的讲解和 sql 语句 not exist 实现
- 与数据库打交道的Adapter
- 数据库_MySQL_SQL语句的组装顺序 和 GROUP BY的SELECT语句中显示COUNT()为0的结果
- 数据库SQL语句实现
- 和领导打交道的原则
- SQL语句实现连接远程的数据库
- SQL语句数据库的实现课后题
- 第五章 和数据库打交道:数据建模
- Django和数据库打交道:数据建模
- 3大数据库(Sql-Server,MySql和Oracle)的分页SQL语句实现
- 3大数据库(Sql-Server,MySql和Oracle)的分页SQL语句实现
- 3大数据库(Sql-Server,MySql和Oracle)的分页SQL语句实现
- 代理模式
- 咖啡
- 获取指定dll中的某个函数的地址
- union的用法
- editplus 3 注册码
- 一个实现了和数据库打交道的源文件(组装sql语句版)
- FTPEx.au3
- 实用单表千万级分页存储过程二(不敢独享,特此分享)
- 编写shellcode的全过程
- PHP 环境配置 Win2k3+IIS
- FTP.au3
- pku 1390 Blocks(DP)
- happy
- 抓住时代给我们的大好机会(2009-07-25 22:41:43)