利用java的多态性对hibernate方法的简单封装

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]是对象的每一个属性。
     * 

* 例子:查询user_表中id包含“2”的记录(此处from表名,其他都是from类名) * String sql = "select * from user_ u where u.id like'%2%'"; * List list = DataUML.queryBySQL(sql); *

* 遍历方法 * for (Object[] os : list) { * for (Object filed : os) { * System.out.print("属性filed为:" + filed + "\t"); * } * System.out.println(); * } */ public static List 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 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 users=DataDML.queryByCriteria(User.class,"name","张") */ public static List queryByCriteria(Class clazz, String fieldName, String fieldValue) { List list = new ArrayList(); 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 list = DataUML.pagination(User.class, "name", "张", 2, 3);//获取对象集 * for (int i = 0; i pagination(Class clazz, String fieldName, String fieldValue, int offset, int length) { List list = new ArrayList(); 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方法的简单封装)