package util;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import java.util.ArrayList;
import java.util.List;
/**
* 对数据操作方法的再次封装
*/
public class DataUML {
/**
* 传进一个对象进行保存
*
* @param object 对象
* 例子:插入一条记录。
* User user=new User();
* user.setId(123);
* user.setName("张三");
* DataUML.add(user);
*/
public static void add(Object object) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
s.save(object);
s.getTransaction().commit();
s.close();
sf.close();
}
/**
* 通过id获取对象
*
* @param clazz 传进来的类
* @param id 需要查询的对象的id
* @return Object对象,强制转型
* 例子:获取id为123的记录。
* User user=(User)DataUML.queryById(User.class,123);
*/
public static Object queryById(Class clazz, int id) {
Object object;
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
object = session.get(clazz, id);
session.close();
sf.close();
return object;
}
/**
* 通过sql语句查询对象数组集
*
* @param sql
* @return 因为标准SQL语句有可能返回各种各样的结果,比如多表查询,分组统计结果等等。
* 不能保证其查询结果能够装进一个Product对象中,所以返回的集合里的每一个元素是一个对象数组。
* 然后再通过下标把这个对象数组中的数据取出来。
* list.get(i)是对象;list.get(i)[j]是对象的每一个属性。
* <p/>
* 例子:查询user_表中id包含“2”的记录(此处from表名,其他都是from类名)
* String sql = "select * from user_ u where u.id like'%2%'";
* List<Object[]> list = DataUML.queryBySQL(sql);
* <p/>
* 遍历方法
* for (Object[] os : list) {
* for (Object filed : os) {
* System.out.print("属性filed为:" + filed + "\t");
* }
* System.out.println();
* }
*/
public static List<Object[]> queryBySQL(String sql) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
// Query q= s.createSQLQuery(sql);//废弃
NativeQuery q = s.createNativeQuery(sql);
List<Object[]> list = q.list();
s.getTransaction().commit();
s.close();
sf.close();
return list;
}
/**
* 删除对象
*
* @param clazz 传进来的类
* @param id 要删除的对象的id
* 例子:删除用户表中id为12的记录
* DataUML.deleteById(User.class,12);
*/
public static void deleteById(Class clazz, int id) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Object object = queryById(clazz, id);
s.delete(object);
s.getTransaction().commit();
s.close();
sf.close();
}
/**
* 在确定记录存在的情况下直接将更新后对象传进来(id不可更改)
*
* @param object 更新后的对象
*例子:更新user(在已知记录存在的情况下)
* DataDML.update(user);
*/
public static void update(Object object) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
s.update(object);
s.getTransaction().commit();
s.close();
sf.close();
}
/**
* 通过Criteria方式进行模糊查询
*
* @param clazz 要查询的类
* @param fieldName 属性名
* @param fieldValue 属性值
* @return 返回对象集
* 例子:查询姓名中包含“张”字的记录
* List<Object> users=DataDML.queryByCriteria(User.class,"name","张")
*/
public static List<Object> queryByCriteria(Class clazz, String fieldName, String fieldValue) {
List<Object> list = new ArrayList<Object>();
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Criteria c = s.createCriteria(clazz);
c.add(Restrictions.like(fieldName, "%" + fieldValue + "%"));
list = c.list();
s.getTransaction().commit();
s.close();
sf.close();
return list;
}
/**
* 模糊查询下的分页查询
*
* @param clazz 查询的类
* @param fieldName 属性名
* @param fieldValue 属性值
* @param offset 偏移量
* @param length 长度
* @return Object集
* 例子:查询用户表中第2条起、姓名中包含“张”的3条记录,不足3条就取完。
* List<Object> list = DataUML.pagination(User.class, "name", "张", 2, 3);//获取对象集
* for (int i = 0; i <list.size() ; i++) {
* User user=(User)list.get(i);//获取每一个对象,强制转型
* }
*/
public static List<Object> pagination(Class clazz, String fieldName, String fieldValue, int offset, int length) {
List<Object> list = new ArrayList<Object>();
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Criteria c = s.createCriteria(clazz);
c.add(Restrictions.like(fieldName, "%" + fieldValue + "%"));
c.setFirstResult(offset);
c.setMaxResults(length);
list = c.list();
s.getTransaction().commit();
s.close();
sf.close();
return list;
}
/**
* 统计表内所有记录
*
* @param sql 统计记录的sql语句
* @return long型长度
* 例子:查询用户表中所有记录总数
* String sql="select count(*) from User";
* long total=DataUML.count(sql);
*/
public static long count(String sql) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Query q = s.createQuery(sql);
long total = (Long) q.uniqueResult();
s.getTransaction().commit();
s.close();
sf.close();
return total;
}
/**
* 统计指定属性值的记录总数
*
* @param sql 统计记录的sql语句
* @param number 传入参数的个数,即问号的个数
* @param fieldValue 属性值数组
* @return 记录长度
* 例子:查询用户表中id包含“2013”且姓名包含“张”记录总数
* String sql="select count(*) from User u where u.name like ? and u.id like ?";
* long total=DataUML.count(sql,2,"张","2013");
*/
public static long count(String sql, int number, String... fieldValue) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Query q = s.createQuery(sql);
for (int i = 0; i < number; i++) {
q.setString(i, "%" + fieldValue[i] + "%");
}
long total = (Long) q.uniqueResult();
s.getTransaction().commit();
s.close();
sf.close();
return total;
}
}
利用java的多态性对hibernate方法的简单封装
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...
- 01. 没有亲眼所见,就不用急着用你的嘴巴来证明。 02. 对不知道的事,直接说“不知道”才是最轻松的。 03. ...