一: hibernate框架简单介绍:
1.hibernate他是一个jdbc封装,可以使用hibernate来完成数据库的操作.他是orm框架 orm(对象关系映射)
2.来建立javabean和表之间的映射.
documentation文件夹: 里面相关文件和API; lib/required jar包 probject: 相关的源代码与资源, etc:配置文件
二: hibernate相关的配置:
1.hbm文件配置.
xxx.hbm.xml 用于描述类与数据库中表的映射关系;要与实体类在用一个包下,类名hbm.xml
<hibernate-mapping package="包名">
<class name="实体类名" table="表名" catalog="数据库名">
<id name="类中主键名" column="数据库中的主键列名" type="主键类型">他是用于描述主键
<generator class="native(根据数据库自己选择)">主键生成策略,自动增长....
</id>
<property name="类属性名" column="表列名" lenth="类型的长度" sql-type="varchar(50)">
描述表和实体类中的普通字段.
</class>
2. hibernate.cfg.xml 核心配置文件 .
①可以加载数据库相关信息, ②hibernate相关配置 ③加载映射配置文件
④配置表的自动创建,<property name="hibernate.hbm2ddl.auto">update</property>
create-drop: 每次都会自动创建新的表,执行完成后删除.一般测试用;
create: 每次都会创建一个新表,不会删除,用于测试
update: 如果数据中有表不创建,没有表创建,还能更新表结构.只能增加列
validate: 只能使用我们存在表,并且对映射关系进行校验.
⑤ 在src下创建,<hibernate-configuration> 配置driveclass url username password;
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql
<property name="hibernate.connection.url">jdbc:mysql
<property name="hibernate.connection.username">root
<property name="hibernate.connection.password">root
可以向数据库发送的SQL语句显示
<property name="hibernate.show_sql">true
格式化SQL
<property name="hibernate.format_sql">true
hibernate的方言, 会针对不同数据库产生不同的SQL语言
<property name="hibernate.dialect">
映射配置文件所在的位置, 注意是/ !!!
<property resource="com/xc/domain/配置文件名称">
三. hibernate开发:
新建java类, 在方法内, new 实体类,自动增长的id不用赋值,对其他属性赋值
1.new Configuration().cnfigure(); 去加载核心配置文件,把映射文件导入
2. hibernateCofing.buildsesionfactory(); 得到核心配置文件中标签下的配置信息sessionfactory;
3 sessionfactory.opensession(); 相当于得到一个connection;
4. 开启事物:session.beginTransaction();
5 opensession.save(对象); 保存, c = session.get(customer.class,1);得到id=1 c.getname信息;
session.load(customer.class,1)都是查询, session.update(c);修改操作;
session.delete(c) //删除操作;
查询所有;session.createQuery("from 类名"); //HQL 他是类似与SQL;
query.list();
6 sessionfactory.gettransaction().commit()
7. 关闭连接 ,seesion.close() seesionfatroy.close();
四 hibernate: 核心类和接口介绍
1. 一共6个, session, sessionfactory,transaction, query,criteria,
1. configuration: 用于加载核心配置.new configuration().configure(); 不用方法载.properties;
在configure("my.xml"),可以改变核心配置文件名称;
手动加载映射 configure.addresource("com.xc.doma/cust.mxl");
configure.addclass(Custmoer.class);直接在实体类所在包下查找规范映射配置文件
2.sessionfactory: 用configure.buildsessionfactory()得到; opensession()
getcurrentsession() 获取一个与线程绑定的session; 当提交或事物回滚,会自动关闭
①不是轻量级的,不要频繁的创建关闭,一个项目只有一个,通过session进行操作;
②.保证一个项目所使用sessionfactory只有一个.创建一个工具类, 属性静态 configration和
sessionfactory, 静态代码块,得到sessionfactory, 然后一个获取session的方法.
③.不要关闭sessionfactory; 它内部维护了一个连接池
3. session: 线程不安全,解决安全问题, 只需要方法内部创建就可以,不要声明成员变量.
session常用的方法: save 保存对象 update 修改操作 delete 删除 get/load 根据id查询
savenorupdate : 数据库中有数据update和无数据执行save,
createquery(); 获取query对象
crateSQLquery():获取可以操作SQL的sqlquery对象, cratecriteria() 可以完成条件查询
4.Transaction 接口主要用于管理事物,对底层的事物进行了封装,它可以进行事物操作
程序中没有开启事物,session的每一个操作,他就会开启一个事物;默认事物不会自动提交
5.query 主要完成查询操作
① HQL语句session.createquery(hql);
查询所有操作 ;from 类名
分页查询: query.setfirstresult()开始位置(0开始); .setmaxresults()本页显示的条数;
查询指定列信息: select new 类名(属性1,属性2) from 类名,得到的数组
这时候需要hibernate中的投影查询, 在customer类中加一个想要几列的构造函数
条件查询: 可以使用where; 查询姓名0的信息 session.createquery(from Customer where name=?)
或 session.createquery(from Customer where name=:abc)有名称参数
对无名称参数赋值: query.setparameter(坐标从0开始,"要赋的值");
对有名称参数赋值: query.setparameter("abc","要赋的值");
如果结果是一条: query.uniqueResult();得到一个对象
②SQL语句session.createsqlquery(sql);
session.createSQLQuery("sql语句"); query.addentity(类.calss); query.list();
对参数赋值 query.setparameter(坐标从0开始,"要赋的值");
③criteria : 是轻量级,不能在session外使用,
session.createcriteria(customer.class)得到criteria对象;
查询所有; criteria.list() 分页: setfirstresult() setmaxresults();
query.uniqueResult();得到一个对象
多条件查询: 查询name="sdf"
criteria.add(Restrictions.eq("类中的属性name","值"));
查询name="sdf"或者查询地址为上海 or
criteria.add(restrications.or(Restrictions.eq("类中的属性name","值")
,(Restrictions.eq("类中的属性id",值))); 值根据类型 和 and
五: hibernate开发规范和主键生成策略
1.持久化类 persistent object(po) , 对于hibernate 中po编写规则:
①必须提供一个无参数的public构造方法
②属性要private,对外提供public的get/set方法,
③在po类红提供一个标识属性,他与数据库主键对应,叫做oid; hibernate用过这个属性来区别不同的PO对象;
④po类属性尽量使用包装类类型: 基本数据类不能描述不存在概念比如说0在数据库中有意义,
而0却是int类型的默认值.对象默认值是null;
⑤po类不能使用final修饰符,final修饰的类不能被子类继承; hibernate中get/load方法的区别:
get直接得到一个持久化类的对象;立即查询操作,发送SQL语句, 查询到不存在的,返回为null;
load得到一个持久化类的代理对象(子类对象);延迟策略查询数据,只有用到这个查询结果的时候,才会查询;
查询到不存在的,报错;0
2.hibernate主键生成策略:
自然主键(具有业务意义: 身份证号,学号)
代理主键(无业务意义,比如自增id,建议使用)
1.increment: 由hibernate维护的变量, 每次生成注解自动递增, 优点: 夸平台, 缺点: 不合适高并发访问;
2.identity: 有底层数据库生成标识符,条件数据库支持自动增长数据类型,
优点:与hibernate无关 缺点:oracle不能用
3.sequence : 优点: 由底层数据库维护, 缺点: 数据库必须支持sequence; 在<generator> <param>指定序列名
4.native: 根据底层数据库来自动选择,主键生成策略 优点:在项目中存在多个数据库中采用, 缺点:效率低
5 uuid: 保证主键的唯一性, 与数据库无关,方便数据库移植,效率高,不访问数据库可以直接生成主键值
缺点: 长度大(32),占用空间大,对应数据库中类型 char varchar;
6.自然主键 assigned::有Java程序员赋值; 缺点:主键应该尽量避免手动生成