1.Configuration:配置器:
1)加载hibernate.properties和hibernate.cfg.xml,进而加载POJO.hbm.xml
2)手动加载POJO.hbm.xml配置文件:
(1)取消hibernate.cfg.xml中的自动加载POJO.hbm.xml文件的配置:
<!-- <mapping resource="cn/cvu/domain/User.hbm.xml" /> -->
(2)hibernate操作中搜的加载:
public void testQuery() {
// 当 new Configuration() 时自动加载 src/hibernate.properties文件
// configuration.configure() 时自动加载 src/hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();
// 手动加载pojo.hbm.xml文件,方式1
configuration.addResource("cn/cvu/domain/User.hbm.xml");
// 手动加载pojo.hbm.xml文件,方式2
configuration.addClass(User.class); // 搜索User.hbm.xml文件
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int id = 2;
User userGet = (User) session.get(User.class, id);
System.out.println("get: " + userGet);
transaction.commit();
session.close();
sessionFactory.close();
}
2.SessionFactory:连接厂:
一般每个应用仅创建一个连接厂。由DriverManagerConnectionProvider创建。线程安全。
1)创建连接工具类UtilGetSesstion:
package cn.cvu.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class UtilGetSesstion {
private static Configuration configuration;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
//静态代码块,仅执行一次
static {
configuration = new Configuration().configure();
serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
2)使用UtilGetSesstion:
//包...类...
public void testUtilGetSessionQuery() {
Session session=UtilGetSesstion.openSession();
Transaction transaction=session.beginTransaction();
int id=3;
User userLoad = (User) session.load(User.class, id);
System.out.println("load: "+userLoad);
transaction.commit();
session.close();
}
3.Session:会话(相当于JDBC中的Connection):
应用程序与数据库之间交互操作的一个单线程对象,Hibernate 运作的中心。非安全线程。当在方法内部使用都是线程安全的,因为方法在栈空间,线程似有。堆空间是进程共享的。
全部的Hibernate API,都是通过Session调用完成。
4.Transaction:事务:
如果没有开启事务,每个Session的操作都是一个单独的事务。
1)不自动提交,没有手动开启事务时的事务处理:
(1)hibernate.cfg.xml取消自动提交配置:
<!-- <property name="hibernate.connection.autocommit">true</property> -->
(2)操作:
public void testInsertTransaction() {
Session session = UtilGetSesstion.openSession();
//Transaction transaction = session.beginTransaction(); //没有手动开启事务
//默认每个操作时单独的事务
User user = new User();
user.setName("Michael");
user.setAge(52);
user.setCity("NewYork");
session.save(user); //事务1
int i=1/0;
User user2 = new User();
user2.setName("Big");
user2.setAge(42);
user2.setCity("Detroit");
session.save(user2); //事务2
//transaction.commit();
session.close();
}
(3)结果:
没有任何条目插入表单。
2)不自动提交,手动开启事务时的事务处理:
(1)hibernate.cfg.xml取消自动提交配置:
<!-- <property name="hibernate.connection.autocommit">true</property> -->
(2)操作:
public void testInsertTransaction() {
Session session = UtilGetSesstion.openSession();
Transaction transaction = session.beginTransaction();
//默认每个操作时单独的事务
User user = new User();
user.setName("Michael");
user.setAge(52);
user.setCity("NewYork");
session.save(user); //事务1
int i=1/0;
User user2 = new User();
user2.setName("Big");
user2.setAge(42);
user2.setCity("Detroit");
session.save(user2); //事务2
transaction.commit();
session.close();
}
(3)结果:
没有任何条目插入表单。
3)自动提交,没有手动开启事务 时的事务处理:
(1)hibernate.cfg.xml开启自动提交配置:
<property name="hibernate.connection.autocommit">true</property>
(2)操作:
public void testInsertTransaction() {
Session session = UtilGetSesstion.openSession();
//Transaction transaction = session.beginTransaction(); //没有手动开启事务
//默认每个操作时单独的事务
User user = new User();
user.setName("Michael");
user.setAge(52);
user.setCity("NewYork");
session.save(user); //事务1
int i=1/0;
User user2 = new User();
user2.setName("Big");
user2.setAge(42);
user2.setCity("Detroit");
session.save(user2); //事务2
//transaction.commit();
session.close();
}
(3)结果:
[Michael,52,NewYork]插入表单。
4)自动提交,手动开启事务时的事务处理:
(1)hibernate.cfg.xml开启自动提交配置:
<property name="hibernate.connection.autocommit">true</property>
(2)操作:
public void testInsertTransaction() {
Session session = UtilGetSesstion.openSession();
Transaction transaction = session.beginTransaction();//手动开启了事务
//默认每个操作时单独的事务
User user = new User();
user.setName("Michael");
user.setAge(52);
user.setCity("NewYork");
session.save(user); //事务1
int i=1/0;
User user2 = new User();
user2.setName("Big");
user2.setAge(42);
user2.setCity("Detroit");
session.save(user2); //事务2
transaction.commit();
session.close();
}
(3)结果:
没有任何条目插入表单。
5.Query:查询:
1)SQLQuery:session.createSQLQuery(sql语句);
2)Query:session.createQuery(hql语句);
3)无条件查询:
public void testQueryNew() {
// 1。 得到Session
Session session = UtilGetSesstion.openSession();
// 查询无需开启事务
// 2。 查询语句
String hql = "from User";
// 3。 创建Query
Query query1 = session.createQuery(hql);
// 4。 设置参数
//暂无
// 5。 执行命令
List<User> users1 = query1.list(); // list()返回结果集
System.out.println(users1);
// 查询语句
String sql = "select count(*) from table_user";
// 创建Query
Query query2 = session.createSQLQuery(sql);
// 执行命令
Object users2 = query2.uniqueResult(); //uniqueResult()返回单行结果
System.out.println(users2);
session.close();
}
4)分页查询:
public void testQueryLimit() {
// 1。 得到Session
Session session = UtilGetSesstion.openSession();
// 2。 查询语句
String hql = "from User";
// 3。 创建Query
Query query = session.createQuery(hql);
// 4。 结果集的索引始于0。从第31条开始查询
query.setFirstResult(33);
// 5。 查询13条
query.setMaxResults(13);
// 6。 执行命令
List<User> users = query.list(); // 返回分页
System.out.println(users);
session.close();
}
5)指定查询:
public void testQueryCondition() {
// 1。 得到Session
Session session = UtilGetSesstion.openSession();
/*// 2。 查询单列,默认返回对象集合。name是JavaBean-User类的一个属性
String hql = "select name from User";
// 3。 创建Query
Query query = session.createQuery(hql);
// 4。 执行命令
List<String> users = query.list(); */
// 查询多列,默认返回对象数组集合。name、age是JavaBean-User类的属性
String hql = "select name, age from User";
Query query = session.createQuery(hql);
List<String[]> users = query.list();
System.out.println(users);
session.close();
}
6)条件查询:
public void testQueryWhere() {
Session session = UtilGetSesstion.openSession();
//-----------------------------条件查询1:匿名占位符查询
//第一个问号-匿名占位符,表示参数
String hql="from User where name = ? ";
Query query=session.createQuery(hql);
//0表示第一个参数,Michael222是条件值
query.setParameter(0, "Michael222");
List<User> users=query.list();
System.out.println(users);
//-----------------------------条件查询2:有名占位符查询
//theName,参数的占位符。使用冒号声明。
hql="from User where name = :theName";
query=session.createQuery(hql);
//Eminem即是theName的参数值
query.setParameter("theName", "Alizee");
users = query.list();
System.out.println(users);
session.close();
}
6.Criteria:高级查询对象:
public void testQueryCriteria() {
Session session = UtilGetSesstion.openSession();
//创建Criteria对象(POJO字节码)
Criteria criteria = session.createCriteria(User.class);
//添加条件(Restrictions.eq(列,值))
criteria.add(Restrictions.eq("name", "Adele"));
//执行查询
List<User> users = criteria.list();
System.out.println(users);
session.close();
}
- end