一.框架:java中的框架指的是在实现功能的前提下少些一部分代码。
二.Hibernate框架:
1.应用在javaee持久层(dao)的框架;
2.在dao层里对数据库进行crud操作,使用hibernate框架(使用orm思想)进行crud操作。hibernate底层实际上就是对jdbc的封装;使用hibernate的好处:不用写复杂的jdbc代码,不用写sql语句实现;
3.hibernate开源的轻量级框架。
三.ORM思想(对象关系映射):
1.让实体类(javabean)和数据库表一一对应(让实体类和数据库表对应,实体类的私有属性和数据表的字段对应);
2.不用操作数据库表,只需操作数据库表对应的实体类;
3.session对象(里面相当于封装的jdbc操作),例如:
实体类User, User u = new User();
u.setName("张三");
session.save(u); // 就相当于在user表中添加了一个username为张三的用户
jdbc操作:
1.创建连接:Connection conn = DrverManager.getConnection(url,username,password);
2.对sql进行预编译操作:
String sql = "select * from user";
PrepareStatement pst = conn.prepareStatement(sql);
3.执行sql:ResultSet r = pst.executeQuerry();
4.遍历结果集;
5.关闭资源: conn.close().
四.Hibernate框架的基本练习:
1.导入相关jar包;
2.创建实体类,创建映射的表(可以手动创建,也可以用Hibernate创建);
3.配置实体类和数据库表的映射关系(一一对应关系):使用配置文件实现。
(1)映射配置文件的名称和位置没有特殊要求,一般放在实体类的包下,名称采用实体类名.hnm.xml格式;
(2)User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!-- 导入dtd约束 --><!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:实体类的全路径table:映射的数据库表名--><class name="cn.xiaolige.entity.User" table="user"><!-- 配置hibernate实体类id和表id对应Hibernate要求实体类要有一个属性唯一值和数据库表字段唯一值--><!-- id标签name:实体类里的id属性名column:数据库中的id字段名--><id name="uid" column="uid"><!--设置数据库表id增长策略native:生成表id值就是主键自动增长--><generator class="native"></generator></id><!-- property 其他属性标签 --><property name="username" column="username"></property><property name="age" column="age"></property></class></hibernate-mapping>
(3)创建hibernate的核心配置文件:文件名和位置固定,hibernate加载过程中只会加载核心配置文件(所以其他配置文件要引入)
文件名:hibernate.cfg.xml位置:src包下(或和src同级别的包下);
<?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:///hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><!-- 配置hibernate信息 可选--><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!--想要hibernate帮助创建表需配置hibernate.hbm2ddl.autoupdate表示如果有表更新如果没有表创建--><property name="hibernate.hbm2ddl.auto">update</property><!-- 只能识别mysql数据库的方言例如在mysql中分页用limit,在oracle中分页用rownum有了这个属性org.hibernate.dialect.MySQLDialect就能识别类似limit的mysql的方言了--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> --><!-- 把映射文件User.hbm.xml放到核心配置文件中 --><mapping resource="cn/xiaolige/entity/User.hbm.xml"/></session-factory></hibernate-configuration>
(4)实现添加操作:
1.加载hibernate核心配置文件;
2.创建sessionFactory对象;
3.使用sessionFactory创建session对象;
4.开启事物;
5.写具体逻辑crud操作;
6.提交事物;
7.关闭资源。
@Testpublic void insert() {// 1.加载hibernate核心配置文件;//在src下找到名称是hibernate.cfg.xml文件,并且封装到对象里Configuration cfg = new Configuration().configure();// 2.创建sessionFactory对象;//读取hibernate核心文件后创建sessionFactory对象,在过程中根据映射关系在配置数据库里面把表创建SessionFactory sessionFactory = cfg.buildSessionFactory();// 3.使用sessionFactory创建session对象(类似于jdbc中的connection);Session session = sessionFactory.openSession();// 4.开启事物;Transaction tx = session.beginTransaction();// 5.写具体逻辑crud操作;User u = new User();u.setUsername("张三");u.setAge("18");session.save(u);// 6.提交事物;tx.commit();// 7.关闭资源。session.close();sessionFactory.close();}session对象的方法实现crud:save():添加操作;update():修改;delete(Object):删除两种删除模式a.先根据id查出一个对象,然后再Delete;b.new 一个新对象,设置这个对象的id,再调用delete();get(实体类.class,id值):根据id查询;saveOrupdate():对象是瞬时态做添加操作,是持久态和托管态做修改操作;(也可以理解为对象设置id则进行修改操作,无id则进行添加操作)session对象是单线层对象(session对象只能自己使用不能共用)。Transaction :事物就是操作中最基本的单元要么同时成功要么同时失败,事物的四个特性:原子性:一组操作要么同时成功要么同时失败;一致性:操作前和操作后数据不发生变化(例如转账前后钱数不能变);隔离性:多个事物操作一组数据时互不影响;持久性:事物commit后写入数据库(磁盘);事物的规范代码:try {开启事物;提交事物}catch{回滚事物}finally{关闭资源}需要配置事务的隔离级别read uncommitedread commitedrepatable readserialzable* hibernate中也可以设置事务的隔离级别<property name="hibernate.connection.isolation">4</property>* 事务控制在那一层?servicehibernate中获取与当前现场绑定的session1.在xml中配置当前线程绑定session2.使用factory的getCurrentSession方法获取3.使用与当前线程绑定的session不需要手动关闭五,实体类的编写规范:1.属性私有;2,公有的set,get方法;3.要求实体类里有属性作为唯一值(一般使用id);4.实体类数据类型建议不使用基本数据类型,使用基本数据类型的包装类(例如Character要表示一个学生成绩为0,和一个学生没参加考试,要是int score = 0;就不行Integer score = 0;Integer score = null;则可以);5.实体类的三种状态:瞬时态:对象无id,与session没有关系持久态:对象有id,与session有关系托管态:对象有id,与session没有关系六,主键生成策略:主要用native:根据使用的数据库帮选择哪个值uuid:hibernate自动帮我们生成一个uuid值什么是缓存:数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高,把数据存到内存里面不需要使用流方式可以直接读取内存中数据,把数据放到内存中提高读取效率。七,Hibernate缓存:1.一级缓存:Hibernate的一级缓存是默认打开的,使用范围是session的使用范围;存储的数据必须是持久态的;持久态会自动更新数据库(不用调update()或saveOrupdate()方法);2.二级缓存:redis替代了,八,Hibernate的api:hibernate查询* list:接受集合数据uniqueResult:接受唯一的结果集1.HQL查询hql:hibernate query language使用Query对象进行查询,在创建query对象的时候需要接受一个HQL语句:hql查询hql语句和sql语句很类似(sql查询的是字段和数据库表,hql查询的是对象和对象中的属性)hql和sql语句的语法基本一致hql查询是一种比较面向对象的查询方式(调用方法实现一些功能:分页)查询全部,倒叙查询,分页查询,条件查询,统计查询,投影查询2.QBC查询使用Criteria对象进行查询 (qbc:query by criteria)qbc查询是一种完全面向对象的查询语言查询全部,倒叙查询,分页查询,条件查询,统计查询,离线查询步骤:1.创建Criteriasession.crateCriteria(class)2.调用方法,对查询的参数进行赋值3.接受返回结果criteria.listcriteria.uniqueResultaddOrder // 添加排序setProjection //添加统计函数3.SQL查询
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">