尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

hibernate

hibernate hibernate主流ORM框架Object Relation Mapping对象关系映射将面向对象映射成面向关系[和mybatis一样都是orm框架用于数据访问对象的]如何使用1.导入相关依赖mysql-connector-javahibernate-core2.创建hibernate配置文件hibernate.cfg.xml核心配置session-factorysessionFactory:针对单个数据库映射经过编译的内存镜像文件将数据库转换为一个java可以识别的镜像文件。构建SessionFactory非常耗费资源所以通常一个工程只需要创建一个SessionFactoryhibernate-configuration session-factory property nameconnection.usernameroot/property property nameconnection.passwordroot/property property nameconnection.driver_classcom.cj.jdbc.Driver/property property nameconnection.urljdbc:mysql://localhost:3306/test? userUnicodeture;characterEncodingUTF-8/property /session-factory /hibernate-configuration3.创建实体类4.创建实体类-关系映射文件5.实体关系映射文件注册到Hibernate的配置文件中6.使用hibernate api完成映射操作Hibernate级联操作一对多关系客户和订单每个客户可以购买多个产品生成多个订单但是一个订单只能属于一个客户所以 客户是一订单是多java和数据库对于这两种关系的体现是两种不同的方式Hibernate框架的作用就是将这两种方式进行转换和映射HIbernate API2.多对多关系学生选课一门课程可以被多个学生选择一个学生可以选择多门课程学生是多课程也是多。数据库中是通过两个一对多关系来维护的学生和课程都是主表额外增加一张中间表作为从表中间表就会保存对方的id了Hibernate延迟加载延迟加载、惰性加载、懒加载使用延迟加载可以提高程序的运行效率java程序与数据库交互的频次越低程序运行的效率就越高所以我们应该尽量减少java程序与数据库的交互次数Hibernate延迟加载就很好的做到了这一点客户和订单当我们查询客户对象时因为有级联设置所以会将对映的订单信息一并查出来这样就需要发送两条sql语句分别是查询客户信息和订单信息延迟加载的思路是当我们查询客户的时候如果没有访问订单数据只发送sql语句查询客户信息如果需要访问订单数据则发送两条sql延迟加载可以看作是一周优化机制根据具体的需求自动选择要执行的sql语句数量一对多1.查询customer对orders进行延迟加载设置在customer.hbm.xml进行设置延迟加载默认开启。2.查询customer注意多对多的时候只要有一个类实现了多对多就好不然容易出现重复循环创建对象延迟加载就是使用外键的对象时就不创建使用才创建lazy除了可以设置true和false以外还可以设置extraextra是比true更加懒惰的一种加载方式或者是说更加智能的一种加载方式通过例子看true的时候查询Customer对象打印该对象对应的orders集合的⻓度也可以通过order来设置customer的延迟加载orders.hbm.xml中进行设置no-proxy当调⽤⽅法需要访问customer的成员变量时发送SQL语句查询Customer否则不查询。proxy⽆论调⽤⽅法是否需要访问customer的成员变量都会发送SQL语句查询Customer。多对多Hibernate配置文件hibernate.xmlhbm.xmlhibernate.xml配置hibernate的全局环境数据库的基本信息[数据源的配置]集成c3p0设置数据库连接池信息hibernate的设置[方言、打印格式化sql...]生成数据库可设置update动态创建表如果表存在则直接使用如果表不存在则创建【默认】create无论表是否存在都会重新创建create-drop初始化创建表程序结束时删除表validate校验实体关系映射文件和数据表是否对应不能对应直接报错4. 注册实体关系映射文件详细信息hibernate-mapping属性package给class节点对应的实体类统⼀设置包名此处设置包名class的name属性就可以省略包名。schema数据库schema的名称catalog数据库catalog的名称default-cascade默认的级联关系默认为none default-accessHibernate⽤来访问属性的策略default-lazy指定了未明确注明lazy属性的Java属性和集合类Hibernate会采⽤什么样的加载风格默认为trueauto-import指定我们是否可以在查询语句中使⽤⾮全限定类名默认为true如果项目中有两个同名的持久化类最好在这两个类的对应映射⽂件中国配置为falseclass属性name实体类名table数据表名schema数据库schema的名称会覆盖hibernate-mapping的schemacatalog数据库catalog的名称会覆盖hibernate-mapping的catalog proxy指定⼀个接口在延迟加载时作为代理使⽤dynamic-update动态更新[动态更新字段]dynamic-insert动态添加[动态添加字段]where查询时给SQL添加where条件id属性name实体类属性名type实体类属性数据类型此处可以设置两种类型的数据Java数据类型或者Hibernate映射类型。 实体类的属性数据类型必须与数据表对应的字段数据类型⼀致int对应intString对应varchar如何进⾏映射Java数据类型映射到Hibernate映射类型再由Hibernate映射类型映射到SQL数据类型Java ---》Hibernate ---〉SQLcolumn数据表的主键字段名generator主键⽣成策略hilo算法incrementhibernate自增identity数据库自增native本地策略根据底层数据库自动选择主键的生成策略uuid.hex 算法select 算法property属性name实体类的属性名column数据表字段名type数据类型update该字段是否可以修改默认为trueinsert该字段是否可以添加默认为truelazy延迟加载策略实体关系映射文件属性1. inverse[放弃维护权]customer和orders是一对多关系一个Customer对应多个Orders实体类中用一个set集合表示对应的Orders因为Customer和Orders都在维护⼀对多关系所以会重复设置主外键约束关系。 如何避免这种情况在Java代码中去掉⼀⽅维护关系代码。通过配置来解决inverse属性是⽤来设置是否将维护权交给对⽅默认是false不交出维护权双⽅都在维护将它设 置为true表示 该方放弃维护。2. cascade⽤来设置级联操作Hibernate HQLHQLhibernate Query Language是Hibernate框架提供的一种查询机制它和SQL类似不同的是 HQL是面向对象的查询语句让开发者能够以面向对象的思想来编写查询语句对java编程是一种友好的方式HQL不能直接参与数据库的交互中间层语言java-HQL-hibernate-sql-DBHQL只能完成查询、修改、删除新增是无法操作的1、查询对象查询表中所有数据⾃动完成对象的封装返回List集合。HQL进⾏查询from关键字后⾯不能写表名必须写表对应的实体类名[头字母要大写有歧义可以用全包类名]2、分⻚查询HQL分⻚查询可以通过调⽤query的⽅法来完成。setFirstResult()设置起始下标setMaxResults()设置截取⻓度public class Test11 { public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session Session session sessionFactory.openSession(); String hql from People; Query query session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(3); ListPeople list query.list(); for(People people:list){ System.out.println(people); } session.close(); 3、where 条件查询 HQL 直接追加 where 关键字作为查询条件与 SQL 没有区别。 String hql from People where id 6; People people (People) query.list().get(0); 注意这个方面没有数据的话get(0)会报下标异常 使用下面的方法若有数据则获取第一个数据若没有数据则返回null People people (People) query.uniqueResult(); 4、模糊查询 查询名称包含 “三” 的所有记录 5、order by 按照 id 进⾏排序 } }3、where条件查询HQL直接追加where关键字作为查询条件与SQL没有区别。String hql from People where id 6;People people (People) query.list().get(0);注意这个方面没有数据的话get(0)会报下标异常使用下面的方法若有数据则获取第一个数据若没有数据则返回nullPeople people (People) query.uniqueResult();4、模糊查询查询名称包含“三”的所有记录public class Test11 { public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session Session session sessionFactory.openSession(); String hql from People where name like %三%; Query query session.createQuery(hql); ListPeople list query.list(); for(People people:list){ System.out.println(people); } session.close(); } }5、order by按照id进⾏排序public class Test11 { public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session asc 是⽣序排列desc 是降序排列。 6、查询实体对象的属性 7、占位符 Session session sessionFactory.openSession(); String hql from People order by id asc ; asc 是⽣序排列desc 是降序排列。 6、查询实体对象的属性 7、占位符 8、级联查询 Query query session.createQuery(hql); ListPeople list query.list(); for(People people:list){ System.out.println(people); } session.close(); } }asc是⽣序排列desc是降序排列。6、查询实体对象的属性public class Test11 { public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session Session session sessionFactory.openSession(); String hql select name from People where id 6; Query query session.createQuery(hql); String name (String) query.uniqueResult(); System.out.println(name); session.close(); } }7、占位符public class Test11 { public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session Session session sessionFactory.openSession(); String hql from People where name :name; Query query session.createQuery(hql); query.setString(name,张三); ListPeople list query.list(); for (People people:list){ System.out.println(people); } session.close(); } }8、级联查询public static void main(String[] args) { //创建 Configuration Configuration configuration new Configuration().configure(hibernate.xml); //获取 SessionFactory SessionFactory sessionFactory configuration.buildSessionFactory(); //获取 Session Session session sessionFactory.openSession(); String hql1 from Customer where name :name; Query query1 session.createQuery(hql1); query1.setString(name,张三); Customer customer (Customer) query1.uniqueResult(); String hql2 from Orders where customer :customer; Query query2 session.createQuery(hql2); query2.setEntity(customer,customer); ListOrders list query2.list(); for(Orders orders:list){ System.out.println(orders); } session.close(); } }
返回列表