package com.aowin.dao; import java.util.Date; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.aowin.model.User; public class UserDAOTest { private static SessionFactory sessionFactory; //BeforeClass:在所有方法之前执行 @BeforeClass public static void beforeClass(){ //读取配置 Configuration config = new Configuration().configure("com/aowin/res/hibernate.cfg.xml"); //创建SessionFactory对象 Hibernate操作 需要Session对象 Session对象SessionFactory对象创建而来 //SessionFactory从配置信息中创建 sessionFactory = config.buildSessionFactory(); } //Test:要求返回值为void @Test public void saveUser(){ User user = new User(); user.setAddress("上海"); user.setAge(22); user.setCreateTime(new Date()); user.setUsername("张三"); //如果用openSession 则打开的Sesion需要手动管理(开启和关闭) Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(user); session.getTransaction().commit(); session.close(); } @Test public void saveUser2(){ User user = new User(); user.setAddress("杭州西湖区"); user.setAge(23); user.setCreateTime(new Date()); user.setUsername("舒峰"); //第二种拿到Session的方法 //getCurrentSession:不是手动管理的,交给Hibernate管理, //前提:<property name="current_session_context_class">thread</property> Session session = sessionFactory.getCurrentSession(); session.save(user); } /** * 根据主键 删除 */ @Test public void testDetele1(){ User user = new User(); user.setId(3); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //有ID就能delete //new的id 数据库中没有记录时 也发sql,并报错 //new的id 数据库中有记录 就删除了 session.delete(user);//Hibernate 不建议直接对数据表中的字段进行操作 session.getTransaction().commit(); } //HQL(按名字删除)- 查询 @Test public void getUesr() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //get():查询方法之一 User user = (User)session.get(User.class, 1); System.out.println(user.getUsername()); session.getTransaction().commit(); } @Test public void testSave(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User u = (User)session.get(User.class, 4);//查询纳入session管理 u.setAddress("杭州");//持久状态在事务提交的时候会和数据库同步 session.getTransaction().commit(); } /** * 更新 */ @Test public void testUpdate1(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User)session.get(User.class, 2); user.setUsername("舒峰"); session.update(user); session.getTransaction().commit(); } /** * merge: * 没id,往数据库增加 一条记录:发一个insert * 有id,但是数据库中没记录:往数据库增加一条记录. 发一个select 一个insert * 有id,数据库中有对应记录:发一个select 一个update,更新set后的字段,其他字段不变 */ @Test public void testUpdate2(){ User user = new User(); user.setUsername("张三"); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //merge:合并 session.merge(user); session.getTransaction().commit(); } @Test public void testSave2(){ User user = new User(); user.setAddress("上海"); user.setAge(22); user.setCreateTime(new Date()); user.setUsername("张三"); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(user); user.setUsername("王五"); session.getTransaction().commit(); } //HQL语句能够 实现sql的复杂操作 /** * 按名字删除 */ @Test public void testDelete(){ //hql语句 类似SQL语句. //hql操作的是model类 //SQL语句操作的是表的字段名 String hql = "delete from User u where u.username = ? "; Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //返回值表示影响的行数 int result = session.createQuery(hql).setString(0,"王五").executeUpdate(); System.out.println(result); session.getTransaction().commit(); } /** * 根据id查找 get */ @Test public void testGetUser1(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //Load:只有在用到的时候才去数据库查询 延迟加载 User user = (User)session.load(User.class,7); session.getTransaction().commit(); } @Test public void testGetUser2(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //语句一执行就取数据库加载 User user = (User)session.get(User.class,7); session.getTransaction().commit(); } @Test public void testGetAllUser(){ String hql ="from User"; Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); List<User> userList = (List<User>)session.createQuery(hql).list(); for(User user : userList){ System.out.println(user.getId()+"-"+user.getUsername()); } session.getTransaction().commit(); } @Test public void testSelectByUsername(){ String hql = " from User u where u.username = ? and u.age= ?"; Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); List<User> userList = (List<User>)session.createQuery(hql).setString(0,"张三").setInteger(1, 22).list(); for(User user :userList){ System.out.println(user.getId()+"-"+user.getAge()); } session.getTransaction().commit(); } @AfterClass public static void close(){ sessionFactory.close(); } }
package com.aowin.dao; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.aowin.model.User; import com.aowin.vo.UserVO; public class UserDAO { private static SessionFactory sessionFactory; @BeforeClass public static void beforClass() { Configuration conf = new Configuration().configure("com/aowin/res/hibernate.cfg.xml"); sessionFactory = conf.buildSessionFactory(); } @AfterClass public static void close(){ sessionFactory.close(); } @Test public void testFlush() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User) session.load(User.class, 16); user.setAddress("杭州萧山5"); // session.flush();//强制将session管理的对象(持久态)同步到数据库 user.setAddress("杭州西湖12"); session.getTransaction().commit();// 如果对数据库做修改update delete save 都要打开事务 System.out.println(user.getId());// 提交事务 } /** * Clear方法:清除Session管理的对象(持久态对象以HashMap形式纳入Session管理) */ @Test public void testClear() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User) session.load(User.class, 1); user.setAddress("杭州萧山5"); session.clear(); user.setAddress("杭州西湖12"); session.save(user); session.getTransaction().commit();// 如果对数据库做修改update delete save 都要打开事务 // 提交事务 } @Test public void testSelect() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); //String hql = from User u where u.id > ? and u.id < ? 和下面语句等效 String hql = "from User u where u.id >:a and u.id<:b"; List<User> list = session.createQuery(hql).setParameter("a", 2).setParameter("b", 16).list(); for(User user : list){ System.out.println(user.getUsername()); } session.getTransaction().commit(); } @Test public void testSelect2() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Query query = session.createQuery("from User"); query.setMaxResults(10);//每页10条 query.setFirstResult(5);//参数5:表示从第六条开始 取10条; List<User> list = (List<User>)query.list(); for(User user:list){ System.out.println(user.getId()); } session.getTransaction().commit(); } @Test public void testLoad(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User) session.get(User.class, 1); session.getTransaction().commit(); } @Test public void testSelect3() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Query query = session.createQuery("select new com.aowin.vo.UserVO( u.username,u.address ) from User u "); // List<Object[]> objectList = query.list(); List<UserVO> userVOList = query.list(); for(UserVO userVO : userVOList){ System.out.println(userVO.getAddress()); } // UserVO userVO = null; // for(Object[] object : objectList){ // userVO = new UserVO(); // userVO.setAddress(object[0]+""); // userVO.setUsername(object[1]+""); // userVOList.add(userVO); // } session.getTransaction().commit(); } /** * 传原生的SQL 不是HQL * 用createSQLQuery创建query对象 * Hibernate推荐使用HQL,但是也提供了对SQL的支持 */ @Test public void testSelect4() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Query query = session.createSQLQuery(" select * from user "); List<Object[]> objectList = query.list(); for(Object[] object : objectList){ System.out.println(object[0]); } session.getTransaction().commit(); } @Test public void testSelect5() { Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Query query = session.createSQLQuery(" select * from user ").addEntity(User.class); List<User> objectList = query.list(); for(User user : objectList){ System.out.println(user.getUsername()); } session.getTransaction().commit(); } /** * load:默认延迟加载(lazy="true") * */ @Test public void testSelect6(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User)session.load(User.class,1); session.getTransaction().commit(); } /** * 大部分的情况下 让lazy保持默认的就可以了 */ @Test public void testSelect7(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User user = (User)session.load(User.class,1); System.out.println(user.getAddress()); session.getTransaction().commit(); } /** *Iterate:发一条hql把所有id取出来 *用的时候再根据id取对象 *Iterate会利用缓存(查id的时候不会利用缓存) */ @Test public void testSelect8(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Iterator<User> userIterate = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();//查询所有的id,不会利用写的缓存,但会利用读的缓存 while(userIterate.hasNext()){ User user = userIterate.next();//真正的取查询用户,利用读的缓存和写的缓存(session管理的 HashMap) System.out.println(user.getAddress()); } Iterator<User> userIterate2 = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();//只发查询id的sql while(userIterate2.hasNext()){//利用读的缓存和写的缓存 User user = userIterate2.next();//缓存中存在不去数据库中查询 user.getAddress(); } session.getTransaction().commit(); } /** * session级别的缓存 * list:发一条hql 所有的数据取出来 * list:不会利用缓存 * 区别:list一次性取出来 iterate分布取出来(对数据库压力小) */ @Test public void testSelect9(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); List<User> userList = session.createQuery("from User where id > ? ").setParameter(0,12).list(); for(User user :userList){ System.out.println(user.getUsername()); } List<User> userList2 = session.createQuery("from User where id > ? ").setParameter(0,12).list(); for(User user :userList2){ System.out.println(user.getUsername()); } session.getTransaction().commit(); } /** * session级别的缓存 */ @Test public void testSelect10(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Iterator<User> userIterate = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate(); while(userIterate.hasNext()){ User user = userIterate.next(); System.out.println(user.getAddress()); } session.clear();//清空session级别的缓存 Iterator<User> userIterate2 = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate(); while(userIterate2.hasNext()){ //具体使用User的时候先取看缓存中是否存在 如果存在则直接从缓存中拿(以HashMap的形式存在缓存中) User user = userIterate2.next(); user.getAddress(); } session.getTransaction().commit(); } //查询掌握好HQL形式/get/load(区别)/lazy的设置/SQL //Criteria(了解) //一般情况下hibernate不支持*,count(*)除外. @Test public void testSelect11(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); String hql = "select * from User where id > ? "; session.createQuery(hql).setParameter(0, 12).list(); session.getTransaction().commit(); } /** * 返回一条记录可以用uniqueResult * count(*) 返回的是Long类型的 */ @Test public void testSelect12(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); String hql = "select count(*) from User "; // Long l = (Long)session.createQuery(hql).setParameter(0, 12).uniqueResult(); Query q = session.createQuery(hql); Long l =(Long) q.uniqueResult(); System.out.println(l); session.getTransaction().commit(); } }