

1 package cn.db.po.test; 2 3 import java.util.List; 4 5 import cn.db.po.User; 6 import cn.db.po.biz.UserBiz; 7 8 public class TestFirstHib { 9 public static void main(String[] args) { 10 //创建一个新用户 11 //User user=new User(); 12 //user.setId(1001); 13 /* 14 * 删除的时候只要给后台传ID便可 15 * user.setName("accp"); 16 user.setPassword("1111"); 17 user.setTelephone("1341212"); 18 user.setUserName("加多宝");*/ 19 20 //增加(保存)方法 21 UserBiz ub=new UserBiz(); 22 /*ub.addNewUser(user); 23 System.out.println("add seccess");*/ 24 25 26 //查询方法 27 /*user = ub.getUser(3); 28 System.out.println("查询结果:"+user.getUserName());*/ 29 30 31 //更新方法 32 /*ub.updateUser(user); 33 user = ub.getUser(4); 34 System.out.println("update success"+user.getUserName());*/ 35 36 37 /** 38 * 测试saveOrUpdate.如果不给指定ID则直接增加一行; 39 * 如果给定ID则先查询数据库有没有这一列,没有则执行更新 40 */ 41 //ub.saveOrUpdateBiz(user); 42 43 44 //动态更新底层机制理解版本 45 /*ub.dynamicUpdate(user);*/ 46 47 //删除方法测试 48 //ub.delete(user); 49 50 //因为现在没有提供参数所以括号里面写null 51 List<User> list = ub.findUsers(null); 52 53 for (User u: list) 54 System.out.println("users对象名="+u.getName()); 55 56 } 57 }


1 package cn.db.po.biz; 2 3 import java.util.List; 4 5 import org.hibernate.HibernateException; 6 import org.hibernate.Transaction; 7 8 import cn.db.po.User; 9 import cn.db.po.common.HibernateSessionFactory; 10 import cn.db.po.dao.UserDao; 11 12 public class UserBiz { 13 private UserDao dao = new UserDao(); 14 15 public void addNewUser(User user) { 16 Transaction tx = null;// 定义事务处理对象 17 18 // 通过会话开启事务,拿到的是唯一的属于自己的会话getSession()会调用getCurrentSession() 19 try { 20 // 1.获得会话并开启事务 21 tx = HibernateSessionFactory.getSession().beginTransaction(); 22 dao.save(user);// 2.调Dao的方法 23 tx.commit();// 3.提交 24 } catch (HibernateException e) { 25 if (tx != null) { 26 tx.rollback();// 4.失败回滚 27 } 28 } 29 // getCurrentSession()不管提交成功还是失败回滚都会自动关闭连接 30 } 31 32 // 按ID查询 33 public User getUser(java.io.Serializable id) { 34 Transaction tx = null; 35 User user = null; 36 try { 37 // 1.获得会话并开启事务 38 tx = HibernateSessionFactory.getSession().beginTransaction(); 39 user = dao.findById(id); 40 tx.commit();// 3.提交 41 } catch (HibernateException e) { 42 if (tx != null) { 43 tx.rollback();// 4.失败回滚 44 } 45 } 46 47 return user; 48 } 49 50 // 更新操作 51 public void updateUser(User user) { 52 Transaction tx = null; 53 54 try { 55 // 1.获得会话并开启事务 56 tx = HibernateSessionFactory.getSession().beginTransaction(); 57 dao.update(user); 58 tx.commit();// 3.提交 59 } catch (HibernateException e) { 60 if (tx != null) { 61 tx.rollback();// 4.失败回滚 62 } 63 } 64 } 65 66 public void saveOrUpdateBiz(User user) { 67 Transaction tx = null; 68 69 try { 70 // 1.获得会话并开启事务 71 tx = HibernateSessionFactory.getSession().beginTransaction(); 72 dao.saveOrUpdateDemo(user); 73 tx.commit();// 3.commit=flash()+commit();提交触发脏检查 74 } catch (HibernateException e) { 75 if (tx != null) { 76 tx.rollback();// 4.失败回滚 77 } 78 } 79 } 80 81 // 业务层的动态更新方法 82 public void dynamicUpdate(User user) { 83 Transaction tx = null; 84 85 try { 86 tx = HibernateSessionFactory.getSession().beginTransaction(); 87 dao.dynamicUpdate(user); 88 tx.commit(); 89 } catch (HibernateException e) { 90 if (tx != null) { 91 tx.rollback(); 92 } 93 } 94 } 95 96 // 业务层的删除方法 97 public void delete(User user) { 98 Transaction tx = null;// 首先定义事务处理对象 99 100 try { 101 tx = HibernateSessionFactory.getSession().beginTransaction(); 102 dao.delete(user); 103 tx.commit(); 104 } catch (HibernateException e) { 105 if (tx != null) { 106 tx.rollback(); 107 } 108 } 109 110 } 111 112 // HQL查询演示视频上传直接复制写的,传的参数没管.??为什么? 113 public List<User> findUsers(User user) { 114 Transaction tx = null; 115 List<User> list = null; 116 117 try { 118 tx = HibernateSessionFactory.getSession().beginTransaction(); 119 list = dao.findUser(); 120 tx.commit(); 121 } catch (HibernateException e) { 122 e.printStackTrace(); 123 if (tx != null) { 124 tx.rollback(); 125 } 126 } 127 return list; 128 } 129 }


1 package cn.db.po.dao; 2 //dao层开始测试 3 import java.util.List; 4 5 import org.hibernate.Query; 6 7 import cn.db.po.User; 8 import cn.db.po.common.HibernateSessionFactory; 9 10 public class UserDao { 11 //hibernate添加的方法1 12 public void save(User user){ 13 HibernateSessionFactory.getSession().save(user); 14 } 15 16 /** 17 * hibernate添加的方法2 18 * 添加和更新很相似,干脆合并成一个方法了.就是说前台传过一个对象来,发现有变化就更新没变化就保存 19 */ 20 public void saveOrUpdateDemo(User user){ 21 HibernateSessionFactory.getSession().saveOrUpdate(user); 22 } 23 24 25 //查询。按主键查询时传参 传实现的接口,User.class表示返回这个类的信息 26 public User findById(java.io.Serializable id){ 27 return (User)HibernateSessionFactory.getSession() 28 .get(User.class, id); 29 30 /** 31 * 还有一个load()方法也是查询,使用、传参和get()一样的但是机制不一样. 32 * 1.load是延迟加载。如果想实现个get一样的机制要在xml属性里面加lazy="false" 33 * 2.get()查询到id是空时返回null,load()则直接报错; 34 */ 35 } 36 37 38 //hibernate更新的方法1 39 public void update(User user){ 40 41 HibernateSessionFactory.getSession().update(user); 42 43 } 44 45 //hibernate动态更新演示 46 public void dynamicUpdate(User user){ 47 48 /*1.//(动态更新底层机制理解版本) 49 * 50 * User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId()); 51 * 检查的时候hibernate同时也得到了一个快照 52 User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId()); 53 *//** 54 * 首先ID不能动. 55 * 从传过来的user对象里面取到的值赋值给查出来的u;user里面封装的是希望变成的值, 56 * u里面是从数据库拿到的值. 57 * 也就是相当于从数据库拿出来的时候拍了张快照,然后接着set用新值填充。接下来提交事务便可. 58 * hibernate会先查询看哪里变化了,如果没有变化什么都不做; 59 * 60 *//* 61 u.setName(user.getName()); 62 u.setPassword(user.getPassword()); 63 u.setIsAdmin(user.getIsAdmin()); 64 u.setTelephone(user.getTelephone()); 65 u.setUserName(user.getUserName());*/ 66 //这时脏数据就产生了 67 68 //2.简洁化后的merge()方法,实现原理和底层笨的方法是一样的. 69 HibernateSessionFactory.getSession().merge(user); 70 71 } 72 73 74 //删除 75 public void delete(User user){ 76 //hibernate建议先查询,根据返回的id来删除 77 //User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId()); 78 //HibernateSessionFactory.getSession().delete(u); 79 80 /** 81 * 也可以根据用户对象来删除,前提是测试类中有指定id(也就是执行的时候给数据库指定一个id), 82 * 以及映射配置文件中的映射列不能有非空条件存在 83 */ 84 HibernateSessionFactory.getSession().delete(user); 85 86 } 87 88 /*//该方法是举例演示不执行:持久化所有对象,为了防止内存堵塞,每持久化20个对象进行一次缓存清理和清空 89 public void saveAll(List<User> users){ 90 91 for (int i = 0; i < users.size(); i++) { 92 HibernateSessionFactory.getSession().save(users); 93 if (i%20==0) { 94 HibernateSessionFactory.getSession().close(); 95 HibernateSessionFactory.getSession().clear(); 96 } 97 } 98 99 }*/ 100 101 102 //HQL查询 103 public List<User> findUser(){ 104 105 //根据语句创建一个Query的实例 106 Query q = HibernateSessionFactory.getSession() 107 .createQuery("from user"); 108 109 return q.list(); 110 } 111 112 }
报错信息:(dao层最有一个HQL 方法)
org.hibernate.hql.ast.QuerySyntaxException: user is not mapped [from user]
检查后发现,dao层的映射语句
Query q = HibernateSessionFactory.getSession()
.createQuery("from user");----->from user的U没有大写.....
因为hibernate查询时候找的是对象,对象对应的类名映射到数据库中的表,from 类(表)或者属性(列),脑补一下xml配置,而不是直接from 表名.
oh my god一个小时就浪费在这种蠢事上了,所以代码编辑的时候一定要动脑后动手,而不是晕乎乎的敲或者复制粘贴,海燕那,你就长点儿心吧!