MyBatis-03

多对一

例子

有两个表,学生表的tid是老师表的外键

老师表

CREATE TABLE teacher ( id int(10) NOT NULL, name varchar(30) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

MyBatis-03

 

 

 

学生表

CREATE TABLE student1 ( id int(10) NOT NULL, name varchar(30) DEFAULT NULL, tid int(10) DEFAULT NULL, PRIMARY KEY (id), KEY fktid (tid), CONSTRAINT tid FOREIGN KEY (tid) REFERENCES teacher (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

MyBatis-03

 

 

 

maven和mybatis配置完毕之后

  1. 创建实体类

    老师表就不必说了,照常写

    学生表写为,也就是把tid去掉写一个私有老师

    private int id;
    private String name;
    private Teacher teacher;
  2. 按照惯例开始写Mapper    MyBatis-03

  3. 配置Mapper.xml文件

  4. 我们开始写把学生和学生对应的老师写出来的方法

    public List<Student> getStudent();
    public List<Student> getStudent2();
    1. 第一种方法,联表查询

      <select id="getStudent" resultMap="StudentTeacher" >
        select * from student1
      </select>
        <resultMap id="StudentTeacher" type="com.lt.pojo.Student">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <association property="teacher" column="tid" javaType="com.lt.pojo.Teacher" select="getTeacher"/>
        </resultMap>
        <select id="getTeacher" resultType="com.lt.pojo.Teacher">
            select * from teacher where id=#{id}
        </select>

       MyBatis-03

       

       

    2. 第二种方法,结果查询

      <select id="getStudent2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.name tname
        from student1 s,teacher t
        where s.tid=t.id;
      </select>
        <resultMap id="StudentTeacher2" type="com.lt.pojo.Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <association property="teacher" javaType="com.lt.pojo.Teacher">
                <result property="name" column="tname"/>
            </association>
        </resultMap>
      </mapper>

      MyBatis-03

       

       

  5. 测试即可

一对多

我们开始写把老师和对应的学生写出来的方法

Teacher getTeacher(@Param("tid") int id);
  1. 第一种方法,联表查询

    略,本人太懒,只喜欢理解起来简单的结果查询
  2. 第二种方法,结果查询

    <select id="getTeacher" resultMap="TeacherStudent">
      select s.name sname,s.id sid,s.tid stid,t.name tname,t.id tid
      from student1 s,teacher t
      where s.tid=t.id and t.id=#{tid}
    </select>
      <resultMap id="TeacherStudent" type="com.lt.pojo.Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
          <collection property="student" ofType="com.lt.pojo.Student">
                <result property="id" column="sid"/>
                <result property="name" column="sname"/>
                <result property="tid" column="stid"/>
          </collection>
      </resultMap>

     MyBatis-03

     

     

动态 SQL

IF

<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>

choose, when, otherwise

<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>

trim, where, set

<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>

SQL片段

一些重复部分我们抽取出来方便复用。

  1. 使用sql标签抽取公共部分

    <sql id=" ">


    </sql>
  2. 在需要使用的地方用include

    <where>
    <include refid=" "></include>
    </where>

ForEach

<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>

缓存

一级缓存sqlsession默认开启

在连接到关闭之间有效

失效的情况

  1. 查询不同的东西

  2. 增删改操作,改变原来的东西,必定会刷新

  3. 手动清楚缓存clearCache

  4. 查询不同的Mapper文件

二级缓存

步骤

  1. 开启全局缓存

    <setting name="cacheEnabled" value="true"/>

     

  2. 要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:

    <cache/>                 //在当前Mapper中使用默认的

    <cache
    eviction="FIFO"
    flushInterval="60000"
    size="512"
    readOnly="true"/> //也可以自定义

自定义缓存

ehcache

导包、properties文件

上一篇:记一次cpu性能问题调优


下一篇:移动端字体自适应大小