Hibernate/MyBatis复习

1.脏检查是实务提交时候进行的

2.刷新缓存:刷新缓存就是进行脏检查

  两种方式:

      事务提交:commit();

      session.flush();

3.关于HQL

  from Dept  检索所有部门的信息

  select d from cn.happy.entity.Dept d  检索所有部门的信息

  select d from Dept d

4.详解HQL

  setParameter( )方法用于绑定任意类型的参数

  setParameter( )有重载的方法

  setProperties( )有重载的方法

  setProperties( )方法用于绑定命名参数

5.Dept.hbm.xml

<hibernate-mapping package="cn.jbit.hibernatedemo.entity">
<class name="Emp" table="EMP" schema="scott">  scott用户
        <id name="empNo" column="EMPNO" type="int/java.lang.Integer">
            <generator class="assigned"/>
        </id>
        <property name="salary" type="java.lang.Double" column="SAL"/>
        <property name="hireDate" type="java.util.Date"/>
        <many-to-one    Emp多一方
            name="dept"
            column="DEPTNO"
            class="Dept"
        />
  </class>
</hibernate-mapping>

--OOP程序端

  public class Emp{
    private Dept dept;
  }

---SQL端

DEPTNO

6.invere

解析:维护关联关系

  true:自己不维护关联关系,对方维护

  false:自己维护关联关系

7.延迟加载  lazy hibernate 3.6.10版 hibernate 5

分类

  类级别 true(默认),false
  一对多和多对多 true(default),false,extra(加强延迟加载)
  多对一(没有set) proxy(default),no-proxy,false

8.component组件映射

<hibernate-mapping package="cn.happy.component">
   <class name="EmpInfo" table="EMPINFO">
       <id name="eid" column="EID">
        <generator class="native"></generator>
       </id>
       <property name="ename" column="ENAME" type="string"></property>
       <component  name="ehome" class="EmpHomeAddress">
          <parent name="empinfo"/>
          <property name="ehomestreet" column="EHOMESTREET" type="string"></property>
          <property name="ehomecity" column="EHOMECITY" type="string"></property>
          <property name="ehomeprovince" column="EHOMEPROVINCE" type="string"></property>
          <property name="ehomezipcode" column="EHOMEZIPCODE" type="string"></property>
       </component>
   </class>
</hibernate-mapping>

9.ExecutorType

public final enum org.apache.ibatis.session.ExecutorType {

  // Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
  public static final enum org.apache.ibatis.session.ExecutorType SIMPLE;

  // Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
  public static final enum org.apache.ibatis.session.ExecutorType REUSE;

  // Field descriptor #8 Lorg/apache/ibatis/session/ExecutorType;
  public static final enum org.apache.ibatis.session.ExecutorType BATCH;
}

10.HQL的连接查询

inner join 或 join用于内连接
inner join fetch或 join fetch用于迫切内连接
left outer join fetch 或 left join fetch用于迫切左外连接

11.批量处理数据

方式一:
  使用HQL语句
  原理: executeUpdate
  01.批量插入数据

@Test
   public void testInsert(){
       Session session = HibernateUtil.getSession();
       Transaction tx=session.beginTransaction();
       String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
       session.createQuery(hql).executeUpdate();
       tx.commit();
   }

方式二:JDBCAPI

//使用JDBC API进行批量修改
 public void testUpdateUseJDBC(){
           Session session = HibernateUtil.getSession();
           Transaction tx=session.beginTransaction();
           Work work=new Work() {
                @Override
                public void execute(Connection connection) throws SQLException {
                     String sql="update DEPTY2160New set deptName=? where deptNo>?";
                     PreparedStatement ps = connection.prepareStatement(sql);
                     ps.setString(1, "财务部2");
                     ps.setInt(2, 1);
                     ps.executeUpdate();
                }
           };
           session.doWork(work);
           tx.commit();
       }

方式三: 使用Session进行批量操作

public void testAdd(){
           Session session = HibernateUtil.getSession();
           Transaction tx=session.beginTransaction();
           Emp emp=null;
           for (int i = 0; i < 10000; i++) {
               emp=new Emp(i, "emp"+i);
               session.save(emp);
               if (i%30==0) {
                  session.flush();
                  session.clear();
               }
           }
           tx.commit();
       }

little tip:
(1)使用HQL进行批量操作 数据库层面 executeUpdate()
(2)使用JDBC API进行批量操作 数据库层面
(3)使用Session进行批量操作 会进缓存

little tip2:
C.使用Session进行批量操作,数据会被加载到Session缓存,需注意刷新并清空缓存
D.使用Session进行批量操作,适用于需要通过代码处理的复杂的业务逻辑场景

12.HQL面向的是对象和属性,不是表和字段

关于HQL的聚合函数使用,说法正确的是(ABCD )。
select count(*) from Dept d用于统计部门个数
select sum(e.salary) from Emp e用于汇总员工工资总额
select max(e.hiredate) from Emp e用于找到最新入职的员工的入职时间
select min(e.hiredate) from Emp e用于找到最早入职的员工的入职时间

13.原生SQL查询和命名查询

Query query=session.createQuery(hql)
SQLQuery query=session.createSQLQuery(sql)

1.原生SQL查询

@Test
      //原生SQL执行
      public void testClassicSQL(){
           SQLQuery query = session.createSQLQuery("select * from deptY2160new").addEntity(Dept.class);
           List<Dept> list = query.list();
           for (Dept dept : list) {
             System.out.println(dept.getDeptName());
        }
            tx.commit();
      }

2.命名查询

<!-- -原生SQL   NullPointException -->
  <sql-query name="selectEmpByDetpNoClassicSQL">
     <return alias="e" class="Emp" ></return>
     select {e.*} from  EmpY2160new e where deptNo=:deptNo
  </sql-query>

测试类

public void testNamedClassicSQL(){
        Query query = session.getNamedQuery("selectEmpByDetpNoClassicSQL");
        List<Emp> list = query.setParameter("deptNo", 1).list();
       /* for (Emp emp : list) {
            System.out.println(emp.getEmpName());
        }*/
        tx.commit();
  }

14.Hibernate常见注解

@Id
@Column
@Table
@Entity
@GeneratedValue
@ManyToOne
@JoinColumn

/**
 * 部门类
 * @author Happy 2016年1月17日19:40:56
 *
 */
@Entity   标识一个类是 持久化类
@Table(name="DeptY2160")
public class Dept {
    @Id   持久化类的标识
      Hibernate_Session

    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
    定义自己的序列生成器
    @SequenceGenerator(name="seq_gen",sequenceName="SEQ_Num",allocationSize=1,initialValue=1)
    private Integer deptNo;
    private String deptName;
    @OneToMany(mappedBy="dept",cascade={CascadeType.ALL})
/*    @Fetch(FetchMode.JOIN)
    @LazyCollection(LazyCollectionOption.FALSE)*/
    private Set<Emp> emps=new HashSet<Emp>();
    public Set<Emp> getEmps() {
        return emps;
    }
    public void setEmps(Set<Emp> emps) {
        this.emps = emps;
    }
    public Dept(Integer deptNo, String deptName) {
        this.deptNo = deptNo;
        this.deptName = deptName;
    }
    public Dept() {
    }
    public Integer getDeptNo() {
        return deptNo;
    }
    public void setDeptNo(Integer deptNo) {
        this.deptNo = deptNo;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
}

15.主键生成策略

@GeneratedValue用于定义主键值的生成策略 ,相当于native

时间: 2024-10-07 12:56:24

Hibernate/MyBatis复习的相关文章

Hibernate知识点复习之三

HIbernate知识点复习之三 案例需求描述: 存在着一个客户对应多个联系人的情况,单独在联系人管理模块中对联系人信息进行维护,功能包括: 对联系人信息进行增删改查 表关系分析: 一 概述:数据库中多表之间存在着三种关系:一对一 一对多 多对多 ,这也是系统设计中三种实体关系.二 建表原则1 一对多:在多的一方 创建外键指向一得一方的主键2 多对多:创建一个中间表,中间表里创建至少两个字段作为外键,分别指向多对多双方的主键3 一对一:(1)主键对应:一方主键作为另一方主键(2)唯一外键:一方创

spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器等信息,基本的配置信息如下: <?xml version="1.0" encoding= "UTF-8"?> <web-app version= "3.0" xmlns="http://java.sun.com/xml/n

JavaEE框架Bootstrap、HTML5、jQuery、SpringMVC、Hibernate mybatis

获取[下载地址]   QQ: 313596790   [免费支持更新] 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器(开发利器);                                         技术:313596790    增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   j

MyBatis复习

一.对JDBC的总结 1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 解决方案:使用数据库连接池管理数据库连接. 2.将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护. 解决方案:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译. 3.向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统

atitit.动态加载数据库配置in orm hibernate mybatis

atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象,,,,生成工厂类,在opoenSession 1 2.1. Hibernate动态添加配置流程 1 2.2. mybatis动态添加配置流程 1 2.3. #===hb code 2 3. 参考 3 1. 动态加载数据库配置的优点::: 1.1. 组合多个配置文件... 1.2. 连接多个数据库 2

mybatis 复习笔记01

1. 问题总结  1). 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能. 设想:使用数据库连接池管理数据库连接. 2). 将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护. 设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译. 3). 向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系

JavaEE框架Bootstrap、HTML5、jQuery、SpringMVC、Hibernate mybatis mysql

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Dr

jpa hibernate mybatis

jpa: entityManagerFactory: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean hibernate: sessionFactory: org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean mybatis: sqlSessionFactory: org.mybatis.spring.SqlSess

Hibernate mybatis

MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html Hibernate参考资料: http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/