02-1-映射文件配置

1.入参

1.1.parameterType(了解)

CRUD标签都有一个属性parameterType,底层的statement通过它指定接收的参数类型。入参数据有以下几种类型:HashMap,基本数据类型(包装类),实体类

  1. 设置传入这条语句的参数类的完全限定名或别名。
  2. 这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler 推断出具体传入语句的参数类型。

说明:
在mybatis中入参的数据类型分为2大类:

  1. 基本数据类型:int,string,long,Date等;
  1. 复杂数据类型:类(pojo)和Map;
  1. 说明:如果传递参数是数组或者集合,底层都会封装到Map集合中。<br />【示例】
  1. public interface UserMapper {
  2. //根据id查询
  3. User findById(Integer id);
  4. }
  1. 【基本类型数据】
  2. <!--根据id查询-->
  3. <!--parameterType="int" 表示sql语句参数id的类型,intInteger的别名.MyBatis 可以通过类型处理器(TypeHandler 根据接口中的方法User queryById(Integer id)参数类型推断出具体传入语句的参数类型。-->
  4. <select id="findById" resultType="user" parameterType="int">
  5. select * from user where id = #{id}
  6. </select>
  7. pojo类型】
  8. <insert id="savetUser" parameterType="User">
  9. INSERT INTO user(...) values(#{userName},...);
  10. </insert>
  11. 底层原理:
  12. User类:user_name属性,自动生成setter或者getter方法时,getUserName
  13. 当我们向xml传入#{user_Name}---->getUser_Name--->利用反射根据方法名称获取方法对象--->报反射异常
  14. 综上:
  15. 1)传入的时pojo的话,传入xml的变量名称与pojo类下属性名称要一致;
  16. 2)pojo中属性名称定义要尽量遵循驼峰命名,或者在自动生成getter或者setter方法时,自己手动纠正;

说明:对于parameterType属性可以不书写,那么MyBatis 就会通过类型处理器(TypeHandler) 根据接口中的方法User queryById(Integer id)参数类型推断出具体传入语句的参数类型。


1.2.自增主键回填(了解)

需求:新增一条数据成功后,将这条数据的主键封装到实体类中,并查看主键的值。
方式1:使用insert标签的子标签selectKey+last_insert_id()函数实现实现

| 属性 | 说明 | | —- | —- |

| keyColumn | 主键在表中对应的列名 |

| keyProperty | 主键在实体类中对应的属性名 |

| resultType | 主键的数据类型 |

| order | BEFORE:会首先选择主键,设置 keyProperty 然后执行插入语句 AFTER: 在添加语句后执行查询主键的语句 |

测试代码:
1)接口

  1. /**
  2. * 添加用户
  3. * 返回值时影响的行数
  4. * @param user
  5. * @return
  6. */
  7. Integer addUserAndGetFkId(User user);

2)映射文件:

  1. <!--
  2. selectKey:表示查询主键字段的标签 keyColumn:表示表中字段名称,一般指主键名称
  3. keyProperty="id":表示pojo类中对应主键的属性名称
  4. order="AFTER":表示在操作之前或者之后获取主键值
  5. <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
  6. select last_insert_id()
  7. </selectKey>
  8. -->
  9. <insert id="addUserAndGetFkId">
  10. insert into user values(null,#{username},#{birthday},#{sex},#{address})
  11. <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
  12. select last_insert_id()
  13. </selectKey>
  14. </insert>

3)测试

  1. @Test
  2. public void test13(){
  3. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = new User();
  5. user.setUsername("唐僧2");
  6. user.setSex("男");
  7. Date date = Date.valueOf("2020-12-15");
  8. user.setBirthday(date);
  9. user.setAddress("长安");
  10. Integer count = userMapper.addUserAndGetFkId(user);
  11. System.out.println(user.getId());
  12. //mybatis默认事务手动提交
  13. MybatisUtil.commit();
  14. MybatisUtil.close();
  15. }

4)效果
1608086585923
方式2:使用insert标签的属性useGeneratedKeys,keyProperty,keyColumn实现
参数说明:

| 属性 | 说明 | | —- | —- |

| useGeneratedKeys | true 获取自动生成的主键,相当于select last_insert_id() |

| keyColumn | 表中主键的列名 |

| keyProperty | 实体类中主键的属性名 |

说明:直接在insert标签中增加属性的方式,只适合于支持自动增长主键类型的数据库,比如MySQL或SQL Server;
测试代码:
接口:

  1. /**
  2. * 添加用户
  3. * 返回值时影响的行数
  4. * @param user
  5. * @return
  6. */
  7. Integer addUserAndGetFkId2(User user);

映射文件:

  1. <!--
  2. useGeneratedKeys="true"表示开启获取主键id的功能
  3. keyColumn="id":表示指定表中主键字段名称
  4. keyProperty="id":表示指定pojo类中主键对应的属性名称
  5. -->
  6. <insert id="addUserAndGetFkId2" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
  7. insert into user values(null,#{username},#{birthday},#{sex},#{address})
  8. </insert>

测试:

  1. @Test
  2. public void test14(){
  3. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = new User();
  5. user.setUsername("唐僧3");
  6. user.setSex("男");
  7. Date date = Date.valueOf("2020-12-15");
  8. user.setBirthday(date);
  9. user.setAddress("长安");
  10. Integer count = userMapper.addUserAndGetFkId2(user);
  11. System.out.println(user.getId());
  12. //mybatis默认事务手动提交
  13. MybatisUtil.commit();
  14. MybatisUtil.close();
  15. }

效果:
1608086848937
说明:使用方式2的话,数据库必须支持主键自增;


1.3.Mybatis入参是单参和多参(掌握)

1)单个参数

  1. 单个参数:接口方法传入一个参数
【接口传参】
  1. User queryById(Integer id);
【接收参数】

1、通过#{参数名}接收

  1. <!--根据id查询-->
  2. <select id="queryById" resultType="User" parameterType="int">
  3. select *,user_name AS userName from user where id = #{id}
  4. </select>

2、通过#{任意变量名}接收

  1. <!--根据id查询-->
  2. <select id="queryById" resultType="User" parameterType="int">
  3. select *,user_name AS userName from user where id = #{abc}
  4. </select>
【结论】
  1. 如果接口传入的时单个参数,可以在xml中使用任意变量取接收,但是不建议乱写,最好见名知意;

2) 多个参数

需求:根据用户名和性别查询用户
2.1 接口传参

  1. /**
  2. * 需求:根据用户名和性别查询用户
  3. * @param name
  4. * @param sex
  5. * @return
  6. */
  7. List<User> findUsersByUserNameAndSex(String name,String sex);

2.2 UserMapper.xml

  1. <select id="findUsersByUserNameAndSex" resultType="user">
  2. select * from user where user_name=#{name} and sex=#{sex}
  3. </select>

2.3 测试类

  1. @Test
  2. public void test15(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. List<User> users = mapper.findUsersByUserNameAndSex("孙悟空", "男");
  5. System.out.println(users);
  6. MybatisUtil.close();
  7. }

2.3 结果
1608087388541
此时会报参数绑定异常
解决方案:
方式1、使用参数索引获取:arg0,arg1(了解,不推荐)

  1. <select id="findUsersByUserNameAndSex" resultType="user">
  2. select * from user where user_name=#{arg0} and sex=#{arg1}
  3. </select>

说明: 接口参数顺序要与arg0与arg1顺序一致;
方式2:使用参数位置获取:param1,param2(了解,不推荐)

  1. <select id="findUsersByUserNameAndSex" resultType="user">
  2. select * from user where user_name=#{param1} and sex=#{param2}
  3. </select>

方式3:使用命名参数获取,明确指定传入参数的名称:(掌握)
步骤一:在接口中传入参数时通过@Param指定参数名称

  1. /**
  2. * 需求:根据用户名和性别查询用户
  3. * @param name
  4. * @param sex
  5. * @return
  6. */
  7. List<User> findUsersByUserNameAndSex(@Param("name") String name,@Param("sex") String sex);

步骤二:在接收参数时,通过指定的名称获取参数值;

  1. <select id="findUsersByUserNameAndSex" resultType="user">
  2. select * from user where user_name=#{name} and sex=#{sex}
  3. </select>

测试:
1608087561605
小结:

  1. 1)入参是单个参数(单个参数是单值类型)
  2. xml中可以任意变量取接收,但是建议名称见名知意;
  3. 2)多个参数
  4. 建议使用方式3通过注解方式给参数取别名,然后再xml中使用这个别名
  5. eg:
  6. List<User> findUsersByUserNameAndSex(@Param("name") String name,@Param("sex") String sex);
  7. 那么在xml中:
  8. <select id="findUsersByUserNameAndSex" resultType="user">
  9. select * from user where user_name=#{name} and sex=#{sex}
  10. </select>

1.4 入参类型是Pojo和Map

1)pojo参数【掌握】

说明:接口方法传入pojo类型的数据时,mybatis底层直接使用pojo封装数据。 sql语句中 #{username}取值==》到pojo中调用 getUsername(){}
测试代码:
接口:

  1. /**
  2. * 插入功能
  3. * @param user
  4. */
  5. void saveAndGetkey2(User user);

映射文件:

  1. <insert id="saveAndGetkey2" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
  2. insert into user values(null,#{username},#{age},#{birthday},#{sex},#{address})
  3. </insert>

测试:

  1. @Test
  2. public void testAdd3(){
  3. User user = new User();
  4. user.setAddress("北京");
  5. user.setUsername("于彪");
  6. user.setBirthday(new Date());
  7. mapper.saveAndGetkey2(user);
  8. //直接获取返回的主键id值
  9. System.out.println(user.getId());
  10. }

小结:
使用pojo的话,xml中参数一定名称要与pojo中的属性名称一致,否则报错(binding exception);

2)HashMap参数

需求:模拟用户登录,登录方法参数是Map集合,泛型都是String类型分别表示用户名和性别。
注意事项:参数map中的key值是与SQL语句中 #{} 的取值名称一致。
代码实现:
2.1 接口:

  1. /**
  2. * 需求:模拟用户登录,登录方法参数是Map集合,泛型都是String类型分别表示用户名和性别。
  3. * @return
  4. */
  5. User loginByNameAndSex(Map map);

2.2 映射文件:

  1. <select id="loginByNameAndSex" resultType="user" parameterType="map">
  2. select * from user where user_name=#{name} and sex=#{sex}
  3. </select>

2.3 测试:

  1. @Test
  2. public void test16(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. HashMap<String, String> map = new HashMap<>();
  5. //map中的key要与xml映射文件下的参数名称要一致
  6. map.put("name","孙悟空");
  7. map.put("sex","男");
  8. User user = mapper.loginByNameAndSex(map);
  9. System.out.println(user);
  10. MybatisUtil.close();
  11. }

小结:

  1. 1)入参类型pojo注意事项?
  2. xml映射文件下的参数名称要与pojo类中属性名称一致;
  3. 2)入参是map注意事项?
  4. xml映射文件下的参数名称要与mapkey的名称一致;

2.参数值的获取

2.1.#{}和${}两种获取参数方式TODO

  1. 参数值的获取指的是statement获取接口方法中传入的参数。<br /> 获取参数,有两种方式:**#{}**和**${}**;<br /> 以根据id查询为例测试#{}和${}区别:
  1. 使用#{}接收参数:
  2. select * from user where id=? //预编译处理,防止sql注入
  3. 使用${}接收参数:
  4. select * from user where id=1 //参数值直接拼接到sql中,会有sql注入的风险

1).#{}取值

使用#{}的sql是进行预编译的,可以防止sql注入;

2).${} 取值

注意:${id} 获取id值时,必须使用命名参数取值@param:
补充:如果是取单个值,也可使用${value}获取
1)映射文件

  1. <select id="findById2" resultType="user" parameterType="int">
  2. select * from user where id=${id}
  3. </select>

2)接口

  1. /**
  2. * 根据id查询用户信息 测试${}
  3. * @param id
  4. * @return
  5. */
  6. User findById2(@Param("id") Integer id);

3)测试

  1. @Test
  2. public void test12(){
  3. UserMapper mapper = MybatisUtils.getMapper(UserMapper.class);
  4. User user = mapper.findById2(1);
  5. System.out.println(user);
  6. MybatisUtils.close();
  7. }

小结:
面试:#{}和${}取值有什么区别?

  1. #{}
  2. sql进行预编译处理,防止sql注入;
  3. ${}
  4. 参数与sql直接拼接,有sql注入的风险;

2.2.${}应用场景和注意事项(了解)

1)${}取值的应用场景

  1. 在一些特殊的应用场景中,需要对SQL语句部分(不是参数)进行拼接,这个时候就必须使用${}来进行拼接,不能使用#{}.例如:
  1. 1、企业开发中随着数据量的增大,往往会将数据表按照年份进行分表,如:2017_user2018_user....,对这些表进行查询就需要动态把年份传入进来,而年份是表名的一部分,并不是参数,JDBC无法对其预编译,所以只能使用${}进行拼接:
  2. SELECT * FROM ${year}_user
  3. 2、根据表名查询数据总记录数:
  4. SELECT COUNT(*) FROM user
  5. SELECT COUNT(*) FROM order
  6. SELECT COUNT(*) FROM ${tableName}
  7. 简言之:如果需要设置到SQL中的不是查询的条件,只能使用${}拼接;

示例:
需求:根据输入的表名统计指定表下的总记录数;
1)接口

  1. /**
  2. * 需求:根据输入的表名统计指定表下的总记录数;
  3. */
  4. Integer countByTableName(@Param("tableName") String tableName);

2)映射文件

  1. <select id="countByTableName" resultType="integer">
  2. select count(*) from ${tableName}
  3. </select>

3)测试类

  1. @Test
  2. public void test18(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. Integer count = mapper.countByTableName("user");
  5. System.out.println(count);
  6. MybatisUtil.close();
  7. }

4)效果:
1608089633935
小结:
${}使用方式及场景?

  1. 使用方式:
  2. 1.接口中@param给参数取别名 2.xml中使用注解的别名${注解别名}
  3. 场景:
  4. 一切非条件查询的参数拼接可以使用${}

2)${}取值注意事项 (了解)

【 ${}获取单个值】
${} 获取单个值时,最好是通过命名参数的形式获取。如果不指定参数的,也可以使用${value}来获取传入的单个值;
传入参数:没有指定参数名称

  1. User selectUserById(Integer id);

获取参数通过${value}获取

  1. <select id="selectUserById" resultType="user">
  2. select * from user where id = ${value}
  3. </select>

【${}获取配置文件中的值】
有时候,我们如果非要使用$来接收参数,将login修改如下:

  1. <!--根据用户名和性别查询-->
  2. <select id="queryByUserNameAndSex" resultType="User">
  3. SELECT * FROM user WHERE user_name = '${jdbc.user}' AND sex = #{sex}
  4. </select>

说明:上述sql语句中:SELECT FROM user WHERE user_name = *’${username}’ AND sex = #{sex}
对于 ‘{}获取数据的方式直接将获取的数据拼接到字符串上,并不会加引号,如果获取的值是数值型,没有问题,但是如果是字符类型就会有问题,所以需要加上引号进行拼接。
使用${}注意事项:

  1. 1.使用${变量}方式获取变量值时,不要与全局的properties下定义的参数名称冲突,否则数据注入错误;
  2. 2.使用${变量}传入字符串类型时,需要自己维护字符串的上引号;

3.1 简单结果集映射TODO

  1. 在使用原生的JDBC操作时,对于结果集ResultSet,需要手动处理。<br /> mybatis框架提供了resultTyperesultMap来对结果集进行封装。<br />**注意:只要一个方法有返回值需要处理,那么 resultTyperesultMap必须有一个**

1.resultType

  1. sql语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType resultMap,但不能同时使用。
1.1 返回值是基本类型

例如 int ,string ===>resultType=”书写对应的基本类型别名或者全名即可”
测试:findNameById:

  1. 1)基本类型 int short double ... 别名: _基本类型名称
  2. 2)包装类 String ArrayList .... 别名:类名首字母小写
  3. 3)自定义类 扫包取别名 类首字母小写(大写也可)
1.2 返回值为一个pojo(User)对象时
  1. 测试:findById:
1.3 返回值为一个List
  1. 当返回值为List集合时,resultType需要设置成集合中存储的具体的pojo数据类型:<br /> 测试:findAllUsers:

3.2 Map类型结果映射

【1】返回一条数据,封装到map中

需求:查询id是1的数据,将查询的结果封装到Map
1)定义接口

  1. /**
  2. * 需求:查询id是1的数据,将查询的结果封装到Map<String,Object>中
  3. * @param id
  4. * @return
  5. */
  6. Map<String,Object> findMapById(@Param("id") Integer id);

2)定义映射文件配置

  1. <select id="findMapById" resultType="map">
  2. select id,user_name as userName,address from user where id=#{id}
  3. </select>

3)测试:

  1. @Test
  2. public void test19(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. Map<String, Object> map = mapper.findMapById(1);
  5. System.out.println(map);
  6. MybatisUtil.close();
  7. }

4)效果
1608090665996

【2】返回多条数据,封装到map中
  1. 需求:查询数据表所有的数据封装到Map<Integer,User>集合中<br /> 要求: Key值为一条记录的主键,Value值为pojo的对象.<br />说明:需要在接口的方法上使用注解@MapKey指定数据表中哪一列作为Map集合的key,否则mybatis不知道具体哪个列作为Map集合的key.<br />1)映射文件:
  1. <select id="findAllToMap" resultType="map">
  2. select id,user_name as name,birthday,sex,address from user
  3. </select>

2)接口:

  1. /**
  2. * 获取所有用户,其中key为id值,value为user对象
  3. * @return
  4. */
  5. @MapKey("id")
  6. Map<Integer,User> findAllToMap();

3)测试:

  1. @Test
  2. public void test16(){
  3. UserMapper mapper = MybatisUtils.getMapper(UserMapper.class);
  4. Map map = mapper.findAllToMap();
  5. System.out.println(map);
  6. MybatisUtils.close();
  7. }

1608091153735
小结:

  1. 1)map接收单条记录
  2. map中的key就是查询的表的字段名称,如果使用as区别名,那么可以就是对应的别名的名称;
  3. 2)map接收多条记录
  4. 1)需要指定作为key的字段,一般是主键字段 @MapKey("指定字段名称")
  5. 2)指定每一条记录封装的对象类型;

5.resultMap映射(掌握)

1.正常开发中,数据库字段名称与Pojo类属性名称不一致时,一般通过驼峰映射或者As关键字取别名可以搞定,但是很多场景下,对于复杂的orm映射,上述的2种方式就不能适用了;
2.ResultMap是mybatis中最重要最强大的元素,使用ResultMap可以解决复杂映射问题:

  1. 1. POJO属性名和表结构字段名不一致的问题(有些情况下也不是标准的驼峰格式,比如iduserId
  2. 2. 完成高级查询,比如说,一对一、一对多、多对多。

【需求】

  1. 使用resultMap完成结果集的封装(resultSet===》JavaBean

【实现步骤】

  1. 手动配置实体类属性和表字段映射关系的步骤如下:
  2. 1 配置自定义结果集<resultMap>
  3. 2 配置id映射
  4. 3 配置其他普通属性的映射

步骤一:将驼峰匹配注释掉
一旦注释掉驼峰匹配,那么再通过findAll查询的结果中,用户名就无法封装了,此时我们可以尝试使用ResultMap来解决这个问题。

  1. <settings>
  2. <!--作用:表:user_name 类:userName/username 自动映射-->
  3. <setting name="mapUnderscoreToCamelCase" value="false"/>
  4. </settings>

步骤二:配置resultMap
resultMap标签的作用:自定义结果集,自行设置结果集的封装方式

  1. id属性:resultMap标签的唯一标识,不能重复,一般是用来被引用的
  2. type属性:结果集的封装类型
  3. autoMapping属性:操作单表时,不配置默认为true,如果pojo对象中的属性名称和表中字段名称相同,则自动映射。

在映射文件中自定义结果集类型:

  1. <!--type="user" 表示结果集的封装类型是user-->
  2. <resultMap id="userResultMap" type="user" autoMapping="true">
  3. <!--配置主键映射关系-->
  4. <id column="id" property="id"></id>
  5. <!--配置用户名的映射关系 column 表示数据表列 property表示pojo的属性-->
  6. <result column="user_name" property="name"></result>
  7. </resultMap>

步骤三:修改查询语句的statement
在查询语句的select标签中通过resultMap属性可以引用自定义结果集作为数据的封装方式

  1. <!--自定义映射规则-->
  2. <!--
  3. autoMapping="true":表示如果字段名称与pojo属性名称一致,可以省略不写
  4. -->
  5. <resultMap id="userMap" type="user" autoMapping="true">
  6. <!--主键字段映射-->
  7. <id column="id" property="id"/>
  8. <!--非主键字段-->
  9. <result column="user_name" property="username"/>
  10. </resultMap>
  11. <select id="findByIdUseResutMap" resultMap="userMap">
  12. select * from user where id=#{id}
  13. </select>

定义接口:

  1. /**
  2. * 使用resultMap标签自定义映射规则
  3. * @param id
  4. * @return
  5. */
  6. User findByIdUseResutMap(@Param("id") Integer id);

测试代码:

  1. @Test
  2. public void test21(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = mapper.findByIdUseResutMap(1);
  5. System.out.println(user);
  6. MybatisUtil.close();
  7. }

注意:测试完记得将驼峰命名的配置重新开启,因为其他的测试方法还要用。
PPT演示:
1608099545037


resultMap小结

1.resultMap标签的作用?

  1. 1)提高了代码的复用性;
  2. 2)结果集映射的;(将查询的结果映射到pojo类下)

2.resultMap有哪些属性和子标签?

  1. <resultMap id="唯一标识" type="映射的pojo类" autoMapping="true">
  2. <!--主键字段映射-->
  3. <id column="表中主键字段" property="pojo类中主键对应的属性名称"/>
  4. <!--普通字段映射-->
  5. <result column="表中非主键字段" property="pojo类中非主键对应的属性名称"/>
  6. </resultMap>

6.SQL片段(了解)

6.1.引用当前文件中的SQL片段

  1. sql标签可以定义一个sql片段,在需要使用该sql片段的地方,通过<include refid="sql片段id"/>标签来使用。

【1】定义SQL片段

  1. <sql id="userCommonSql">
  2. id,user_name,birthday,sex,address
  3. </sql>

注意:SQL片段必须设置id属性;

【2】使用SQL片段

  1. SQL语句中通过`<include>`标签引入SQL片段;
  1. <select id="findByIdUseResutMap" resultMap="userMap">
  2. select <include refid="userCommonSql"/> from user where id=#{id}
  3. </select>

6.2 引入独立文件中的SQL片段

  1. 很多时候同一个sql片段,可能在多个映射文件中都有使用,如果每一个映射文件都编写一个相同的sql就比较麻烦,因此可以将通用的sql片段都定义在一个专门存放sql片段的映射文件中,然后由其他映射文件引用它即可。<br />

如下,在src目录下新增CommonSQL.xml文件:

【1】新建SQL片段文件

  1. 复制一份映射文件,将SQL片段写入即可<br />**【CommonSQL.xml】**
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="CommonSql">
  6. <sql id="userSql">
  7. id,user_name,birthday,sex,address
  8. </sql>
  9. <sql id="empSql">
  10. eid,ename,age
  11. </sql>
  12. </mapper>

【2】在mybatis核心配置文件mybatis-config.xml引入SQL片段文件

  1. 定义好sql片段的映射文件之后,接下来就该使用它了,首先应该把该映射文件引入到mybatis的全局配置文件中(mybatis-config.xml):
  1. <mappers>
  2. <mapper resource="CommonSql.xml"/>
  3. <package name="com.heima.mapper"/>
  4. </mappers>

【3】引用SQL片段

  1. 最后在需要使用该sql片段的地方通过include标签的refId属性引用该sql片段:`<include refId=”名称空间.sql片段的id” />`<br />

在UserMapper.xml的映射文件中,进一步改造根据用户名查询用户信息

  1. <select id="findUserById2" resultMap="userMap" parameterType="int">
  2. select <include refid="CommonSql.userSql"/> from user where id = ${id}
  3. </select>