Hibernate上路_05-Hibernate核心API

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

转载于:https://my.oschina.net/vigiles/blog/175723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值