第一节:Hibernate配置:
1.Hibernate中CURD
2.Get()与load()区别
第二节:HQL查询:
1.query.list();
2.query.iterate();
3.查询部分属性
使用对象数组
使用Map (键是下标)
使用Map (取别名)
通过所需要查询的字段,在实体中添加构造方法
通过hibernate提供的工具类
hql只能执行update,和delete的DML语句。不能执行insert语句
插入多个数据
执行分页语句
SQL预编译语句
原生SQL语句查询部分字段(转成Bean)
原生SQL语句查询部分字段(转成Map)
使用 Criteria 进行查询
第三节:多表操作
1.多表单向操作
多对一操作
一对多操作
一对一操作
多对多操作
2.多表双向操作
一对多操作
一对一操作
多对多操作
第四节:延迟加载策略
第五节:Hibernate中meger和update的区别
第一节Hibernate配置
Hibernate配置:
1.添加jar包
2.修改HibernateUtil。
private static ServiceRegistry serviceRegistry = null;
serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()).buildServiceRegistry();
sessionFactory= configuration.buildSessionFactory(serviceRegistry);
3.反向生成bean和hbm.xml文件 注意:主键生成机制
4.测试CURD
Add()
Session session = HibernateUtil.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(object);
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
Load()一条
Session session = HibernateUtil.getSession();
UserInfo userInfo = (UserInfo)session.load(UserInfo.class,
new Long(65));
Load()全部
Session session = null;
String hql = "";
Query query = null;
try {
hql = " From UserInfo order by Userid asc";
//注意:
1.表名必须与对象名相同(区分大小写),字段名也要和对象名中的属性名相同(不区分大小写)。
2.在查询结果中不能带”*”,应该写成:hql = "select a From UserInfo a where userid>10 and userid<100 order by userid asc";
3.由于查询的结果是以对象的形式,所以不能以字段形式查询 (字段构不成对象)
session= HibernateUtil.getSession();
query = session.createQuery(hql);
List<UserInfo> userList = query.list();
for (UserInfo userInfo : userList) {
System.out.println(userInfo.getUserid()+"\t"+userInfo.getUsername()+"\t"+userInfo.getTruename());
}
} catch (Exception e) {
e.printStackTrace();
}
第二节HQL
1.HQL查询:
1.query.list();(只会发出一条sql语句)
2.query.iterate();(先发一条语句去查询主键,将id缓存起来,然后根据id去数据库发出查询多条语句)
Iterator<UserInfo> iterator = query.iterate();
while(iterator.hasNext()){
UserInfo userInfo = iterator.next();
System.out.println(userInfo.getUserid()+"\t"
+userInfo.getUsername()+"\t"+userInfo.getTruename());
}
3.查询部分属性(字段)
1.使用对象数组
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select a.userid,a.username From UserInfo a order by userid asc";
session= HibernateUtil.getSession();
query = session.createQuery(hql);
List<Object[]> userList = query.list();
for (int i = 0; i < userList.size(); i++) {
Object[] objArray = userList.get(i);
String userid = String.valueOf(objArray[0]);
String username = String.valueOf(objArray[1]);
System.out.println(userid+"\t"+username);
}
} catch (Exception e) {
e.printStackTrace();
}
2.使用Map (键是下标)
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select new map(a.userid,a.username) From UserInfo a order by userid asc";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
List<Map<String,Object>> userList = query.list();
for (int i = 0; i < userList.size(); i++) {
//Object[] objArray = userList.get(i);
Map<String,Object> rowMap =
(Map<String,Object>)userList.get(i);
String userid = String.valueOf(rowMap.get("0"));
String username = String.valueOf(rowMap.get("1"));
System.out.println(userid + "\t" + username);
}
} catch (Exception e) {
e.printStackTrace();
}
3.使用Map (取别名)
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select new map(a.userid as userid,a.username as username) From UserInfo a order by userid asc";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
List<Map<String,Object>> userList = query.list();
for (int i = 0; i < userList.size(); i++) {
//Object[] objArray = userList.get(i);
Map<String,Object> rowMap =
(Map<String,Object>)userList.get(i);
String userid = String.valueOf(rowMap.get("userid"));
String username =
String.valueOf(rowMap.get("username"));
System.out.println(userid + "\t" + username);
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.通过所需要查询的字段,在实体中添加构造方法
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select new com.bean.UserInfo(a.userid as userid
,a.username as username) From UserInfo a order by userid asc";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
List<UserInfo> userList = query.list();
for (UserInfo userInfo : userList) {
System.out.println(userInfo.getUserid()+"\t"
+userInfo.getUsername());
}
} catch (Exception e) {
e.printStackTrace();
}
5.通过hibernate提供的工具类org.hibernate.transform.Transformers
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select a.userid as userid,a.username as username From UserInfo a order by userid asc";//userid与对象的属性相同
session = HibernateUtil.getSession();
query = session.createQuery(hql);
query.setResultTransformer(Transformers.aliasToBean(
UserInfo.class));
List<UserInfo> userList = query.list();
for (UserInfo userInfo : userList) {
System.out.println(userInfo.getUserid()+"\t"+
userInfo.getUsername());
}
} catch (Exception e) {
e.printStackTrace();
}
6.hql只能执行update,和delete的DML语句。不能执行insert语句
Session session = null;
String hql = "";
Query query = null;
Transaction tx = null;
try {
hql = "Update UserInfo set truename='更新' where userid=445 ";
hql = "Delete From UserInfo where userid=445 ";
session = HibernateUtil.getSession();
tx = session.beginTransaction();
query = session.createQuery(hql);
query.executeUpdate();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
7.插入多个数据
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
for (int i = 0; i < 1000; i++) {
DeptBean deptBean = new DeptBean();
deptBean.setDeptId(String.valueOf(i));
deptBean.setDeptName("部门_"+i);
session.save(deptBean);
if(i%500==0){//清空缓存
session.clear();
session.flush();
}
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
8.返回聚合结果(一个对象)
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select a From UserInfo a where userid=5";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
//方法1
List<UserInfo> userList = query.list();
if(userList.size()>=1){
UserInfo userInfo = userList.get(0);
System.out.println(userInfo.getUsername());
}
//方法2
UserInfo userInfo = (UserInfo)query.uniqueResult();
if(userList.size()>=1){
userInfo = userList.get(0);
System.out.println(userInfo.getUsername());
}
hql = "select count(userid) From UserInfo a";//通过聚合语句查询
session = HibernateUtil.getSession();
query = session.createQuery(hql);
Long countRow = (Long)query.uniqueResult();
System.out.println(countRow);
} catch (Exception e) {
e.printStackTrace();
}
9.执行分页语句
Session session = null;
String hql = "";
Query query = null;
try {
hql = "select a From UserInfo a order by userid asc";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
query.setFirstResult(0);//页号pageNo,从0开始
query.setMaxResults(5);//每页的条数pageNum
List<UserInfo> userList = query.list();
for (UserInfo userInfo : userList) {
System.out.println(userInfo.getUserid() + "\t"
+ userInfo.getUsername() + "\t"
+ userInfo.getTruename());
}
} catch (Exception e) {
e.printStackTrace();
}
4.预编译语言
Session session = null;
String hql = "";
Query query = null;
try {
//hql = "select a From UserInfo a where a.username like ? and a.usersex=? order by userid asc";
hql = "select a From UserInfo a where a.username like :username and a.usersex=:usersex order by userid asc";
session = HibernateUtil.getSession();
query = session.createQuery(hql);
//1
query.setString("username", "%a%");
query.setString("usersex", "1");
//2
//Map<String,Object> paramMap = new HashMap<String, Object>();
//paramMap.put("username", "%a%");
//paramMap.put("usersex", "1");
//query.setProperties(paramMap);
//3
//UserInfo paramBean = new UserInfo();
//paramBean.setUsername("%a%");
//paramBean.setUsersex("1");
//query.setProperties(paramBean);
List<UserInfo> userList = query.list();
for (UserInfo userInfo : userList) {
System.out.println(userInfo.getUserid() + "\t"
+ userInfo.getUsername() + "\t"
+ userInfo.getTruename());
}
} catch (Exception e) {
e.printStackTrace();
}
5.SQL预编译语句
1.转成Bean
Session session = null;
SQLQuery sqlQuery = null;
String sql = null;
try {
sql = "Select userid,username From T_Userinfo where username like '%a%' order by userid asc";
session = HibernateUtil.getSession();
sqlQuery = session.createSQLQuery(sql);
// addScalar,其它的数据可以不用调用addScalar方法,Oracle中字段名全部都是大写
sqlQuery.addScalar("userid", LongType.INSTANCE);
sqlQuery.addScalar("username", StringType.INSTANCE);
sqlQuery.setResultTransformer(Transformers
.aliasToBean(UserInfo.class));
// addEntity适合查询所有的记录。
// sqlQuery.addEntity(UserInfo.class);
List userList = sqlQuery.list();
for (int i = 0; i < userList.size(); i++) {
System.out.println(userList.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
2.转成Map
Session session = null;
SQLQuery sqlQuery = null;
String sql = null;
try {
sql = "Select a.*,b.menu_id from T_Sys_Role a left outer join T_Sys_Role_Menu b on a.role_id = b.role_id where a.role_id = 1";
session = HibernateUtil.getSession();
sqlQuery = session.createSQLQuery(sql);
sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
// addEntity适合查询所有的记录。
// sqlQuery.addEntity(UserInfo.class);
List userList = sqlQuery.list();
for (int i = 0; i < userList.size(); i++) {
System.out.println(userList.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
6.原生SQL语句查询部分字段(转成bean,不需要创建构造方法)将小写转成大写
Session session = null;
SQLQuery sqlQuery = null;
String sql = null;
try {
sql = "Select userid,username From T_Userinfo where username like '%a%' order by userid asc";
session = HibernateUtil.getSession();
sqlQuery = session.createSQLQuery(sql);
sqlQuery.addScalar("userid", LongType.INSTANCE);
sqlQuery.addScalar("username", StringType.INSTANCE);
sqlQuery.setResultTransformer(
Transformers.aliasToBean(UserInfo.class));
List userList = sqlQuery.list();
for (int i = 0; i < userList.size(); i++) {
UserInfo userInfo = (UserInfo)userList.get(i);
//只能输出Select中查询的字段
System.out.println(userInfo.getUsername()
+"\t"+userInfo.getUserid());
}
} catch (Exception e) {
e.printStackTrace();
}
7.原生SQL语句查询部分字段(转成Map,不需要创建构造方法)将小写转成大写
Session session = null;
SQLQuery sqlQuery = null;
String sql = null;
try {
sql = "Select a.*,b.menu_id from T_Sys_Role a left outer join T_Sys_Role_Menu b on a.role_id = b.role_id where a.role_id = 1";
session = HibernateUtil.getSession();
sqlQuery = session.createSQLQuery(sql);
sqlQuery.addScalar("role_id", StringType.INSTANCE);
sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> roleList = sqlQuery.list();
for (int i = 0; i < roleList.size(); i++) {
Map<String, Object> paramMap =
(Map<String, Object>)roleList.get(i);
System.out.println(paramMap.get("role_id"));
}
} catch (Exception e) {
e.printStackTrace();
}
8.使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装
Session session = null;
List<UserBean> userList = null;
try {
session = HibernateUtil.getSession();
Criteria criteria = session.createCriteria(UserBean.class);
// 加条件
criteria.add(Restrictions.eq("usersex", "0"));
criteria.add(Restrictions.ilike("username", "%a%"));
criteria.add(Restrictions.between("userage", new Long(20),
new Long(30)));
// 排序
criteria.addOrder(Order.asc("userid"));
userList = criteria.list();
//userList = session.createCriteria(UserBean.class)
//.add(Restrictions.like("username", "%a%")).add(
//Restrictions.or(Restrictions.eq("usersex", "0"),
//Restrictions.between("userage",
//new Long(20), new Long(30))))
//.addOrder(Order.asc("userid")).list();
for (UserBean userBean : userList) {
System.out.println(userBean.getUserid() + "\t"
+ userBean.getUsername() + "\t" + userBean.getUsersex()
+ "\t" + userBean.getUserage());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
第三节 多表操作
一、单向操作
1、多对一(多的一方(GroupUser)获取一的一方(Group))
GroupUser.hbm.xml
<!-- many_to_one时,必须删除关联字段属性的设置。
<property name="groupId" type="java.lang.Long">
<column name="GROUP_ID" precision="22" scale="0" />
</property>
-->
<!-- group_id是GroupUser中和外表关联的字段(外键) -->
<many-to-one name="groupBean" class="com.many_to_one.GroupBean" column="group_id"/>
① Add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
GroupBean groupBean = new GroupBean();
groupBean.setGroupname("java_兴趣小组");
GroupUserBean userBean_1 = new GroupUserBean();
userBean_1.setUsername("aa");
userBean_1.setGroupBean(groupBean);
GroupUserBean userBean_2 = new GroupUserBean();
userBean_2.setUsername("bb");
userBean_2.setGroupBean(groupBean);
GroupUserBean userBean_3 = new GroupUserBean();
userBean_3.setUsername("cc");
userBean_3.setGroupBean(groupBean);
session.save(groupBean);
session.save(userBean_1);
session.save(userBean_2);
session.save(userBean_3);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
② Load()/Get()
Session session = null;
try {
session = HibernateUtil.getSession();
GroupUserBean userBean =
(GroupUserBean)session.get(GroupUserBean.class, new Long(64));
GroupBean groupBean = userBean.getGroupBean();
System.out.println("用户的信息:"
+userBean.getUserid()+"\t"+userBean.getUsername());
System.out.println("组的信息:
"+groupBean.getGroupid()+"\t"+groupBean.getGroupname());
} catch (Exception e) {
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
GroupUserBean userBean = (GroupUserBean) session.get(
GroupUserBean.class, new Long(67));
// 多对1时,
// 删除More一方,并不会级联的去删除One的一方。
session.delete(userBean);
// 如果想要级联删除one的一方,请显示进行删除的操作。
GroupBean groupBean = userBean.getGroupBean();
session.delete(groupBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
2、一对多(一的一方(ClassesBean(Set))获取一的一方(StudentBean))
a) Set方法
<set name="studentSet" order-by="studentID desc">
<key column="classes_id"></key>
<one-to-many class="com.one_to_many.StudentBean" />
</set>
b) List方法
<list name="studentList">
<key column="classes_id"></key>
<index column="index_id"></index>//多出一个需要排序的字段名
<one-to-many class="com.one_to_many.StudentBean" />
</list>
① Add ()
a) 添加完班级和学生对象后再修改学生中班级编号的字段(多发出update语句)
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = new ClassesBean();
classesBean.setClassesname("java1212班");
StudentBean studentBean_1 = new StudentBean();
studentBean_1.setStudentname("张三");
studentBean_1.setStudentage(new Long(20));
StudentBean studentBean_2 = new StudentBean();
studentBean_2.setStudentname("李四");
studentBean_2.setStudentage(new Long(30));
StudentBean studentBean_3 = new StudentBean();
studentBean_3.setStudentname("张三2");
studentBean_3.setStudentage(new Long(40));
Set<StudentBean> studentSet = classesBean.getStudentSet();
studentSet.add(studentBean_1);
studentSet.add(studentBean_2);
studentSet.add(studentBean_3);
session.save(classesBean);
session.save(studentBean_1);
session.save(studentBean_2);
session.save(studentBean_3);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
b) 添加完班级通过获取班级的id再添加学生。在学生对象中添加班级编号
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
ClassesBean classesBean = new ClassesBean();
classesBean.setClassesname("java1212班");
Long classes_id = (Long) session.save(classesBean);
StudentBean studentBean_1 = new StudentBean();
studentBean_1.setStudentname("张三");
studentBean_1.setStudentage(new Long(20));
studentBean_1.setClassesId(classes_id);
StudentBean studentBean_2 = new StudentBean();
studentBean_2.setStudentname("李四");
studentBean_2.setStudentage(new Long(30));
studentBean_2.setClassesId(classes_id);
StudentBean studentBean_3 = new StudentBean();
studentBean_3.setStudentname("张三2");
studentBean_3.setStudentage(new Long(40));
studentBean_3.setClassesId(classes_id);
session.save(studentBean_1);
session.save(studentBean_2);
session.save(studentBean_3);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
② load()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = (ClassesBean) session.load(
ClassesBean.class, new Long(43));
System.out.println("==班级的信息===");
System.out.println(classesBean.getClassesid() + "\t"
+ classesBean.getClassesname());
System.out.println("==学生的信息==");
/**
* 1:Set中的数据如何排序,
* 在配置文件中加入order-by="studentID desc"进行排序。studentID是字段名称
*2:如何在SET中查询符合条件的记录。
* A:循环逐条判断
* B:createFilter接口来过滤数据
* C:可以使用HQL语句来进行过滤
*/
// A
Set<StudentBean> studentSet = classesBean.getStudentSet();
for (StudentBean studentBean : studentSet) {
System.out.println(studentBean.getStudentid() + "\t"
+ studentBean.getStudentname() + "\t"
+ studentBean.getStudentage());
}
// B
Query query = session.createFilter(studentSet,
" where studentage>=21 and studentage<=25");
List<StudentBean> queryList = query.list();
for (StudentBean studentBean : queryList) {
System.out.println(studentBean.getStudentid() + "\t"
+ studentBean.getStudentname() + "\t"
+ studentBean.getStudentage());
}
// C
String hql = "Select a From StudentBean a where a.classesId = :classID and studentage>=21
and studentage<=25 order by studentid asc";
query = session.createQuery(hql);
query.setLong("classID", classesBean.getClassesid());
queryList = query.list();
for (StudentBean studentBean : queryList) {
System.out.println(studentBean.getStudentid() + "\t"
+ studentBean.getStudentname() + "\t"
+ studentBean.getStudentage());
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = (ClassesBean) session.get(
ClassesBean.class, new Long(41));
// 删除One一方,并不会级联的去删除More的一方。只是把More的一方中关联的字段的值设为NULL值。
// 如果想要级联删除More的一方,请显示进行删除的操作。
// A:获取More的集合,然后循环逐条删除
// Set<StudentBean> studentSet = classesBean.getStudentSet();
// for (StudentBean studentBean : studentSet) {
// session.delete(studentBean);
// }
// B:使用HQL语句,一次性删除或者更新
String hql = "Delete From StudentBean where classesId = :classesID";
Query query = session.createQuery(hql);
query.setLong("classesID", classesBean.getClassesid());
query.executeUpdate();
session.delete(classesBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
3、一对一(CardBean获取UserBean)
CardBean.hbm.xml
主键生成机制(参考UserBean中的主键)
<generator class="foreign">
<param name="property">userBean</param>
</generator>
<one-to-one name="userBean" class="com.one_to_one.UserBean">
① Add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
UserBean userBean = new UserBean();
userBean.setUsername("张三");
userBean.setPassword("1234");
userBean.setTruename("zhangsan");
CardBean cardBean = new CardBean();
cardBean.setUserBean(userBean);
cardBean.setCardnum("35012199101024241");
cardBean.setCardtime(new Long(20140101));
cardBean.setPublish("闽侯");
session.save(userBean);
session.save(cardBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.closeSession();
}
② Load()
Session session = null;
try {
session = HibernateUtil.getSession();
CardBean cardBean = (CardBean) session.get(CardBean.class,
new Long(84));
System.out.println(cardBean.getUserId() + "\t"
+ cardBean.getCardnum() + "\t"
+ cardBean.getUserBean().getUsername() + "\t"
+ cardBean.getUserBean().getUserid());
} catch (Exception e) {
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
// one-to_one不会级联删除
CardBean cardBean = (CardBean) session.get(CardBean.class,
new Long(84));
session.delete(cardBean);
UserBean userBean = cardBean.getUserBean();
session.delete(userBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
4、多对多(RoleBean获取PowerBean)
RoleBean.hbm.xml(t_role_power中间表 role_id ,power_id中间表中关联字段)
<set name="powerSet" table="t_role_power">
<key column="role_id"></key>
<many-to-many class="com.many_to_many.PowerBean"
column="power_id"></many-to-many>
</set>
① Add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
RoleBean roleBean_1 = new RoleBean();
roleBean_1.setRoleName("管理员");
RoleBean roleBean_2 = new RoleBean();
roleBean_2.setRoleName("会员");
PowerBean powerBean = new PowerBean();
powerBean.setPowername("权限1");
PowerBean powerBean_2 = new PowerBean();
powerBean_2.setPowername("权限2");
PowerBean powerBean_3 = new PowerBean();
powerBean_3.setPowername("权限3");
PowerBean powerBean_4 = new PowerBean();
powerBean_4.setPowername("权限4");
PowerBean powerBean_5 = new PowerBean();
powerBean_5.setPowername("权限5");
PowerBean powerBean_6 = new PowerBean();
powerBean_6.setPowername("权限6");
Set<PowerBean> powerSet = roleBean_1.getPowerSet();
powerSet.add(powerBean);
powerSet.add(powerBean_3);
powerSet.add(powerBean_5);
powerSet = roleBean_2.getPowerSet();
powerSet.add(powerBean_2);
powerSet.add(powerBean_4);
powerSet.add(powerBean_6);
session.save(roleBean_1);
session.save(roleBean_2);
session.save(powerBean);
session.save(powerBean_2);
session.save(powerBean_3);
session.save(powerBean_4);
session.save(powerBean_5);
session.save(powerBean_6);
tx.commit();
② Load()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
RoleBean roleBean = (RoleBean) session.load(RoleBean.class,
new Long(56));
//1获取角色和权限数据
// System.out.println("==角色的信息===");
// System.out.println(roleBean.getRoleid() + "\t"
// + roleBean.getRolename());
//
// System.out.println("==拥有的权限信息==");
// Set<PowerBean> powerSet = roleBean.getPowerSet();
// for (PowerBean powerBean : powerSet) {
// System.out.println(powerBean.getPowerid() + "\t"
// + powerBean.getPowername() + "\t"
// + powerBean.getPowerhref());
// }
//根据过滤条件查询数据
// Query query = session.createFilter(powerSet,
// " where power_id>=22 and power_id<=28");
// List<PowerBean> queryList = query.list();
// for (PowerBean powerBean : queryList) {
// System.out.println(powerBean.getPowerid() + "\t"
// + powerBean.getPowername() + "\t"
// + powerBean.getPowerhref());
// }
//查询中间表。没有映射成实体对象,所以只能使用SQL语句查询,不能使用HQL语句。
String hql = "Select * From T_Role_Power where power_id>=22 and power_id<=28 and role_id = "
+ roleBean.getRoleid() + "";
SQLQuery sqlQuery = session.createSQLQuery(hql);
sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> list_2 = sqlQuery.list();
for (int i = 0; i < list_2.size(); i++) {
Map<String, Object> paramMap = list_2.get(i);
System.out.println(paramMap.get("POWER_ID") + "\t"
+ paramMap.get("ROLE_ID"));
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//删除roleBean和关联表中的数据,不会级联删除powerBean中数据
RoleBean roleBean = (RoleBean)session.get(
RoleBean.class, new Long(57));
session.delete(roleBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
二、双向操作
1. 一对多(ClassesBean对StudentBean)
多的一方:
<many-to-one name="classesBean"
class="com.one_to_many.ClassesBean"column="classes_id"/>
删除多余的字段(属性)
<property name="classesId" type="java.lang.Long">
<column name="CLASSES_ID" precision="8" scale="0" />
</property>
① Add()多的一方添加
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = new ClassesBean();
classesBean.setClassesname("java1212班");
session.save(classesBean);
StudentBean studentBean_1 = new StudentBean();
studentBean_1.setStudentname("张三");
studentBean_1.setStudentage(new Long(20));
// 让学生记住班级对象
studentBean_1.setClassesBean(classesBean);
StudentBean studentBean_2 = new StudentBean();
studentBean_2.setStudentname("李四");
studentBean_2.setStudentage(new Long(30));
studentBean_2.setClassesBean(classesBean);
StudentBean studentBean_3 = new StudentBean();
studentBean_3.setStudentname("张三2");
studentBean_3.setStudentage(new Long(40));
studentBean_3.setClassesBean(classesBean);
session.save(studentBean_1);
session.save(studentBean_2);
session.save(studentBean_3);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
② Load()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = (ClassesBean) session.load(
ClassesBean.class, new Long(42));
System.out.println("正向读取,班级----》学生");
System.out.println("==班级的信息===");
System.out.println(classesBean.getClassesid() + "\t"
+ classesBean.getClassesname());
System.out.println("==学生的信息==");
/**
* 1:Set中的数据如何排序,
*
* 在配置文件中加入order-by="studentID desc"进行排序。studentID是字段名称
*
* 2:如何在SET中查询符合条件的记录。
*
* A:循环逐条判断
*
* B:createFilter接口来过滤数据
*
* C:可以使用HQL语句来进行过滤
*/
Set<StudentBean> studentSet = classesBean.getStudentSet();
for (StudentBean studentBean : studentSet) {
System.out.println(studentBean.getStudentid() + "\t"
+ studentBean.getStudentname() + "\t"
+ studentBean.getStudentage());
}
System.out.println("===反向读取,学生----》班级");
StudentBean studentBean = (StudentBean) session.get(
StudentBean.class, new Long(46));
System.out.println(studentBean.getStudentid() + "\t"
+ studentBean.getStudentname() + "\t"
+ studentBean.getStudentage());
System.out.println("班级的信息");
classesBean = studentBean.getClassesBean();
System.out.println(classesBean.getClassesid() + "\t"
+ classesBean.getClassesname());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
ClassesBean classesBean = (ClassesBean) session.get(
ClassesBean.class, new Long(41));
// 1对多
// 删除One一方,并不会级联的去删除More的一方。只是把More的一方中关联的字段的值设为NULL值。
// 如果想要级联删除More的一方,请显示进行删除的操作。
// A:获取More的集合,然后循环逐条删除
// Set<StudentBean> studentSet = classesBean.getStudentSet();
// for (StudentBean studentBean : studentSet) {
// session.delete(studentBean);
// }
// B:使用HQL语句,一次性删除或者更新
String hql = "Delete From StudentBean where
classesId = :classesID";
Query query = session.createQuery(hql);
query.setLong("classesID", classesBean.getClassesid());
query.executeUpdate();
session.delete(classesBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
2. 多对多(RoleBean(角色)和PowerBean(权限))
RoleBean.hbm.xml
<set name="powerSet" table="t_role_power">
<key column="role_id"></key>
<many-to-many class="com.many_to_many.PowerBean"
column="power_id">
</many-to-many>
</set>
RoleBean.hbm.xml
<set name="roleSet" table="t_role_power">
<key column="power_id"></key>
<many-to-many class="com.many_to_many.RoleBean"
column="role_id">
</many-to-many>
</set>
④ Add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
RoleBean roleBean_1 = new RoleBean();
roleBean_1.setRoleName("超级用户");
RoleBean roleBean_2 = new RoleBean();
roleBean_2.setRoleName("普通用户");
PowerBean power_1 = new PowerBean("权限1", "/xx.jsp");
PowerBean power_2 = new PowerBean("权限2", "/aa.jsp");
PowerBean power_3 = new PowerBean("权限3", "/bb.jsp");
PowerBean power_4 = new PowerBean("权限4", "/cc.jsp");
PowerBean power_5 = new PowerBean("权限5", "/dd.jsp");
PowerBean power_6 = new PowerBean("权限6", "/ee.jsp");
Set<PowerBean> powerSet_1 = roleBean_1.getPowerSet();
Set<PowerBean> powerSet_2 = roleBean_2.getPowerSet();
powerSet_1.add(power_1);
powerSet_1.add(power_3);
powerSet_1.add(power_5);
powerSet_2.add(power_2);
powerSet_2.add(power_4);
powerSet_2.add(power_5);
powerSet_2.add(power_6);
session.save(roleBean_1);
session.save(roleBean_2);
session.save(power_1);
session.save(power_2);
session.save(power_3);
session.save(power_4);
session.save(power_5);
session.save(power_6);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
⑤ Load()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
RoleBean roleBean = (RoleBean) session.load(RoleBean.class,
new Long(56));
System.out.println("角色---->权限");
System.out.println(roleBean.getRoleId() + "\t"
+ roleBean.getRoleName());
Set<PowerBean> powerSet = roleBean.getPowerSet();
for (PowerBean powerBean : powerSet) {
System.out.println(powerBean.getPowerid() + "\t"
+ powerBean.getPowername() + "\t"
+ powerBean.getPowerhref());
}
System.out.println("权限--->角色");
PowerBean powerBean =
(PowerBean) session.get(PowerBean.class,
new Long(27));
System.out.println(powerBean.getPowerid() + "\t"
+ powerBean.getPowername() + "\t"
+ powerBean.getPowerhref());
Set<RoleBean> roleSet = powerBean.getRoleSet();
for (RoleBean roleBean2 : roleSet) {
System.out.println(roleBean2.getRoleId() + "\t"
+ roleBean2.getRoleName());
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
⑥ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
RoleBean roleBean = (RoleBean) session.load(RoleBean.class,
new Long(21));
// 只会删除角色与中间表的数据。权限表的信息不做删除。
session.delete(roleBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
3. 一对一(CardBean和UserBean)
CardBean.hbm.xml(删除多余的关联字段)
<one-to-one name="userBean" class="com.one_to_one.UserBean">
UserBean.hbm.xml
<one-to-one name="cardBean"
class="com.one_to_one.CardBean"></one-to-one>
① add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
UserBean userBean = new UserBean();
userBean.setUsername("One_to_One");
userBean.setPassword("1234");
userBean.setTruename("一对一的关联");
CardBean cardBean = new CardBean();
cardBean.setUserBean(userBean);
// 为了获取userBean中的主键的值。
cardBean.setCardnum("35017821945211");
cardBean.setCardtime(new Long(10));
cardBean.setPublish("福州市鼓楼区");
session.save(userBean);
session.save(cardBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
② Load()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
CardBean cardBean = (CardBean) session.load(CardBean.class,
new Long(61));
System.out.println("==身份证的信息===");
System.out.println(cardBean.getCardnum() + "\t"
+ cardBean.getPublish());
System.out.println("==用户的信息==");
UserBean userBean = cardBean.getUserBean();
System.out.println(userBean.getUserid() + "\t"
+ userBean.getUsername() + "\t"
+ userBean.getTruename());
System.out.println("双向信息读取用户----》身份证");
userBean = (UserBean) session.get(
UserBean.class, new Long(61));
System.out.println(userBean.getUserid() + "\t"
+ userBean.getUsername() + "\t"
+ userBean.getTruename());
cardBean = userBean.getCardBean();
System.out.println(cardBean.getCardnum() + "\t"
+ cardBean.getPublish());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
③ Delete()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
CardBean cardBean = (CardBean) session.load(CardBean.class,
new Long(63));
// one-to_one也不会级联删除
session.delete(cardBean);
UserBean userBean = cardBean.getUserBean();
session.delete(userBean);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
第四节 延迟加载策略
1.实体对象延迟加载
① 单表(DeptBean)
DeptBean.hbm.xml
<class name="com.bean.DeptBean" table="T_SYS_DEPT"
schema="TEST" lazy="true">
lazy="true" 表示进行对象的延迟加载,只对load()起作用
当只取其中的ID时则不会发出SQL语句,只有查询其他属性时才根据id去数据库查询对应的数据
lazy="false" 表示进行对象的立即加载,对get()/load()都不起作用
Load和Get区别:
a.
Load方法是认为所查询的数据库中肯定存在该数据,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常。
对于get方法,hibernate一定要获取到真实的数据,否则返回null
b.
Load方法加载的对象时代理对象,Get方法加载的对象时实体对象
c.使用load方法时,必须要在session关闭之前就要将所有的数据出来,不然就会报“no session”异常。
2.集合对象的延迟加载
One_to_many
<set name="studentSet" order-by="studentname asc" lazy="true">
lazy="true" 表示进行对象的延迟加载
lazy="false" 表示进行对象的立即加载
lazy="extra" 表示进行对象的延迟加载。
如果需要查询集合的大小,则多发出一条语句查询,否则就与true的效果相同
注意点:
在web层中调用查询集合中的大小的时候,需要将延迟加载关闭。
3.属性的延迟加载(大字段)
<property name="content" type="java.sql.Clob" lazy="true">
<column name="CONTENT" />
</property>
<property name="faceimage" type="java.sql.Blob" lazy="true">
<column name="FACEIMAGE" />
</property>
② Add()
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
LobHelper lobHelper = session.getLobHelper();
Clob clob = lobHelper.createClob("");
Writer writer = clob.setCharacterStream(0);
String file = "E:/TestLazy.java";
BufferedReader br = new BufferedReader(
new FileReader(new File(file)));
String entry = null;
while((entry = br.readLine())!=null){
writer.write(entry);
writer.write("\n");
}
writer.flush();
writer.close();//关闭流
Blob blob = lobHelper.createBlob(new byte[0]);
OutputStream os = blob.setBinaryStream(0);
InputStream is = new FileInputStream("d:/1.jpg");
int i = 0;
byte[] b = new byte[1024];
while((i=is.read(b))!=-1){
os.write(b,0,i);
}
LobBean lobBean = new LobBean();
lobBean.setContent(clob);
lobBean.setFaceimage(blob);
session.save(lobBean);
is.close();
os.close();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.closeSession();
}
③ load()
需要对类进行类增强机制
新建build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="hibernatelazy" default="instrument" basedir=".">
<property name="lib.dir" value="./lib"/>
<property name="classes.dir" value="./classes"/>
<path id="lib.class.path">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="instrument">
<taskdef name="instrument"
classname="org.hibernate.tool.instrument.InstrumentTask">
<classpath path="${classes.dir}"/>
<classpath refid="lib.class.path"/>
</taskdef>
<instrument verbose="true">
<fileset dir="${classes.dir}/com/derek/known/hbm">
<include name="Knownquestions.class"/>
</fileset>
</instrument>
</target>
</project>
注意:
<property name="lib.dir" value="./lib"/>所需的JAR文件路径
<property name="classes.dir" value="./classes"/>编译输出路径
第五节:Hibernate中meger和update的区别
meger()先发起一条select语句查看数据库是否存在id
①.如果存在,则会去比较值是否改变,如果数据有改变则会发起一条update语句;如果数据不改变则不发起update语句;
②.如果不存在,则数据库发起一个insert语句;
③.update则没有先发起select语句,而是直接去update;
saveOrUpdate()做下面的事:
- 如果对象已经在本session中持久化了,不做任何事
- 如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
- 如果对象没有持久化标识(identifier)属性,对其调用save()
- 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
- 如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。
- 否则update() 这个对象
merge()可非常不同:
- 如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
- 如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例
- 最后返回该持久实例
- 用户给出的这个对象没有被关联到session上,它依旧是脱管的