博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate的基本使用
阅读量:4514 次
发布时间:2019-06-08

本文共 8134 字,大约阅读时间需要 27 分钟。

public class Test {
//基本的crud public static void main(String[] args) { Session session=HibernateUtil.getCurrentSession();//获得和当前线程绑定的session对象 无需关闭 线程结束 自动关闭 Transaction tx=session.beginTransaction();//通过session对象得到事务对象 //查询 Customer c1=session.get(Customer.class,1l);//第一个参数 实体类的class对象,第二个主键值 //将对象保存到数据库// Customer c2=new Customer();// c2.setCust_name("甘创");// long id=(long)session.save(c2);//会返回一个 Serializable接口,其实就是插入记录后的主键值 //修改的对象 必须有和表对应的主键 不然hibernate无法找到对应记录 会报错// Customer c3=new Customer();// c3.setCust_id(2l);// c3.setCust_name("甘创");// session.update(c3); //删除的对象 必须有和表对应的主键 不然hibernate无法找到对应记录 会报错// Customer c4=new Customer();// c4.setCust_id(3l);// session.delete(c4); tx.commit();//提交事物 }}

 

Hibernate中hql查询方式

/** * hql的查询方式 * */public class Test3 {    public static void main(String[] args) {        Session session=HibernateUtil.getCurrentSession();        Transaction tx=session.beginTransaction();                //hql简单查询 注意 hql中不支持 直接使用*号 但在聚合函数中 比如 count(*) 可以        /**        List
list = session.createQuery("from Customer").list(); */ //hql别名查询 可以给表取别名 和sql语句语法相同 /** List
list = session.createQuery("select c from Customer c").list(); */ //排序查询 注意hql语法中 表名和列名都是类名和属性名 /** List
list = session.createQuery("from Customer order by cust_id desc").list(); */ //条件查询 第一种 根据位置设置值 索引从0开始 /** Query query = session.createQuery("from Customer where cust_name=? and cust_id=?"); query.setParameter(0, "龙岩江"); query.setParameter(1, 1l); List
list = query.list(); */ //条件查询 第二种 按名称绑定 :名字可以随便起 但中间不能有空格 /** Query query = session.createQuery("from Customer where cust_name= :name and cust_id= :id "); query.setParameter("name", "龙岩江"); query.setParameter("id",1l); List
list = query.list(); */ //hql的投影查询 :查询对象的某个或某些属性 /** //查询单个属性 会返回一个object集合 List
list=session.createQuery("select cust_name from Customer").list(); for (Object object : list) { System.out.println(object); } */ //查询多个属性 会返回一个object[] 集合 /** List
list = session.createQuery("select cust_name,cust_id from Customer").list(); for (Object[] objects : list) { System.out.println(Arrays.toString(objects)); } */ //想将查询的属性 直接封装成对应类的对象,会返回对应实体类的集合 语法 select new 实体类名(属性名,属性名) from 实体类名 //注意 如果要使用直接封装成对应对象 需要提供相应的构造方法,注意参数的位置 /** List
list = session.createQuery("select new Customer(cust_id,cust_name) from Customer").list(); for (Customer customer : list) { System.out.println(customer); } */ //hql分页查询 /** Query query = session.createQuery("from Customer"); query.setFirstResult(1);//设置从第几条记录开始查 从0开始 query.setMaxResults(2);//设置从起始位置开始 查几条记录 List
list = query.list(); for (Customer customer : list) { System.out.println(customer); } */ //hql分组统计查询 //分组加条件查询 根据名字分组 然后查询名字为龙岩江 /* List
list = session.createQuery("select cust_name FROM Customer GROUP BY cust_name HAVING cust_name='龙岩江' ").list(); for (Object cust_name : list) { System.out.println(cust_name); } */ //hql多表查询 普通内连接和迫切内连接区别在于,普通返回object[]数组,迫切返回对应实体类的对象 //普通的内连接查询语法: from 类名 别名 inner join 别名.属性名 //返回值是一个object[] 里面存放着对应实体类的对象 /** List
list = session.createQuery("from Customer c inner join c.linKMans").list(); for (Object[] objects : list) { System.out.println(Arrays.toString(objects)); } */ //迫切内连接 语法和普通内连接类似 多了一个fetch 关键字 , 语法: from 类名 别名 inner join fetch 别名.属性名 //迫切内连接返回值是对应的 实体类对象 hibernate自动封装完成 /** List
list = session.createQuery("from Customer c inner join fetch c.linKMans ").list(); for (Customer customer : list) { System.out.println(customer); for (LinKMan linKMan : customer.getLinKMans()) { System.out.println(linKMan); } } */ //还有对应有左外连接 和迫切左外连接 语法和内连接就区别于 inner join 替换为 left join tx.commit(); }}

 

Hibernate中Criteria查询方式

public class Test4 {    /**     * Criteria 查询方式     *      * */    public static void main(String[] args) {    Session session=HibernateUtil.getCurrentSession();    Transaction tx=session.beginTransaction();            //简单查询 /**    Criteria criteria = session.createCriteria(Customer.class);    List
list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } */ //排序查询 //criteria的addOrder()方法 传入Order类的静态方法 asc(属性名)升序 ,desc(属性名)降序 /** Criteria criteria = session.createCriteria(Customer.class); criteria.addOrder(Order.desc("cust_id")); List
list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } */ //分页查询 /** Criteria criteria = session.createCriteria(Customer.class); criteria.setFirstResult(0); //指定从第几条记录开始查询 criteria.setMaxResults(2); //指定查询几条记录 List
list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } */ //条件查询// Criteria criteria = session.createCriteria(Customer.class);// /**// * 设置条件// * sql运算符 Restrictions类静态方法名// * = eq(String propertyName,Object value);参1 属性名 参2 值// * > gt(String propertyName,Object value);参1 属性名 参2 值// * >= ge(String propertyName,Object value);参1 属性名 参2 值// * < lt(String propertyName,Object value);参1 属性名 参2 值// * <= le(String propertyName,Object value);参1 属性名 参2 值// * <> ne(String propertyName,Object value);参1 属性名 参2 值// * is null isNull(String propertyName) 属性名// * like like(String propertyName,Object value);参1 属性名 参2 值// * in in (String propertyName,Collection values);参1 属性名 参2 可以是collection集合接口的实现类 或者object数组// * and and 可变个数Restrictions.xx() 方法// * or or 可变个数Restrictions.xx() 方法// * */// //多个条件之间 关系默认是and // criteria.add(Restrictions.eq("cust_name", "龙岩江"));// criteria.add(Restrictions.gt("cust_id",0l));// //criteria.add(Restrictions.or(Restrictions.gt("cust_id",4l),Restrictions.eq("cust_name", "龙岩江")));// //or的写法 and的写法和这个一样 // List
list = criteria.list();// for (Customer customer : list) {// System.out.println(customer);// } //分组查询 // Criteria criteria = session.createCriteria(Customer.class);// /**// *Criteria的 add() :普通条件 where 后面的条件// *Criteria的addOrder() :排序// *Criteria的setProjections() :聚合函数 和group by 和分组以后条件 having // * */// //分组之后 默认返回都是一个object对象集合// criteria.setProjection(Projections.groupProperty("cust_name")); //根据名字分组// List list = criteria.list();// for (Object object : list) {// System.out.println(object);// } //离线条件查询 // 在没有session对象时,可以 创建一个离线条件对象DetachedCriteria //使用DetachedCriteria对象 设置完对应的条件 ,可以通过getExecutableCriteria()方法 传入session对象 //创建出criteria 对象 调用其list()方法 可以实现查询 //主要用于在web层创建DetachedCriteria对象 设置完条件 传入dao层 根据session对象可以实现创建出criteria对象 实现查询 //解决了 多个参数传递问题 , DetachedCriteria对象设置条件方式和Criteria对象一样 DetachedCriteria dc=DetachedCriteria.forClass(Customer.class); dc.add(Restrictions.eq("cust_name", "龙岩江")); Criteria criteria = dc.getExecutableCriteria(session); List
list = criteria.list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }}

 

Hibernate中还支持sql语法的查询对象  不过不常用

//SQLQuery对象默认查询是返回一个object[]数组 存放着值 可以设置让hibernate自动封装成指定类的对象     //分页也和别的对象一样 设置setFirstResult()方法和setMaxResults()方法         /**     SQLQuery sqlQuery=session.createSQLQuery("select * from cst_Customer");     sqlQuery.addEntity(Customer.class);//添加实体配置  hibernate将自动将查询返回的object[]数组封装成对应的对象 参1为持久化类的class对象    List list= sqlQuery.list(); //查询返回一个list类型集合      for (Object obj : list) {        Customer c=(Customer)obj;        System.out.println(c);    }    */

 

转载于:https://www.cnblogs.com/java888/p/10594000.html

你可能感兴趣的文章
java第五次实训作业异常处理
查看>>
linux常用命令总结(含选项参数)
查看>>
Why validation set ?
查看>>
2019-04-01 为什么零售业务流行起来了?
查看>>
一般处理程序、Ajax多图片上传带进度条
查看>>
kafka清理
查看>>
Jenkins 踩过的坑之再总结
查看>>
揭露QPS增高后的秘密
查看>>
行转列-
查看>>
这是第二波java笔记
查看>>
SendMessage与PostMessage的区别(转)
查看>>
Jenkins 主题分享
查看>>
算法系列15天速成——第八天 线性表【下】
查看>>
N个小时学MM IMG设定_存货管理和盘点 <四>
查看>>
物料类型AM11没有任务清单类型N定义
查看>>
【MySQL高级特性】高性能MySQL第七章
查看>>
C++与C#交互
查看>>
【BZOJ 1018】线段树 **
查看>>
【BZOJ 4170】 4170: 极光 (CDQ分治)
查看>>
Jquery分享插件
查看>>