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();
}