一、定义
Hibernate是数据持久层的一个轻量级框架
二、环境
下载地址:http://hibernate.org/orm/
下载完成后lib中required为必须的jar包
三、配置
说明:在这里仅仅展示基本的配置
hibernate.cfg.xml(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>
<!-- url,username,password -->
<property name="hibernate.connection.url">jdbc:mysql://192.168.2.2:3306/test_project</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">a123</property>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- update:更新;create:每次执行的时候都会重新创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 解决getCurrentSession()问题 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 显示执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 映射,需要与*.hbm.xml对应 -->
<mapping resource="com/user/model/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
*.hbm.xml (model目录下)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name:类的全名;table:数据库的表名 -->
<class name="com.user.model.User" table="T_USER">
<!-- id标签:表示主键;
name:属性名;
type:类型,可以写Java,hibernate,标准数据库的类型
column:对应在数据库中的类型
generator中class:通常使用assigned(手动给),native(自动增长) -->
<id name="id" type="java.lang.String">
<column name="ID" />
<generator class="assigned" />
</id>
<!-- property标签:普通属性 -->
<property name="username" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="sex" type="int">
<column name="SEX" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<property name="pictureName" type="java.lang.String">
<column name="PICTURE_NAME" />
</property>
</class>
</hibernate-mapping>
日期:
四、基本用法
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
/*若是session存在,获取,否则等同于openSession*/
Session session = sessionFactory.getCurrentSession();
/*开启事务*/
session.beginTransaction();
session.save(user);
/*提交事务,自动关闭session*/
session.getTransaction().commit();
五、hql
说明:面向对象的语言,对所有的数据库都是一样的,相比于sql,sql操作的是表和字段,而hql操作的是对象和属性
1.关键字
SELECT,AS,FROM,WHERE,UPDATE,DELETE,AND,OR,GROUP BY,DESC
说明:类比sql
2.添加参数的方式
(1)变量
String hql = "DELETE User WHERE id =:id1";
Query<User> query = session.createQuery(hql.toString(),User.class);
query.setParameter("id1", id);
(2)?
说明:序号从0开始
String hql = "DELETE User WHERE id = ?";
Query<User> query = session.createQuery(hql.toString(),User.class);
query.setParameter(0, id);
3.批量删除
public void batchDelete(int[] ids){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
StringBuilder hql = new StringBuilder("DELETE User WHERE 1=2");
int index = 1;
for (int i=0;i<ids.length;i++) {
hql.append(" OR id =:id" + String.valueOf(index++));
}
Query<User> query = session.createQuery(hql.toString(),User.class);
index = 1;
for (int id : ids) {
query.setParameter("id" + String.valueOf(index++), String.valueOf(id));
}
int count = query.executeUpdate();
session.getTransaction().commit();
/*影响的行数*/
System.out.println("count : "+count);
}
4.查询
public List<User> query(UserDto userDto){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
StringBuilder hql = new StringBuilder("FROM User WHERE 1=1");
if(userDto.getId() != null && !userDto.getId().isEmpty()){
hql.append(" AND id =:ids");
}
if(userDto.getUsername() != null && !userDto.getUsername().isEmpty()){
hql.append(" AND username =:usernames");
}
if(userDto.getPassword() != null && !userDto.getPassword().isEmpty()){
hql.append(" AND password =:passwords");
}
session.beginTransaction();
/*分页*/
query.setFirstResult(0);
query.setMaxResults(5);
if(userDto.getId() != null && !userDto.getId().isEmpty()){
query.setParameter("ids", Integer.parseInt(userDto.getId()));
}
if(userDto.getUsername() != null && !userDto.getUsername().isEmpty()){
query.setParameter("usernames", userDto.getUsername());
}
if(userDto.getPassword() != null && !userDto.getPassword().isEmpty()){
query.setParameter("passwords", userDto.getPassword());
}
List<User> userList = query.list();
session.getTransaction().commit();
return userList;
}
六、性能优化
1.延迟加载
方式:推迟与数据库的交互时间,只有真正使用该对象的数据时才会创建
(1)获取对象(get->load)
(2)获取集合
(3)获取某一对象关联的另外一个对象(例如:Person对象中的Card对象)
说明:lazy=”false” 不延迟加载,默认开启
2.抓取策略(fetch)
select——单独查询
join——连接查询
subselect——子查询