当前位置: 首页 > news >正文

mysql网站数据库代码需求网站

mysql网站数据库,代码需求网站,给网站做cdn,培训方案及培训计划文章目录 一、如何使用二、具体操作1、创建 Maven 工程#xff0c;pom.xml2、hibernate.cfg.xml3、创建实体类4、创建实体关系映射文件5、实体关系映射文件注册到 Hibernate 的配置文件中。6、使用 Hibernate API 完成数据操作。7、pom.xml 中需要配置 resource 三、Hibernate… 文章目录 一、如何使用二、具体操作1、创建 Maven 工程pom.xml2、hibernate.cfg.xml3、创建实体类4、创建实体关系映射文件5、实体关系映射文件注册到 Hibernate 的配置文件中。6、使用 Hibernate API 完成数据操作。7、pom.xml 中需要配置 resource 三、Hibernate 级联操作1、一对多关系2、多对多关系 四、Hibernate 实现一对多五、Hibernate 实现多对多六、Hibernate 延迟加载1、一对多2、多对多 七、Hibernate 配置文件1、Hibernate.cfg.xml1、数据库的基本信息。2、集成 C3P0设置数据库连接池信息。3、Hibernate 基本信息4、注册实体关系映射文件 2、hbm.xml1、hibernate-mapping 属性2、class 属性3、id 属性4、property 属性5、实体关系映射文件属性1、inverse2、cascade 八、Hibernate HQL1、查询对象2、分页查询3、where 条件查询4、模糊查询5、order by6、查询实体对象的属性7、占位符8、级联查询 主流 ORM 框架 Object Relation Mapping 对象关系映射将面向对象映射成面向关系。 一、如何使用 1、导入相关依赖 2、创建 Hibernate 配置文件 3、创建实体类 4、创建实体类-关系映射文件 5、调用 Hibernate API 完成操作 二、具体操作 1、创建 Maven 工程pom.xml dependencies!--简化实体类的开发--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.10/version/dependency!--java连接mysql依赖--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.16/version/dependency!--Hibernate依赖--dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-core/artifactIdversion5.4.10.Final/version/dependency /dependencies2、hibernate.cfg.xml 核心配置session-factory SessionFactory针对单个数据库映射经过编译的内存镜像文件将数据库转换为⼀个 Java 可以识别的镜像文件。 构建 SessionFactory 非常耗费资源所以通常⼀个工程只需要创建⼀个 SessionFactory。 ?xml version1.0 encodingUTF-8? !DOCTYPE hibernate-configuration PUBLIC-//Hibernate/Hibernate Configuration DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-configuration-3.0.dtdhibernate-configurationsession-factory!--配置数据源--property nameconnection.usernameroot/propertyproperty nameconnection.passwordpassword/propertyproperty nameconnection.driver_classcom.mysql.cj.jdbc.Driver/propertyproperty nameconnection.urljdbc:mysql://localhost:3306/hibernate?serverTimezoneAsia/Shanghaiamp;useUnicodetrueamp;characterEncodingUTF-8/property!--C3P0连接池--property namehibernate.c3p0.acquire_increment10/propertyproperty namehibernate.c3p0.idle_test_period10000/propertyproperty namehibernate.c3p0.timeout5000/propertyproperty namehibernate.c3p0.max_size30/propertyproperty namehibernate.c3p0.min_size5/propertyproperty namehibernate.c3p0.max_statements10/property!--是否输出底层SQL语句--property namehibernate.show_sqltrue/property!--输出底层SQL语句是否格式化--property namehibernate.format_sqltrue/property!--是否自动生成数据库--!--update如果已经有表更新如果没有创建。一般用这个--property namehibernate.hbm2ddl.autoupdate/property!--数据库方言--!--如果使用的mysql是5.x写org.hibernate.dialect.MySQL5Dialect。--!--如果使用的mysql是8.x写org.hibernate.dialect.MySQL8Dialect。--property namehibernate.dialectorg.hibernate.dialect.MySQL8Dialect/property!--注册实体关系映射文件--mapping resourcecom/htl/entity/People.hbm.xml/mapping resourcecom/htl/entity/Customer.hbm.xml/mapping resourcecom/htl/entity/Orders.hbm.xml/mapping resourcecom/htl/entity/Account.hbm.xml/mapping resourcecom/htl/entity/Course.hbm.xml//session-factory/hibernate-configuration3、创建实体类 package com.htl.entity;import lombok.Getter; import lombok.Setter;import java.util.Set;Getter Setter public class Customer {private Integer id;private String name;private SetOrders orders;Overridepublic String toString() {return Customer{ id id , name name \ };} }package com.htl.entity;import lombok.Getter; import lombok.Setter;Getter Setter public class Orders {private Integer id;private String name;private Customer customer;Overridepublic String toString() {return Orders{ id id , name name \ };} }4、创建实体关系映射文件 package com.htl.entity;import lombok.Data;Data public class People {private Integer id;private String name;private Double money; }People.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.People tablepeopleid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyproperty namemoney typejava.lang.Doublecolumn namemoney/column/property/class/hibernate-mapping5、实体关系映射文件注册到 Hibernate 的配置文件中。 !--注册实体关系映射文件-- mapping resourcecom/htl/entity/People.hbm.xml/mapping6、使用 Hibernate API 完成数据操作。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test {public static void main(String[] args) {// 创建ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*/System.out.println(configuration);// 获取SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();// 获取SessionSession session sessionFactory.openSession();// 向People表中插入数据People people new People();people.setName(李四);people.setMoney(200.0);session.save(people);/*保存*/session.beginTransaction().commit();/*提交事务*/session.close();/*关闭session*/} }7、pom.xml 中需要配置 resource !--配置 resource-- !--能够识别读取java里面的xml文件-- buildresourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resource/resources /build三、Hibernate 级联操作 1、一对多关系 客户和订单每个客户可以购买多个产品生成多个订单但是一个订单只能属于一个客户所以客户 是一订单是多。 数据库中一的一方是主表多的一方时候从表通过主外键关系来维护。 面向对象中 package com.htl.entity;import lombok.Getter; import lombok.Setter;import java.util.Set;Getter Setter public class Customer {private Integer id;private String name;private SetOrders orders;Overridepublic String toString() {return Customer{ id id , name name \ };} }package com.htl.entity;import lombok.Getter; import lombok.Setter;Getter Setter public class Orders {private Integer id;private String name;private Customer customer;Overridepublic String toString() {return Orders{ id id , name name \ };} }2、多对多关系 学生选课一门课程可以被多个学生选择一个学生可以选择多门课程学生是多课程也是多。 数据库中是通过两个一对多关系来维护的学生和课程都是主表额外增加⼀张中间表作为从表两张 主表和中间表都是一对多关系。 面向对象中 package com.htl.entity;import lombok.Getter; import lombok.Setter;import java.util.Set;Getter Setter public class Account {private Integer id;private String name;private SetCourse courses;Overridepublic String toString() {return Account{ id id , name name \ };} }package com.htl.entity;import lombok.Getter; import lombok.Setter;import java.util.Set;Getter Setter public class Course {private Integer id;private String name;private SetAccount accounts;Overridepublic String toString() {return Course{ id id , name name \ };} }Java 和数据库对于这两种关系的体现完全是两种不同的方式Hibernate 框架的作用就是将这两种方式进行转换和映射。 四、Hibernate 实现一对多 Customer.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Customer tablecustomerid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset nameorders tableorderskey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many/set/class /hibernate-mappingset 标签来配置实体类中的集合属性 orsersname 实体类属性名table 表名key 外键one-to-many 与集合泛型的实体类对应 Orders.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Orders tableordersid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertymany-to-one namecustomer classcom.htl.entity.Customer columncid/many-to-one/class /hibernate-mappingmany-to-one 配置实体类对应的对象属性name 属性名class 属性对应的类column 外键 需要在 Hibernate 配置文件中进行注册 !-- 注册实体关系映射⽂件 -- mapping resourcecom/htl/entity/Customer.hbm.xml/mapping mapping resourcecom/htl/entity/Orders.hbm.xml/mappingHibernate API package com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test2 {public static void main(String[] args) {//创建ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//创建CustomerCustomer customer new Customer();customer.setName(张三11);//创建OrdersOrders orders new Orders();orders.setName(订单11);//建立关联关系orders.setCustomer(customer);//保存session.save(customer);session.save(orders);//提交事务session.beginTransaction().commit();//关闭session.close();} }五、Hibernate 实现多对多 Account.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Account tablet_accountid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset namecourses tableaccount_coursekey columnaid/keymany-to-many classcom.htl.entity.Course columncid/many-to-many/set/class /hibernate-mappingCourse.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Course tablet_courseid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset nameaccounts tableaccount_coursekey columncid/keymany-to-many classcom.htl.entity.Account columnaid/many-to-many/set/class /hibernate-mappingname 实体类对应的集合属性名table 中间表名key 外键many-to-many 与集合泛型的实体类对应column 属性与中间表的外键字段名对应 注册 Hibernate 配置文件中 !--注册实体关系映射文件-- mapping resourcecom/htl/entity/Account.hbm.xml/mapping mapping resourcecom/htl/entity/Course.hbm.xml/mappingHibernate API package com.htl.test;import com.htl.entity.Account; import com.htl.entity.Course; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;import java.util.HashSet; import java.util.Set;public class Test3 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Course course new Course();course.setName(C语言);Account account new Account();account.setName(李四);SetCourse courses new HashSetCourse();courses.add(course);account.setCourses(courses);session.save(course);session.save(account);session.beginTransaction().commit();session.close();} }六、Hibernate 延迟加载 延迟加载、惰性加载、懒加载 使用延迟加载可以提⾼程序的运行效率Java 程序与数据库交互的频次越低程序运⾏的效率就越高所以我们应该尽量减少 Java 程序与数据库的交互次数Hibernate 延迟加载就很好的做到了这一点。 客户和订单当我们查询客户对象时因为有级联设置所以会将对应的订单信息一并查询出来这样就需要发送两条 SQL 语句分别查询客户信息和订单信息。 延迟加载的思路是当我们查询客户的时候如果没有访问订单数据只发送一条 SQL 语句查询客户信息如果需要访问订单数据则发送两条 SQLL。 延迟加载可以看作是⼀种优化机制根据具体的需求⾃动选择要执⾏的 SQL 语句数量。 1、一对多 1、查询 Customer对 orders 进行延迟加载设置在 customer.hbm.xml 进行设置延迟加载默认开启。 set nameorders tableorders lazytruekey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many /set2、查询 Customer package com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test4 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer session.get(Customer.class,6);System.out.println(customer);session.close();} }package com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test4 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer session.get(Customer.class,6);System.out.println(customer.getOrders());session.close();} }在 customer.hbm.xml 中设置延迟加载关闭后 set nameorders tableorders lazyfalsekey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many /setpackage com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test4 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer session.get(Customer.class,6);System.out.println(customer);session.close();} }lazy 除了可以设置 true 和 false 之外还可以设置 extraextra 是比 true 更加懒惰的⼀种加载方式或者说是更加智能的⼀种加载方式通过例子看区别 查询 Customer 对象打印该对象对应的 orders 集合的长度。 在 customer.hbm.xml 中设置延迟加载为 extra 后。 set nameorders tableorders lazyextrakey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many /setpackage com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test4 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();/*如果默认是 hibernate.cfg.xml configure()里面就不用写。如果xml名字改了里面就写修改的名字。*///获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer session.get(Customer.class,6);System.out.println(customer.getOrders().size());session.close();} }也可以通过 Orders 来设置 Customer 的延迟加载orders.hbm.xml 中进⾏设置。 many-to-one namecustomer classcom.htl.entity.Customer columncid lazyproxy/many-to-onepackage com.htl.test;import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test5 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Orders orders session.get(Orders.class,2);System.out.println(orders);session.close();} }package com.htl.test;import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test5 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Orders orders session.get(Orders.class,2);System.out.println(orders.getCustomer());session.close();} }no-proxy当调用方法需要访问 customer 的成员变量时发送 SQL 语句查询 Customer否则不查询。 proxy无论调用方法是否需要访问 customer 的成员变量都会发送 SQL 语句查询 Customer。 2、多对多 1、查询 Course加载对应的 Account默认延迟加载开启。 在 Course.hbm.xml 里面lazy 设置为 true。不写默认为 true。 set nameaccounts tableaccount_course lazytruekey columncid/keymany-to-many classcom.htl.entity.Account columnaid/many-to-many /setpackage com.htl.test;import com.htl.entity.Course; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test6 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Course course session.get(Course.class,1);System.out.println(course);session.close();} }package com.htl.test;import com.htl.entity.Course; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test6 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Course course session.get(Course.class,1);System.out.println(course.getAccounts());session.close();} }在 Course.hbm.xml 里面lazy 关闭设置为 false 后查看结果。 set nameaccounts tableaccount_course lazyfalsekey columncid/keymany-to-many classcom.htl.entity.Account columnaid/many-to-many /setpackage com.htl.test;import com.htl.entity.Course; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test6 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Course course session.get(Course.class,1);System.out.println(course);session.close();} }2、查询 Account加载对应的 Course默认延迟加载开启。 在 Account.hbm.xml 里面lazy 设置为 true。不写默认为 true。 set namecourses tableaccount_course lazytruekey columnaid/keymany-to-many classcom.htl.entity.Course columncid/many-to-many /setpackage com.htl.test;import com.htl.entity.Account; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test7 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Account account session.get(Account.class,1);System.out.println(account);session.close();} }package com.htl.test;import com.htl.entity.Account; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test7 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Account account session.get(Account.class,1);System.out.println(account.getCourses());session.close();} }在 Account.hbm.xml 里面lazy 关闭设置为 false 后查看结果。 set namecourses tableaccount_course lazyfalsekey columnaid/keymany-to-many classcom.htl.entity.Course columncid/many-to-many /setpackage com.htl.test;import com.htl.entity.Account; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test7 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Account account session.get(Account.class,1);System.out.println(account);session.close();} }七、Hibernate 配置文件 hibernate.cfg.xmlhbm.xml 1、Hibernate.cfg.xml hibernate.cfg.xml 配置 Hibernate 的全局环境。 ?xml version1.0 encodingUTF-8? !DOCTYPE hibernate-configuration PUBLIC-//Hibernate/Hibernate Configuration DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-configuration-3.0.dtdhibernate-configurationsession-factory!--配置数据源--property nameconnection.usernameroot/propertyproperty nameconnection.passwordpassword/propertyproperty nameconnection.driver_classcom.mysql.cj.jdbc.Driver/propertyproperty nameconnection.urljdbc:mysql://localhost:3306/hibernate?serverTimezoneAsia/Shanghaiamp;useUnicodetrueamp;characterEncodingUTF-8/property!--C3P0连接池--property namehibernate.c3p0.acquire_increment10/propertyproperty namehibernate.c3p0.idle_test_period10000/propertyproperty namehibernate.c3p0.timeout5000/propertyproperty namehibernate.c3p0.max_size30/propertyproperty namehibernate.c3p0.min_size5/propertyproperty namehibernate.c3p0.max_statements10/property!--是否输出底层SQL语句--property namehibernate.show_sqltrue/property!--输出底层SQL语句是否格式化--property namehibernate.format_sqltrue/property!--是否自动生成数据库--!--update如果已经有表更新如果没有创建。一般用这个--property namehibernate.hbm2ddl.autoupdate/property!--数据库方言--!--如果使用的mysql是5.x写org.hibernate.dialect.MySQL5Dialect。--!--如果使用的mysql是8.x写org.hibernate.dialect.MySQL8Dialect。--property namehibernate.dialectorg.hibernate.dialect.MySQL8Dialect/property!--注册实体关系映射文件--mapping resourcecom/htl/entity/People.hbm.xml/mapping resourcecom/htl/entity/Customer.hbm.xml/mapping resourcecom/htl/entity/Orders.hbm.xml/mapping resourcecom/htl/entity/Account.hbm.xml/mapping resourcecom/htl/entity/Course.hbm.xml//session-factory/hibernate-configuration1、数据库的基本信息。 property nameconnection.usernameroot/property property nameconnection.passwordpassword/property property nameconnection.driver_classcom.mysql.cj.jdbc.Driver/property property nameconnection.urljdbc:mysql://localhost:3306/hibernate?serverTimezoneAsia/Shanghaiamp;useUnicodetrueamp;characterEncodingUTF-8/property2、集成 C3P0设置数据库连接池信息。 property namehibernate.c3p0.acquire_increment10/property property namehibernate.c3p0.idle_test_period10000/property property namehibernate.c3p0.timeout5000/property property namehibernate.c3p0.max_size30/property property namehibernate.c3p0.min_size5/property property namehibernate.c3p0.max_statements10/property3、Hibernate 基本信息 !--是否输出底层SQL语句-- property namehibernate.show_sqltrue/property !--输出底层SQL语句是否格式化-- property namehibernate.format_sqltrue/property !--是否自动生成数据库-- !--update如果已经有表更新如果没有创建。一般用这个-- property namehibernate.hbm2ddl.autoupdate/property !--数据库方言-- !--如果使用的mysql是5.x写org.hibernate.dialect.MySQL5Dialect。-- !--如果使用的mysql是8.x写org.hibernate.dialect.MySQL8Dialect。-- property namehibernate.dialectorg.hibernate.dialect.MySQL8Dialect/property-是否自动生成数据库-里面可填的几个值 update动态创建表如果表存在则直接使用如果表不存在则创建。create无论表是否存在都会重新创建。create-drop初始化创建表程序结束时删除表。validate校验实体关系映射文件和数据表是否对应不能对应直接报错。 4、注册实体关系映射文件 mapping resourcecom/htl/entity/People.hbm.xml/mapping mapping resourcecom/htl/entity/Customer.hbm.xml/mapping mapping resourcecom/htl/entity/Orders.hbm.xml/mapping mapping resourcecom/htl/entity/Account.hbm.xml/mapping mapping resourcecom/htl/entity/Course.hbm.xml/mapping2、hbm.xml 称为实体关系映射文件 ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Course tablet_courseid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset nameaccounts tableaccount_course lazytruekey columncid/keymany-to-many classcom.htl.entity.Account columnaid/many-to-many/set/class /hibernate-mapping1、hibernate-mapping 属性 package给 class 节点对应的实体类统一设置包名此处设置包名class 的 name 属性就可以省略包名。 如上面的实体映射文件修改为下面的 ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtdhibernate-mapping packagecom.htl.entityclass nameCourse tablet_courseid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset nameaccounts tableaccount_course lazytruekey columncid/keymany-to-many classAccount columnaid/many-to-many/set/class /hibernate-mappingschema数据库 schema 的名称。 catalog数据库 catalog 的名称。 default-cascade默认的级联关系默认为 none。 default-accessHibernate 用来访问属性的策略。 default-lazy指定了未明确注明 lazy 属性的 Java 属性和集合类Hibernate 会采用什么样的加载风格默认为 true 。 auto-import指定我们是否可以在查询语句中使用非全限定类名默认为 true如果项目中有两个同名的持久化类最好在这两个类的对应映射文件中配置为 false。 2、class 属性 name实体类名table数据表名schema数据库 schema 的名称会覆盖 hibernate-mapping 的 schemacatalog数据库 catalog 的名称会覆盖 hibernate-mapping 的 catalogproxy指定⼀个接口在延迟加载时作为代理使用dynamic-update动态更新默认关闭dynamic-insert动态添加默认关闭 当没有开启动态加载dynamic-insert时只设置 name 的值没有赋值的 money 也会默认赋 null 存入。两个都存。有多少属性存多少属性 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test8 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();People people new People();people.setName(张三);session.save(people);session.close();} }当开启动态加载dynamic-insert后只设置 name 的值则只存 name 其余不存 class namecom.htl.entity.People tablepeople dynamic-inserttrue当没有开启动态更新dynamic-update更新 money 时update语句连同 name 一块更新了。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test8 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();People people session.get(People.class,6);people.setMoney(2000.0);session.update(people);session.beginTransaction().commit();session.close();} }当开启动态更新dynamic-update后更新 money 时update语句不会连同 name 一块更新。 class namecom.htl.entity.People tablepeople dynamic-inserttrue dynamic-updatetruepackage com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test8 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();People people session.get(People.class,7);people.setMoney(7000.0);session.update(people);session.beginTransaction().commit();session.close();} }where查询时给 SQL 添加 where 条件默认关闭 当没加 where 时 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test8 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();String hql from People;Query query session.createQuery(hql);ListPeople list query.list();for (People people :list) {System.out.println(people);}session.beginTransaction().commit();session.close();} }加了 where 后可以用 where 约束查询结果。 class namecom.htl.entity.People tablepeople dynamic-inserttrue dynamic-updatetrue whereid 6运行语句同上。 3、id 属性 name实体类属性名type实体类属性数据类型 此处可以设置两种类型的数据Java 数据类型或者 Hibernate 映射类型。 实体类的属性数据类型必须与数据表对应的字段数据类型一致 int 对应 intString 对应 varchar 如何进行映射 Java 数据类型映射到 Hibernate 映射类型再由 Hibernate 映射类型映射到 SQL 数据类型 Java —》Hibernate —〉SQL column数据表的主键字段名generator主键生成策略 1、hilo 算法 2、incrementHibernate 自增 3、identity数据库自增 4、native本地策略根据底层数据库自动选择主键的生成策略 5、uuid.hex 算法 6、select 算法 4、property 属性 name实体类的属性名column数据表字段名type数据类型update该字段是否可以修改默认为 trueinsert该字段是否可以添加默认为 truelazy延迟加载策略 5、实体关系映射文件属性 1、inverse inverse 属性是用来设置是否将维护权交给对方默认是 false不交出维护权双方都在维护将它设置为 true表示放弃维护。 Customer 和 Orders 是一对多关系一个 Customer 对应多个 Orders实体类中用一个 set 集合来表示对应的 Orders。 package com.htl.entity;import lombok.Getter; import lombok.Setter;import java.util.Set;Getter Setter public class Customer {private Integer id;private String name;private SetOrders orders;Overridepublic String toString() {return Customer{ id id , name name \ };} } Customer.hbm.xml 中使用 set 标签来配置映射关系。 ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Customer tablecustomerid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertyset nameorders tableorders lazytruekey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many/set/class /hibernate-mapping实体类 package com.htl.entity;import lombok.Getter; import lombok.Setter;Getter Setter public class Orders {private Integer id;private String name;private Customer customer;Overridepublic String toString() {return Orders{ id id , name name \ };} }Orders.hbm.xml ?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd hibernate-mappingclass namecom.htl.entity.Orders tableordersid nameid typejava.lang.Integercolumn nameid/columngenerator classidentity/generator/idproperty namename typejava.lang.Stringcolumn namename/column/propertymany-to-one namecustomer classcom.htl.entity.Customer columncid lazyproxy/many-to-one/class /hibernate-mappingpackage com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test9 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer new Customer();customer.setName(李四);Orders orders1 new Orders();orders1.setName(订单4);orders1.setCustomer(customer);Orders orders2 new Orders();orders2.setName(订单44);orders2.setCustomer(customer);session.save(customer);session.save(orders1);session.save(orders2);session.beginTransaction().commit();session.close();} }3条SQL执行语句。 当添加Customer维护后此时Customer和Orders双方都在维护 package com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;import java.util.HashSet; import java.util.Set;public class Test9 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer new Customer();customer.setName(王5);Orders orders1 new Orders();orders1.setName(5);orders1.setCustomer(customer);Orders orders2 new Orders();orders2.setName(55);orders2.setCustomer(customer);//添加Customer维护SetOrders orders new HashSetOrders();orders.add(orders1);orders.add(orders2);customer.setOrders(orders);session.save(customer);session.save(orders1);session.save(orders2);session.beginTransaction().commit();session.close();} }5条SQL执行语句。 因为 Customer 和 Orders 都在维护一对多关系所以会重复设置主外键约束关系。 如何避免这种情况 1、在 Java 代码中去掉一方维护关系代码。 2、通过配置来解决。 Customer.hbm.xml set nameorders tableorders lazytrue inversetruekey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many /set将 inverse 置为 true表示 Customer 放弃维护。 再运行 package com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;import java.util.HashSet; import java.util.Set;public class Test9 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();Customer customer new Customer();customer.setName(王5);Orders orders1 new Orders();orders1.setName(5);orders1.setCustomer(customer);Orders orders2 new Orders();orders2.setName(55);orders2.setCustomer(customer);//添加Customer维护SetOrders orders new HashSetOrders();orders.add(orders1);orders.add(orders2);customer.setOrders(orders);session.save(customer);session.save(orders1);session.save(orders2);session.beginTransaction().commit();session.close();} }3条SQL执行语句。 2、cascade 用来设置级联操作。 正常删除有外键约束的表里面的数据时会报错。 package com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test10 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//删除Customer customer session.get(Customer.class,7);session.delete(customer);session.beginTransaction().commit();session.close();} }想要删除有外键约束的表里面的数据的方法如下 方法一 package com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;import java.util.Iterator;public class Test10 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//删除Customer customer session.get(Customer.class,7);IteratorOrders iterator customer.getOrders().iterator();while (iterator.hasNext()){session.delete(iterator.next());}session.delete(customer);session.beginTransaction().commit();session.close();} }方法二 实体关系映射⽂件中设置 cascade 值完成级联删除。 Customer.hbm.xml set nameorders tableorders lazytrue inversetrue cascadedeletekey columncid/keyone-to-many classcom.htl.entity.Orders/one-to-many /set然后不需要再迭代直接就能删除了。 package com.htl.test;import com.htl.entity.Customer; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class Test10 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//删除Customer customer session.get(Customer.class,7);session.delete(customer);session.beginTransaction().commit();session.close();} }八、Hibernate HQL HQLHibernate Query Language是 Hibernate 框架提供的一种查询机制它和 SQL 类似不同的是 HQL 是面向对象的查询语句让开发者能够以面向对象的思想来编写查询语句对 Java 编程是一种很友好的方式。 HQL 不能直接参与数据库的交互它是中间层语⾔。 Java —》HQL —〉Hibernate —》SQL —〉DB HQL 只能完成查询、修改、删除新增是无法操作的。 1、查询对象 查询表中所有数据自动完成对象的封装返回 List 集合。 HQL 进行查询from 关键字后面不能写表名必须写表对应的实体类名。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test11 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//查询对象String hql from People ;/* 写的是所查询表对应的实体类的名字尽量写实体类的全类名。也就是 from com.htl.entity.People */Query query session.createQuery(hql);ListPeople list query.list();for (People people:list){System.out.println(people);}session.close();} }注意People.hbm.xml 里面的 where“id 6” 要去掉。这样才能查询出完整的 People 表里面的数据。 2、分页查询 HQL 分页查询可以通过调用 query 的方法来完成。 1、setFirstResult() 设置起始下标 2、setMaxResults() 设置截取长度 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test12 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//分页查询String hql from com.htl.entity.People;Query query session.createQuery(hql);query.setFirstResult(1);query.setMaxResults(3);/* 截取People表里面第2个到第4个的数据。*/ListPeople list query.list();for (People people:list){System.out.println(people);}session.close();} }3、where 条件查询 HQL 直接追加 where 关键字作为查询条件与 SQL 没有区别。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;public class Test13 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//where条件查询String hql from People where id 6;Query query session.createQuery(hql);People people (People) query.list().get(0);System.out.println(people);session.close();} }query.list() 返回一个集合此时集合中只有一个对象通过下标 0 取出该对象。 当表里面没有符合where查询条件的数据时query调用uniqueResult()方法时,就不会抛出异常而是返回null 。 String hql from People where id 0; Query query session.createQuery(hql); People people (People) query.uniqueResult(); System.out.println(people);4、模糊查询 查询名称包含“三”的所有记录。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test14 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession 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 进行排序。 asc 是生序排列desc 是降序排列。 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test15 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();String hql from People order by id;/* 默认是 asc 升序。*/Query query session.createQuery(hql);ListPeople list query.list();for (People people:list){System.out.println(people);}session.close();} }降序 String hql from People order by id desc ;6、查询实体对象的属性 package com.htl.test;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;public class Test16 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession 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、占位符 package com.htl.test;import com.htl.entity.People; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test17 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//占位符String hql from People where name :name;Query query session.createQuery(hql);query.setString(name,张三0);ListPeople list query.list();for (People people:list){System.out.println(people);}session.close();} }8、级联查询 package com.htl.test;import com.htl.entity.Customer; import com.htl.entity.Orders; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query;import java.util.List;public class Test18 {public static void main(String[] args) {//创建 ConfigurationConfiguration configuration new Configuration().configure();//获取 SessionFactorySessionFactory sessionFactory configuration.buildSessionFactory();//获取 SessionSession session sessionFactory.openSession();//级联查询String hql from Customer where name :name;Query query1 session.createQuery(hql);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();} }
http://www.hkea.cn/news/14256944/

相关文章:

  • 互联网行业建设网站东莞如何制作免费的网页
  • 网站建设小组实训总结网站定制公司哪家好
  • 慈溪建设银行支行网站深圳做分销网站建设
  • 根据链接获取网站名称电商网站适合做响应式布局吗
  • 网站开发目标网站门户设计
  • 品展示设计网站wordpress下拉式友情链接
  • 网页图片提取器湖南专业关键词优化
  • 网站建设哪家好灵活苏州久远网络温州做网站制作
  • 微信公众号的网站超链接怎么做铁岭网站seo
  • 深圳做网站那家好wordpress企业免费主题下载地址
  • asp.net 网站管理系统网站域名空间费用
  • 手机企业网站多少钱松岗做网站公司
  • dedecms的网站如何添加个引导页公司网站怎么优化
  • 为网站网站做代理怎么判做网站有必要用wordpress
  • 机械设备公司网站制作时钟插件 wordpress
  • 泉州手机网站制作天猫电商平台
  • 新网域名注册优化手机网站
  • three.js做的酷炫网站设计素材模板
  • 甘肃制作网站怎样自己做企业网站
  • 山西笑傲网站建设推广全运会为什么建设网站
  • 泉州cms建站系统网络建设是什么意思
  • 宁波网站推广平台推荐网站开发系统学习
  • 企业网站建设杭州宝安住房和建设局网站
  • 最专业的网站建设机构网站流量 seo
  • 专门做眼镜的国外网站番禺网站建设品牌好
  • 网站开发英文字体一般是什么电脑做ppt模板下载网站
  • 免费企业建站选哪家江苏省建设厅网站职称评审系统
  • 西樵做网站yw55516can优物入口
  • 做网站搞友情链接青岛知道网络科技有限公司
  • 深圳电商平台网站建设一个网站建设需要花多少钱