package com.test.cn.test; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Example; import org.hibernate.criterion.Restrictions; import com.test.cn.entity.User; import com.test.cn.HibernateSessionFactory; public class TestUser { public static void main(String[] args) { // test1(); test7(); } private static void test1() { Configuration config=new Configuration().configure(); SessionFactory sessionFactory=config.buildSessionFactory(); User user=new User(); user.setName("admin"); user.setPassword("admin"); user.setEmail("admin@126.com"); Session session=sessionFactory.openSession(); Transaction tx=session.beginTransaction(); session.save(user); tx.commit(); session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * HQL查询 * 适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。 */ @SuppressWarnings("unchecked") private static void test2() { Configuration config = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session=sessionFactory.openSession(); // String hql = "from User u where u.name = :name"; // Query query = session.createQuery(hql); // query.setString("name", "admin"); String hql = "from User u where u.name = ?"; Query query = session.createQuery(hql); query.setString(0, "admin");//注:此处从0开始 List<User> list = query.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * sql查询 * 适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台,不易维护,不面向对象。 */ @SuppressWarnings("unchecked") private static void test3(){ Configuration configuration = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); // SQLQuery q = session.createSQLQuery("select * from tb_user t where t.name = :name"); // q.setString("name", "admin"); SQLQuery q = session.createSQLQuery("select * from tb_user t where t.name = ?"); q.setString(0, "admin");//注:此处从0开始 q.addEntity(User.class); List<User> list = q.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * 对象化查询Criteria方法: * 适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。 */ private static void test4(){ Configuration configuration = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("name", "admin"));//eq是等于,gt是大于,lt是小于,or是或 criteria.add(Restrictions.eq("password", "admin")); List<User> list = criteria.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * 动态分离查询DetachedCriteria * 适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。 */ private static void test5(){ Configuration configuration = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("name", "admin"));//eq是等于,gt是大于,lt是小于,or是或 criteria.add(Restrictions.eq("password", "admin")); List<User> list = criteria.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * 例子查询 * 适用情况:面向对象操作。 缺点:适用面较HQL有限,不推荐。 */ private static void test6(){ Configuration configuration = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(User.class); criteria.add(Example.create(new User())); List<User> list = criteria.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } /** * 命名查询 * 适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象。基于hql和sql,有一定缺陷。 */ private static void test7(){ Configuration configuration = HibernateSessionFactory.getConfiguration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Query query = session.getNamedQuery("getUserById"); query.setLong("id", 2l); List<User> list = query.list(); for(User u : list){ System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail()); } session.close(); sessionFactory.close(); System.out.println("OK!"); } }
配置文件及实体类:
<?xml version="1.0" encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.test.cn.entity.User" table="tb_user"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="name" type="java.lang.String"/> <property name="password" column="password" type="java.lang.String"/> <property name="email" column="email" type="java.lang.String"/> </class> <!-- 命名查询:定义查询条件 --> <query name="getUserById"> <![CDATA[from User where id=:id]]> </query> </hibernate-mapping>
package com.test.cn.entity; public class User { private Integer id; private String name; private String password; private String email; private Integer organId; ...get/setMethod(); }