mybatis三部曲_增强__玩转多对一和一对多

1、SQL映射器Mapper接口

1.1、UserMapper.java

public interface UserMapper {

        

         User getUser(Long id);

        

         @Select("select * from t_user")

         List<User> getList();

}

1.2、UserMapper.xml

<mapper namespace="cn.itsource.mybatis.mapper.UserMapper">

         <select id="getUser" parameterType="long" resultType="cn.itsource.mybatis.mapper.User">

                   select

                   u.id,u.name,u.password

                   from t_user u where id=#{id}

         </select>

</mapper>

1.3、测试

@Test

         public void getUser() {

                   SqlSession session = null;

                   session = SqlSessionUtil.getSession();

                   UserMapper mapper= session.getMapper(UserMapper.class);

                   User user=mapper.getUser(14L);

                   System.out.println(user);

                   session.close();

         }

2、Mybatis的批量操作

2.1、Xml中的批量添加

      

foreach

           collection : 源

           item : 元素

           separator : 分隔符

           open : 以哪个字符串开始

           close : 以哪个字符串结束

 

3、Mybatis的动态SQL

 3.1、If

3.2、Choose

如果username有值,则根据username查,

           如果state有值,则根据state查,

           如果都没有值,则查所有

           choose是多分支,多个条件只会进一个

           javaif else if else语法一致

           if(username!=null){

              and username like '%${username}%'

           }else if(state!=null){

              and state = #{state}

           }else{

              .....

           }

3.3、Where和trim

where会自动重写第一个条件的and(如果有则去掉)

           不会为条件添加and

           使用where的时候,建议为每个条件前面都加and

Trim将结果前面添加一个where,如果结果最开始有and,则重写and(去掉)

3.4、Set

set 用法与where类似

set可以重写最后一个条件后面的,(如果有,则去掉)

3.5、抽取公共标签和引用

4、(多对一)关联映射

4.1、第一种方式

 Xml:

<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.UserMapper">

         <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap">

                   <id property="id" column="id"/>

                   <result property="name" column="name"/>

                   <result property="password" column="password"/>

                   <!-- 映射一个对象类型,不适用result -->

                   <!-- 使用association映射对象类型 -->

                   <!-- 如果使用了association,其他的属性必须也要手动映射 -->

                   <association property="dept" javaType="cn.itsource.mybatis._05_many2one.domain.Dept">

                            <id property="id" column="dept_id"/>

                            <result property="name" column="dname"/>

                   </association>

         </resultMap>

         <!-- 查询并返回所有的用户信息 -->

         <select id="selectAll" resultMap="UserMap">

                   <!-- select * from t_user -->

                   SELECT

                            u.*, d. NAME AS dname

                   FROM

                            t_user u

                   LEFT JOIN t_dept d ON u.dept_id = d.id

         </select>

</mapper>

4.2、第二种方式

UserMapper.xml

<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.UserMapper">

        

         <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap">

                   <id property="id" column="id"/>

                   <result property="name" column="name"/>

                   <result property="password" column="password"/>

                   <!--

                            使用第一次查询所有员工信息的结果,继续进行第二次查询,根据部门编号查部门信息

                            select  第二次查询的sql语句  namesapce+.id

                            column  将第一次查询结果的哪一个列作为第二次查询的条件

                            property 将第二次查询的结果封装成对为哪个属性赋值

                    -->

                   <association property="dept" column="dept_id"

                            select="cn.itsource.mybatis._05_many2one.mapper.DeptMapper.selectByPrimaryKey"></association>

         </resultMap>

         <!-- 查询并返回所有的用户信息 -->

         <select id="selectAll" resultMap="UserMap">

                   select * from t_user

         </select>


</mapper>

DeptMapper.xml

<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.DeptMapper">

         <!-- 根据编号查询并返回部门信息 -->

         <select id="selectByPrimaryKey" parameterType="long" resultType="cn.itsource.mybatis._05_many2one.domain.Dept">

                   select * from t_dept where id=#{id}

         </select>


</mapper>

4.3、第三种方式

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.itsource.mybatis._05_many2one.mapper.UserMapper">

        

         <resultMap type="cn.itsource.mybatis._05_many2one.domain.User" id="UserMap">

                   <!-- 多对一嵌套结果的变种:第三种方式 -->

                   <result property="dept.id" column="dept_id"/>

                   <result property="dept.name" column="dname"/>

         </resultMap>

        

         <!-- 查询并返回所有的用户信息 -->

         <select id="selectAll" resultMap="UserMap">

                   SELECT

                            u.*, d. NAME AS dname

                   FROM

                            t_user u

                   LEFT JOIN t_dept d ON u.dept_id = d.id

         </select>


</mapper>

5、(一对多)集合映射

5.1、第一种方式

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.itsource.mybatis._06_one2many.mapper.DeptMapper">


         <resultMap type="cn.itsource.mybatis._06_one2many.domain.Dept" id="DeptMap">

                   <id property="id" column="did"/>

                   <result property="name" column="dname"/>

                   <!--

                            只要用了collection,其他的所有的属性都必须手动映射

                            collection 用来映射集合

                                     property (集合)对象的属性值

                                     ofType 集合的泛型类型,集合中每一个元素的类型

                    -->

                   <collection property="users" ofType="cn.itsource.mybatis._06_one2many.domain.User">

                            <id property="id" column="id"/>

                            <result property="name" column="name"/>

                            <result property="password" column="password"/>

                   </collection>

         </resultMap>


         <!-- 查询并返回所有的部门信息 -->

         <select id="selectAll" resultMap="DeptMap">

                   <!-- select * from t_dept -->

                   <!-- sql查询所有部门以及对应的用户信息 -->

                   SELECT

                            d.id AS did,

                            d. NAME AS dname,

                            u.*

                   FROM

                            t_dept d

                   LEFT JOIN t_user u ON d.id = u.dept_id

         </select>


</mapper>

5.2、第二种方式

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.itsource.mybatis._06_one2many.mapper.DeptMapper">


         <!--

                   手动映射没有找到映射的列,继续进行自动映射

          -->

         <resultMap type="cn.itsource.mybatis._06_one2many.domain.Dept" id="DeptMap">

                   <id property="id" column="id"/>

                   <result property="name" column="name"/>

                   <collection property="users" select="selectUserByDeptId" column="id"></collection>

         </resultMap>



         <!-- 查询并返回所有的部门信息 -->

         <select id="selectAll" resultMap="DeptMap">

                   select * from t_dept

         </select>

        

         <!-- 嵌套查询的sql,根据部门编号查询用户信息 -->

         <select id="selectUserByDeptId" parameterType="long" resultType="cn.itsource.mybatis._06_one2many.domain.User">

                   select * from t_user where dept_id = #{dept_id}

         </select>


</mapper>

6、缓存

6.1、一级缓存

    SqlSession级别缓存,缓存对象存储周期为第一次获取,到sqlsession被销毁掉,或是sqlSession().clearCache()的时候销毁。在嵌套查询中已经看到。

6.2、二级缓存

    SqlSessionFactory级别缓存,缓存对象存储周期为第一次获取,到SqlSessionFactory被销毁掉(应用停止了);

6.3、注意事项:

1、默认情况下,只开启一级缓存,如果需要开启二级缓存我们需要在DomainMapper.xml添加一个<cache/>标签。:开启二级缓存

    2、  需要缓存的对象,domain对象.应该实现java.io.Serializable;

猜你喜欢

转载自blog.csdn.net/weixin_42560234/article/details/84669661