zoukankan      html  css  js  c++  java
  • hibernate的基础学习

    工具类:

     1 public class H3Util {
     2 
     3     private static final SessionFactory sessionFactory = buildSessionFactory();
     4 
     5     private static SessionFactory buildSessionFactory() {
     6         try {
     7             //从类加载路径中读取hibernate.cfg.xml文件生成SessionFactory对象
     8             return new Configuration().configure().buildSessionFactory();
     9         } catch (Throwable ex) {
    10             System.err.println("Initial SessionFactory creation failed." + ex);
    11             throw new ExceptionInInitializerError(ex);
    12         }
    13     }
    14 
    15     public static SessionFactory getSessionFactory() {
    16         return sessionFactory;
    17     }
    18 }
    View Code

    基础的增删改查:

     1 public class TestHibernate {
     2 
     3     @Test
     4     public void add() {
     5         SessionFactory sessionFactory = H3Util.getSessionFactory();
     6         Session session = sessionFactory.openSession();
     7         Transaction transaction = session.beginTransaction();
     8         for (int i = 0; i < 20; i++) {
     9             session.save(new User(null, "test"+i, "123456", new Date(), 1, 1000.0f));
    10         }
    11         transaction.commit();
    12         session.close();
    13         System.out.println("成功");
    14     }
    15     
    16     @Test
    17     public void find() {
    18         SessionFactory sessionFactory = H3Util.getSessionFactory();
    19         Session session = sessionFactory.openSession();
    20         System.out.println("+++++++++");
    21         User user = (User)session.get(User.class, 1);
    22         System.out.println("======");
    23         System.out.println(user);
    24         session.close();
    25     }
    26     
    27     @Test
    28     public void del() {
    29         SessionFactory sessionFactory = H3Util.getSessionFactory();
    30         Session session = sessionFactory.openSession();
    31         Transaction transaction = session.beginTransaction();
    32         User user = (User)session.get(User.class, 2);
    33         session.delete(user);
    34         transaction.commit();
    35         session.close();
    36         System.out.println("成功"+user);
    37     }
    38     
    39     @Test
    40     public void update() {
    41         SessionFactory sessionFactory = H3Util.getSessionFactory();
    42         Session session = sessionFactory.openSession();
    43         Transaction transaction = session.beginTransaction();
    44         User user = (User)session.get(User.class, 1);
    45         user.setPassword("111111");
    46         session.update(user);
    47         transaction.commit();
    48         session.close();
    49         System.out.println("成功"+user);
    50     }
    51     
    52     @Test
    53     public void findList() {
    54         SessionFactory sessionFactory = H3Util.getSessionFactory();
    55         Session session = sessionFactory.openSession();
    56         String hql = "from User";
    57         Query query = session.createQuery(hql);
    58         @SuppressWarnings("unchecked")
    59         List<User> uList = query.list();
    60         for (User user : uList) {
    61             System.out.println(user);
    62         }
    63         session.close();
    64     }
    65     
    66 }
    View Code

    测试hibernate的对象状态:

     1 /**
     2  * @author nunu
     3  * 测试 hibernate 对象
     4  */
     5 public class TestHibernateObject {
     6 
     7     /**
     8      * 共有三种状态: 
     9      *    1、瞬时对象:TO   直接new对象
    10      *       特点:
    11      *       1、不受hibernate管理(session管理)
    12      *       2、没有OID
    13      *    2、持久化对象:PO 
    14      *       特点:
    15      *       1、受hibernate管理(session管理)
    16      *       2、有OID
    17      *    3、离线(托管)对象:DO
    18      *       特点:
    19      *       1、曾经受过hibernate管理,现在不受管理的(session)
    20      *       2、有OID
    21      */
    22     @Test
    23     public void status(){
    24         SessionFactory sf = H3Util.getSessionFactory();
    25         Session session = sf.openSession();
    26         Transaction ts  = session.beginTransaction();
    27         //user --> TO
    28         User user = new User(null, "nnn", "1234568", new Date(), 0, 999.9f);
    29         session.save(user);
    30         ts.commit();
    31         //session.close();
    32         //user --> PO
    33         System.out.println(user);
    34         session.delete(user);
    35         //user --> DO
    36         System.out.println(user+"----");
    37     }
    38     
    39     
    40     /**
    41      * session 中数据发生更改,若事务提交,数据库中数据修改
    42      * 若事务不提交,session关闭时,不会修改数据库
    43      */
    44     @Test
    45     public void addUser() {
    46         SessionFactory sf = H3Util.getSessionFactory();
    47         Session session = sf.openSession();
    48         Transaction ts  = session.beginTransaction();
    49         /**
    50          * PO:持久化对象--数据库表中的记录同步的对象,只要该对象发生任何改变,session关闭时都会同步该对象的状态到数据库中的表记录上
    51         User user = (User) session.get(User.class, "4028810d57c20db20157c20db5920013");
    52         user.setUsername("wangwu");
    53         */
    54         
    55         //DO
    56         //User user = new User("4028408157c0f5920157c0f593e100001", "wangwu", "12312", new SimpleDateFormat("yyyy-MM-dd").parse("2016-10-14"), 1, 1000.0f);
    57         //user.setUsername("wangwu");
    58         
    59         //DO--PO :session  -->一定会发生sql语句
    60         //session.update(user);
    61         
    62         //PO
    63         User user = (User) session.get(User.class, "4028810d57c20db20157c20db5920013");
    64         
    65         //PO--TO
    66         session.delete(user);
    67         
    68         /**
    69          * 若不提交事务不会进行数据库修改
    70          */
    71         ts.commit();
    72         //session会拿session中的所有的持久化对象和
    73         session.close();
    74         
    75         System.out.println(user);
    76     }
    77 }
    View Code

    hibernate的一级缓存:

     1 /**
     2  * @author nunu
     3  * 一级缓存
     4  */
     5 public class TestHibernateSession {
     6 
     7     /**
     8      * 查询结果会放入session中,从session中获取结果不需要查询语句
     9      */
    10     @Test
    11     public void sessionQuery() {
    12         SessionFactory sf = H3Util.getSessionFactory();
    13         Session session = sf.openSession();
    14         
    15         //默认所有查询,都会将结果存入到一级缓存(session)
    16         //HQL、QBC、原生SQL查找:每次都会发送新sql,不会去session中获取
    17         Query query = session.createQuery("from User where userId = '4028810d57c20db20157c20db58c000e'");
    18         User user = (User)query.uniqueResult();
    19         
    20         Query query1 = session.createQuery("from User where userId = 'ff80808157c72cbe0157c72cc1540000'");
    21         User user1 = (User)query1.uniqueResult();
    22         System.out.println("0"+user);
    23         System.out.println("1"+user1);
    24         User user2 = (User)session.get(User.class,"4028810d57c20db20157c20db58c000e");
    25         //user2的获取不会发出查询语句
    26         System.out.println("2"+user2);
    27         session.close();
    28     }
    29     
    30     
    31     /**
    32      * 不发出update方法,修改session中结果是,再次获取的该值是修改过的结果
    33      * 
    34      * 先去session缓存(一级缓存)查询看有没对应的对象
    35      * 如果没有就会立即(无论有没有使用到该对象)发生sql语句去数据库查找,
    36      * 查询到之后会将查询结果再存入到session缓存(一级缓存中)
    37      */
    38     @Test
    39     public void testSessionUpdate() {
    40         SessionFactory sf = H3Util.getSessionFactory();
    41         Session session = sf.openSession();
    42         User user = (User)session.get(User.class,"4028810d57c20db20157c20db5920013");
    43         
    44         user.setUsername("admin");
    45         
    46         //不会发送sql语句:
    47         //User user1 = (User)session.get(User.class,"4028810d57c20db20157c20db5920013");
    48         //System.out.println(user1);
    49         //获取到是最新的对象信息
    50         //System.out.println(user1.getUsername());
    51         
    52         session.close();
    53     }
    54     
    55     
    56     /** 
    57      * 懒加载
    58      * org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    59      * 先去session缓存(一级缓存)查询看有没对应的对象
    60      * 如果没有,再看程序中有没有使用改对象到除OID之外的属性,如果只是使用了OID它不会发送任何sql语句
    61      * 但是如果使用除OID之外的属性,此时(使用之前)才会发送sql语句查询
    62      */
    63     @Test
    64     public void testLoad() {
    65         SessionFactory sf = H3Util.getSessionFactory();
    66         Session session = sf.openSession();
    67         User user1 = (User) session.load(User.class, "4028810d57c20db20157c20db5920013");
    68         User user2 = (User) session.load(User.class, "ff80808157c72cbe0157c72cc1540000");
    69         System.out.println("--------------");
    70         
    71         System.out.println(user1);
    72         System.out.println(user2);
    73         
    74         session.close();
    75         
    76         //发送:sql
    77         //System.out.println(user.getUsername());
    78         
    79         //System.out.println(user1.getUsername());
    80     }
    81 }
    View Code

    hibernate的模糊查询、单条记录查询、分页查询、、等单表基本查询

      1 public class TestQuery {
      2     @Test
      3     public void list() {
      4         SessionFactory sessionFactory = H3Util.getSessionFactory();
      5         Session session = sessionFactory.openSession();
      6         String hql = "from User";
      7         Query query = session.createQuery(hql);
      8         @SuppressWarnings("unchecked")
      9         List<User> uList = query.list();
     10         for (User user : uList) {
     11             System.out.println(user);
     12         }
     13         session.close();
     14     }
     15     
     16     /**
     17      * 模糊查询
     18      */
     19     @Test
     20     public void list1() {
     21         SessionFactory sessionFactory = H3Util.getSessionFactory();
     22         Session session = sessionFactory.openSession();
     23         String hql = "from User as u where u.username like :username";
     24         Query query = session.createQuery(hql);
     25         query.setString("username", "%test1%");
     26         @SuppressWarnings("unchecked")
     27         List<User> uList = query.list();
     28         for (User user : uList) {
     29             System.out.println(user);
     30         }
     31         session.close();
     32     }
     33     
     34     /**
     35      * 模糊查询
     36      */
     37     @Test
     38     public void list2() {
     39         SessionFactory sessionFactory = H3Util.getSessionFactory();
     40         Session session = sessionFactory.openSession();
     41         String hql = "from User as u where u.username like ?";
     42         Query query = session.createQuery(hql);
     43         query.setString(0, "%test1%");
     44         @SuppressWarnings("unchecked")
     45         List<User> uList = query.list();
     46         for (User user : uList) {
     47             System.out.println(user);
     48         }
     49         session.close();
     50     }
     51     
     52     /**
     53      * 单个记录查询
     54      */
     55     @Test
     56     public void uniqueResult() {
     57         SessionFactory sessionFactory = H3Util.getSessionFactory();
     58         Session session = sessionFactory.openSession();
     59         String hql = "from User where userId = '4028810d57c20db20157c20db58c000a'";
     60         Query query = session.createQuery(hql);
     61         User u = (User) query.uniqueResult();
     62         System.out.println(u);
     63         session.close();
     64     }
     65     //findUsername
     66     @Test
     67     public void findUsername() {
     68         SessionFactory sessionFactory = H3Util.getSessionFactory();
     69         Session session = sessionFactory.openSession();
     70         String hql = "select username from User";
     71         Query query = session.createQuery(hql);
     72         @SuppressWarnings("unchecked")
     73         List<String> names = query.list();
     74         for (String string : names) {
     75             System.out.println("==="+string);
     76         }
     77         session.close();
     78     }
     79     
     80     
     81     @Test//查询多个属性(投影)
     82     public void findUsernameAndId(){
     83         SessionFactory sf = H3Util.getSessionFactory();
     84         Session session = sf.openSession();
     85         
     86         //sql:select username,sex from t_user
     87         //String hql = "select sex,username from User where userId = '4028408157bbe02f0157bbe030820000' ";
     88         //Query query = session.createQuery(hql);
     89         
     90         //返回值至多有一个:多了就会报异常 org.hibernate.NonUniqueResultException: query did not return a unique result: 2
     91         /*Object[] obj = (Object[]) query.uniqueResult();
     92         
     93         System.out.println("sex"+obj[0]);
     94         System.out.println("username"+obj[1]);*/
     95         
     96         //将查询结果封装到对象中:提供大量的构造方法
     97         String hql = "select new User(userId,username) from User where userId = '4028810d57c20db20157c20db58b0005' ";
     98         Query query = session.createQuery(hql);
     99         User user = (User)query.uniqueResult();
    100         
    101         System.out.println(user);
    102     }
    103     
    104     /**
    105      * 分页查询
    106      */
    107     @Test
    108     public void findByPage() {
    109         SessionFactory sf = H3Util.getSessionFactory();
    110         Session session = sf.openSession();
    111         
    112         
    113         int currentPage = 2;
    114         int pageSize = 3;
    115         String hql = "from User";
    116         Query query = session.createQuery(hql);
    117         query.setFirstResult((currentPage-1)*pageSize);
    118         query.setMaxResults(pageSize);
    119         @SuppressWarnings("unchecked")
    120         List<User> uList = query.list();
    121         for (User user : uList) {
    122             System.out.println(user);
    123         }
    124         session.close();
    125     }
    126     
    127     
    128     @Test//固定条件查询:查询username = 李四
    129     public void findByUsername(){
    130         SessionFactory sf = H3Util.getSessionFactory();
    131         Session session = sf.openSession();
    132         String hql = "from User where username = '李四'";
    133         Query query = session.createQuery(hql);
    134         @SuppressWarnings("unchecked")
    135         List<User> list = query.list();
    136         for (User user : list) {
    137             System.out.println(user);
    138         }
    139     }
    140     @Test//可变参条件查询:查询username = 李四
    141     public void findByUsername1(){
    142         String username = "李四";
    143         int sex = 1;
    144         float salary = 10000.0f;
    145         SessionFactory sf = H3Util.getSessionFactory();
    146         Session session = sf.openSession();
    147         //String hql = "from User where  sex = ? and username = ? and salary = ?";
    148         //Query query = session.createQuery(hql);
    149         //为?设置具体数值
    150         //只能使用索引方式设置值:此形式参数传递索引,灵活度太差,不推荐使用
    151         //query.setString(0, username);    
    152         //query.setInteger(1, sex);
    153         //query.setFloat(2, salary);
    154         
    155         
    156         //使用:别名 占位符形式
    157         //使用属性名(占位符)方式设置值(推荐):名称和:后面的一致
    158         String hql = "from User where  sex = :sex and username = :username and salary = :salary";
    159         Query query = session.createQuery(hql);
    160         query.setString("username", username);
    161         query.setInteger("sex", sex);
    162         //query.setFloat("salary", salary);
    163         query.setParameter("salary", salary);//如果不确定类型可以使用该方式,不推荐使用
    164         
    165         @SuppressWarnings("unchecked")
    166         List<User> list = query.list();
    167         for (User user : list) {
    168             System.out.println(user);
    169         }
    170     }
    171     
    172     @Test//统计记录个数
    173     public void findCount(){
    174         SessionFactory sf = H3Util.getSessionFactory();
    175         Session session = sf.openSession();
    176         String hql = "select count(*) from User";
    177         Query query = session.createQuery(hql);
    178         
    179         Long count = (Long) query.uniqueResult();
    180         System.out.println(count);
    181     }
    182     
    183     @Test//最小值
    184     public void findMin(){
    185         SessionFactory sf = H3Util.getSessionFactory();
    186         Session session = sf.openSession();
    187         //返回值:和字段类型一致
    188         String hql = "select min(salary) from User";
    189         Query query = session.createQuery(hql);
    190         
    191         Float min = (Float) query.uniqueResult();
    192         System.out.println(min);
    193     }
    194     
    195     @Test//求和
    196     public void findSum(){
    197         SessionFactory sf = H3Util.getSessionFactory();
    198         Session session = sf.openSession();
    199         //返回值:整形Long/小数Double
    200         String hql = "select sum(salary) from User";
    201         Query query = session.createQuery(hql);
    202         
    203         Double sum = (Double) query.uniqueResult();
    204         System.out.println(sum);
    205     }
    206     @Test//求平均值
    207     public void findAvg(){
    208         SessionFactory sf = H3Util.getSessionFactory();
    209         Session session = sf.openSession();
    210         //返回值:Double
    211         String hql = "select avg(salary) from User";
    212         Query query = session.createQuery(hql);
    213         
    214         Double avg = (Double) query.uniqueResult();
    215         System.out.println(avg);
    216     }
    217     
    218     @Test//求分组查找
    219     public void findGroup(){
    220         SessionFactory sf = H3Util.getSessionFactory();
    221         Session session = sf.openSession();
    222         String hql = "select sex, count(*) from User group by sex";
    223         Query query = session.createQuery(hql);
    224         @SuppressWarnings("unchecked")
    225         List<Object[]> list = query.list();
    226         for (int i=0;i<list.size();i++) {
    227             System.out.println(list.get(i)[0]+":"+list.get(i)[1]);
    228         }
    229     }
    230     @Test//求排序
    231     public void findOrder(){
    232         SessionFactory sf = H3Util.getSessionFactory();
    233         Session session = sf.openSession();
    234         String hql = "from User order by salary asc,sex asc";
    235         Query query = session.createQuery(hql);
    236         @SuppressWarnings("unchecked")
    237         List<User> list = query.list();
    238         for (User user : list) {
    239             System.out.println(user);
    240         }
    241     }
    242     @Test//求排序
    243     public void findOrder1(){
    244         SessionFactory sf = H3Util.getSessionFactory();
    245         Session session = sf.openSession();
    246         Query query = session.getNamedQuery("findOrder");
    247         @SuppressWarnings("unchecked")
    248         List<User> list = query.list();
    249         for (User user : list) {
    250             System.out.println(user);
    251         }
    252     }
    253 }
    View Code

    hibernate的QBC:query by criteria

      1 /**
      2  * @author nunu
      3  * QBC:query by criteria
      4  */
      5 public class TestCriteria {
      6 
      7     /**
      8      * criteria 普通查询
      9      */
     10     @Test
     11     public void list(){
     12         SessionFactory sf = H3Util.getSessionFactory();
     13         Session session = sf.openSession();
     14         Criteria criteria = session.createCriteria(User.class);
     15         @SuppressWarnings("unchecked")
     16         List<User> uList = criteria.list();
     17         for (User user : uList) {
     18             System.out.println(user);
     19         }
     20     }
     21     
     22     /**
     23      * 查询用户名
     24      */
     25     @Test
     26     public void findUsername(){
     27         SessionFactory sf = H3Util.getSessionFactory();
     28         Session session = sf.openSession();
     29         //select username from User
     30         Criteria criteria = session.createCriteria(User.class);
     31         //准备投影(属性)
     32         Property prop = Property.forName("username");
     33         //设置投影(属性)
     34         criteria.setProjection(prop);
     35         
     36         @SuppressWarnings("unchecked")
     37         List<String> usernames = criteria.list();
     38         for (String name : usernames) {
     39             System.out.println(name);
     40         }
     41     }
     42     
     43     
     44     /**
     45      * 查询用户名和性别
     46      */
     47     @Test
     48     public void findUsernameSex(){
     49         SessionFactory sf = H3Util.getSessionFactory();
     50         Session session = sf.openSession();
     51         //select username from User
     52         Criteria criteria = session.createCriteria(User.class);
     53         //准备投影(属性)
     54         Property prop1 = Property.forName("username");
     55         Property prop2 = Property.forName("sex");
     56         
     57         //获取投影集合
     58         ProjectionList pList = Projections.projectionList();
     59         pList.add(prop1);
     60         pList.add(prop2);
     61         //设置投影(属性)
     62         criteria.setProjection(pList);
     63         
     64         @SuppressWarnings("unchecked")
     65         List<Object[]> usernames = criteria.list();
     66         for (int i = 0; i < usernames.size(); i++) {
     67             System.out.println(usernames.get(i)[0]+":"+usernames.get(i)[1]);;
     68         }
     69     }
     70     
     71     /**
     72      * 模糊查询
     73      */
     74     @Test
     75     public void findByName(){
     76         SessionFactory sf = H3Util.getSessionFactory();
     77         Session session = sf.openSession();
     78         //select username from User where username = :name
     79         Criteria criteria = session.createCriteria(User.class);
     80         //添加条件
     81         //criteria.add(Restrictions.eq("username", "李四"));
     82         criteria.add(Restrictions.like("username", "%test1%"));
     83         
     84         @SuppressWarnings("unchecked")
     85         List<User> list = criteria.list();
     86         for (User user : list) {
     87             System.out.println(user);
     88         }
     89     }
     90     @Test
     91     public void findGroup(){
     92         SessionFactory sf = H3Util.getSessionFactory();
     93         Session session = sf.openSession();
     94         //select username from User group by sex
     95         Criteria criteria = session.createCriteria(User.class);
     96         
     97         Projection p1 = Projections.groupProperty("sex");
     98         Projection p2 = Projections.rowCount();//count(*)
     99         
    100         ProjectionList pList = Projections.projectionList();
    101         pList.add(p1);
    102         pList.add(p2);
    103         //分组
    104         criteria.setProjection(pList);
    105         @SuppressWarnings("unchecked")
    106         List<Object[]> list = criteria.list();
    107         
    108         for (int i = 0; i < list.size(); i++) {
    109             System.out.println(list.get(i)[0]+":"+list.get(i)[1]);
    110         }
    111     }
    112 }
    View Code

    hibernate 中使用SQL语句查询

     1 /**
     2  * @author nunu
     3  * hibernate 中使用SQL语句查询
     4  */
     5 public class TestSQLQuery {
     6 
     7     @Test
     8     public void testList() {
     9         SessionFactory sf = H3Util.getSessionFactory();
    10         Session session = sf.openSession();
    11         String sql = "select * from t_user";
    12         SQLQuery sqlQuery = session.createSQLQuery(sql);
    13         @SuppressWarnings("unchecked")
    14         List<Object[]> uList = sqlQuery.list();
    15         for (Object[] user : uList) {
    16             for (int i = 0; i < user.length; i++) {
    17                 System.out.println(user[i]);
    18             }
    19         }
    20     }
    21     
    22     
    23     @Test
    24     public void testList1() {
    25         SessionFactory sf = H3Util.getSessionFactory();
    26         Session session = sf.openSession();
    27         String sql = "select * from t_user";
    28         SQLQuery sqlQuery = session.createSQLQuery(sql);
    29         //告诉系统如何去封装对象
    30         sqlQuery.addEntity(User.class);
    31         @SuppressWarnings("unchecked")
    32         List<User> uList = sqlQuery.list();
    33         for (User user : uList) {
    34             System.out.println(user);
    35         }
    36     }
    37     
    38     /**
    39      * 指明对象
    40      */
    41     @Test
    42     public void testList2() {
    43         SessionFactory sf = H3Util.getSessionFactory();
    44         Session session = sf.openSession();
    45         String sql = "select u.* from t_user u";
    46         SQLQuery sqlQuery = session.createSQLQuery(sql);
    47         //告诉系统如何去封装对象
    48         sqlQuery.addEntity("u",User.class);
    49         @SuppressWarnings("unchecked")
    50         List<User> uList = sqlQuery.list();
    51         for (User user : uList) {
    52             System.out.println(user);
    53         }
    54     }
    55 }
    View Code
  • 相关阅读:
    十分钟抢票千余张,黄牛的抢票软件是何原理
    常见乱码解决
    如何给程序中的变量起个好名字
    jsp自定义标签
    request.getHeader("Referer")理解【转载】
    mybatis学习笔记1--HelloMybatis
    Spring学习笔记14---bean的使用
    Spring学习笔记13--Autowire(自动装配)
    Spring 学习笔记12--AOP讲解
    Spring学习笔记11--Spring 自动装配 Bean
  • 原文地址:https://www.cnblogs.com/acmwangpeng/p/5969555.html
Copyright © 2011-2022 走看看