jar:antlr-2.7.7.jar
Hibernate利用它从HQL到SQL的转换。
byte-buddy01.8.17.jar ->基于动态类型的超类名称来随机生成类名
dom4j-2.1.1.jar 解析XML配置文件和XML映射文件
hibernate-commons-annotations-5.0.4.Final.jar. Hibernate注解包
hibernate-core-5.3.7.Final.jar Hibernate 核心包
jandex-2.0.5.Final.jar 用来索引Anotation的
javassist-3.23.1-GA.jar Hibernate用它来实现PO字节码的动态生成
javax.persistence-api-2.2.jar 持久化api
jboss-logging-3.3.2.Final.jar 日志服务通用库
jboss-transaction-api_1.2_spec-1.1.1.Final.jar JTA规范包
ORM思想:关系对象映射
O:object
R:relation
M:mapping
XML
核心配置文件:名称:hibernate.cfg.xml,位置src目录下
文件约束:hibernate-configuration
<?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:///webcrud</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
参数:
必选:
数据库连接参数
hibernate.dialect //数据库方言MySql值为org.hibernate.dialect.MySQLDialect
可选:
hibernate.show_sql //打印数据库语句
hibernate.format_sql //格式化数据库语句
hibernate.hbm2ddl.auto
/**建表策略
*create-drop 创建表再删除表
*create 表存在就删除再创建表
*update 一般用
*validate 表不存在就报错
*/
mapping:引入映射文件
ORM映射文件: 名字任意,一般与类同一个包
文件dtd约束,hibernate-mapping,参考hibernate-core.jar中的org.hibernate中的dtd文件
<?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.shop.domain.User" table="user">
<id name="uid" column="uid">
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
</class>
</hibernate-mapping>
id元素:
name: 属性名
column: 主键列名
type(可选): 填写列的类型,hibernate会自动检测实体的属性类型
not-null(可选):是否不能为空,默认false
length(可选): 数据库中列的长度,默认数据库类型的最大长度
generator:主键生成策略
<generator class="native"></generator>
值:
ldentity:
increment:
sequence:
hilo:
native:
uuid:
assigned:
property元素的属性:
name: 属性名
column(可选): 列名
type(可选): 填写列的类型,hibernate会自动检测实体的属性类型
not-null(可选):是否不能为空,默认false
length(可选): 数据库中列的长度,默认数据库类型的最大长度
增加
session.save(obj);
删除
session.delete(obj);
修改
session.update(obj);
查询:
get:没有使用懒加载机制
load:默认使用懒加载机制
映射文件中表的属性lazy设置懒加载机制默认true开启栏加载机制
session.get(obj.class,1);
对象导航查询:
OID查询:
Query:
List: list
String hql = "from com.shop.domain.User";
Query createQuery = session.createQuery(hql);
List<User> list = createQuery.list();
条件查询: uniqueResult()
1.
String hql = "from com.shop.domain.User where uid = 1";
Query createQuery = Session.createQuery(hql);
Object uniqueResult = createQuery.uniqueResult();
2.
String hql = "from com.shop.domain.User where uid = ?";
Query createQuery = Session.createQuery(hql);
createQuery.setInteger(0,1);
Object uniqueResult = createQuery.uniqueResult();
3.
String hql = "from com.shop.domain.User where uid = ?";
Query createQuery = Session.createQuery(hql);
createQuery.setParameter(0, 1);
User user = (User) createQuery.uniqueResult();
4.
String hql = "from com.shop.domain.User where uid = :uid";
Query createQuery = Session.createQuery(hql);
createQuery.setParameter("uid",1);
5.分页
String hql = "from com.shop.domain.User";
Query Query = Session.createQuery(hql);
Query.setFirstResult(0);// 从第几条开始查询
Query.setMaxResults(1); //每次查询显示几条
List<User> list = Query.list();
Criteria:
List:list
Criteria criteria = Session.createCriteria(User.class);
List list = criteria.list();
条件查询:
Criteria criteria = Session.createCriteria(User.class);
criteria.add(Restrictions.eq("uid", 1));
User rs = (User) criteria.uniqueResult();
分页:
Criteria criteria = Session.createCriteria(User.class);
criteria.setFirstResult(0);
criteria.setMaxResults(5);
List list = criteria.list();
System.out.println(list);
聚合函数:
Criteria criteria = Session.createCriteria(User.class);
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();
SQLQuery:
String sql = "select * from t_user";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);
List<User> list = query.list();
多表查询:
级联:
//
cascade:
增删改
inverse:
true,不级联维护
false,级联维护
多对多
name属性:填写我引用别人的集合属性名称
table属性:填写中间表的表名
key标签的column属性:填写别人引用我的外键名称
class属性:填写我引用别人类的全路径名称
man-to-many标签的column属性:填写我引用别人的外键名称
<set name="users" table="tb_user_role">
<key column="id"></key>
<many-to-many class="com.shop.domain.User" column="uid"></many-to-many>
</set>
注:取消一边的级联维护