配置文件的命名规范:类名.hbm.xml
配置方式为xml文件
引入约束文件
约束文件位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yeWCdj10-1593604408762)(F:\MarkDownOnte\学习笔记\dao层框架\assets\1591609475867.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nm8xWkat-1593604408763)(F:\MarkDownOnte\学习笔记\dao层框架\assets\1591609484987.png)]
根标签hibernate-mapping
实体类映射文件标签
class 标签:
name属性 实体类的全限定名
table属性 数据库的表名
id标签 建立类中的属性与表中的主键映射关系
name属性 实体类中对应主键名colum属性 表中的主键列generator 标签 class=“native”property标签 实体类中其他属性与数据库的字段映射关系
name属性 实体类属性名colum属性 数据库列名实体类映射配置文件示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 建立类与表的映射 --> <class name="com.wx.dao.Customer" table="cst_customer"> <!-- 建立类中的属性与表中的主键对应 --> <id name="cust_id" column="cust_id" > <!--主键的生成策略--> <generator class="native"/> </id> <!-- 建立类中的普通的属性和表的字段的对应 --> <property name="cust_name" column="cust_name" length="32" /> <property name="cust_source" column="cust_source" length="32"/> <property name="cust_industry" column="cust_industry"/> <property name="cust_level" column="cust_level"/> <property name="cust_phone" column="cust_phone"/> <property name="cust_mobile" column="cust_mobile"/> </class> </hibernate-mapping>hibernate核心配置文件
有两种配置方式xml方式与properties文件方式
核心配置文件名 hibernaet.cfg.xml
根标签session-factory
子标签property 配置连接数据库相关的配置子标签property 配置数据库的方言,为了自动生成不同数据库的sql语句子标签mapping 配置映射核心配置三类:
1.必须配置 驱动类url路径用户名密码 2.可选配置 显示sql语句 hibernate.show.sql格式化sql hibernate.format.sql自动建表 hibernate.hbm2ddl.auto none 不会自动创建表create 如果数据库中有表就删除然后重新创建update 如果数据库中有表就使用没有就创建(更新表结构)validate 如果数据库中没有表就报错有就使用(校验用) 3.映射文件引入核心配置文件示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 连接数据库的基本参数 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 配置Hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 可选配置================ --> <!-- 打印SQL --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQL --> <property name="hibernate.format_sql">true</property> <!-- 自动创建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置C3P0连接池 --> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!--在连接池中可用的数据库连接的最少数目 --> <property name="c3p0.min_size">5</property> <!--在连接池中所有数据库连接的最大数目 --> <property name="c3p0.max_size">20</property> <!--设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --> <property name="c3p0.timeout">120</property> <!--每3000秒检查所有连接池中的空闲连接 以秒为单位--> <property name="c3p0.idle_test_period">3000</property> <!--加载实体类映射文件--> <mapping resource="com/wx/dao/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>Configuration:Hibernation的配置文件
作用: 加载核心配置文件加载映射文件SessionFactory: session工厂
作用1:初始化hibernate,作用2:维护了连接池与二级缓存线程安全的对象,一般一个项目创建一个对象Session:连接对象,非线程安全的,与数据库交互的桥梁
相关的API:
保存: Serializable save(Object obj); 返回保存记录的id查询: T get(Class c,Serializable id);T load(Class c,Serializable id);两者区别:
load方式采用延迟加载,返回的是一个代理的对象,查询不到会抛出异常get采用一次性直接加载返回真是的对象,未查询到会返回一个null持久态自动更新数据库
Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); // 获得持久态对象 Customer customer = session.get(Customer.class, 2l); customer.setCust_level("17");// 设置属性 // session.update(customer); 不同调用更新方法直接就在数据库中更新了数据 transaction.commit(); session.close();一级缓存
一级缓存是自带的不可卸载,只是作用与同一个session对象,其底层原理是session对象包含了一些列的java集合,在集合中存储了已经查询对象的oid再吃进行查询的时候如果在集合中查到了oid直接返回结果,如果在集合中没有查询到才到数据库中去查询,然后把查询结果存储到集合中并返回结果。一级缓存内部结构:
一级缓存中存在的特殊区域:快照区(把查询的结果备份到快照区域)二级缓存一般不使用,因为会使用效率更高的redis代替
为了保证连接对象是同一个连接对象(session)
向下传递
使用ThreadLocal 对象
将这个连接绑定到当前线程中在dao的方法中,通过当前线程获得连接对象在hibernate中已经有绑定号的ThreadLocal对象但是默认不能使用需要设置开启
在sessionFactory中提供了一个方法getCurrentSession()
开启配置
<property name="hibernate.current_session_context_class">thread</property>Query
query是一个接口用于接收HQL ,查询多个对象
HQL:Hibernate Query Language 与sql相识的一种Hibernate的专属查询语言,面向对象的一种查询语言
// 普通查询所有 String hql="from Customer"; Query query = session.createQuery(hql); List list = query.list(); list.forEach(s-> System.out.println(s)); //条件查询 Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); // 条件查询 String hql="from Customer where cust_name like ? "; Query query = session.createQuery(hql); // 替换参数 query.setParameter(0,"%凌%"); // 执行查询 List list = query.list(); list.stream().forEach(s-> System.out.println(s)); // query分页查询 Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); String hql="from Customer"; Query query = session.createQuery(hql); // 设置分页条件 query.setFirstResult(0); query.setMaxResults(5); //显示数据 List list = query.list(); list.stream().forEach(s-> System.out.println(s)); Ctiteria对象 criteria标准查询 Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); Criteria criteria = session.createCriteria(Customer.class); List list = criteria.list(); criteriacriteria条件查询 // criteria Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); // 获得Criteria查询对象 Criteria criteria = session.createCriteria(Customer.class); criteria.add(Restrictions.like("cust_name","%赵%")); List list = criteria.list(); list.forEach(s-> System.out.println(s)); criteria分页查询 Session session = HibernateUtis.getSession(); Transaction transaction = session.beginTransaction(); // 获得Criteria查询对象 Criteria criteria = session.createCriteria(Customer.class); // 设置查询条件 criteria.add(Restrictions.like("cust_name","%逻%")); // 设置分页参数 criteria.setFirstResult(2); criteria.setMaxResults(6); List list = criteria.list(); list.forEach(s-> System.out.println(s));ion = session.beginTransaction(); // 获得Criteria查询对象 Criteria criteria = session.createCriteria(Customer.class); // 设置查询条件 criteria.add(Restrictions.like(“cust_name”,"%逻%")); // 设置分页参数 criteria.setFirstResult(2); criteria.setMaxResults(6); List list = criteria.list(); list.forEach(s-> System.out.println(s));