title: Mapper XML 规范 sidebar_position: 10

Contributor为Apache Linkis贡献新的数据表,编写Mapper XML时需遵循如下规范进行开发。

基本遵循规范

  • 在mapper.xml中namespace等于java接口地址
  • java接口中的方法名和XML中statement的id一致
  • java接口中的方法输入参数类型和XML中statement的parameterType指定的类型一致
  • java接口中的方法返回值类型和XML中statement的resultType指定的类型一致
  • XML中所有mysql关键字统一使用小写
  • 对于过多的查询字段抽象出SQL片段
  • 对于整型返回值类型建议使用Integer,可以区分未赋值和值为0的情况,如确定返回值为数字可使用int。其它数据类型类似。
  • 对于占位符,使用#{name},而不要使用${name}。模糊查询可以使用CONCAT(‘%’,#{sname},‘%’)
  • 对于sql语句编写,不使用注解方式,统一写在XML文件中

方法名称规范

方法名称说明核心点建议
insert新增数据如果是自增主键,应该返回主键ID
deleteById根据主键ID删除数据sql默认加limit 1,防止多删数据此方法不建议有,建议逻辑删除
updateById根据主键ID修改数据sql默认加limit 1,防止多修改数据
selectById根据主键查询数据查询一条数据
selectByIdForUpdate根据主键加锁查询数据加锁查询一条数据,事务处理用
queryListByParam根据输入条件查询数据列表多参数查询列表
queryCountByParam根据输入条件查询总数多参数查询数量

parameterType规范

java接口中必须包含@Param,XML中可以不包含parameterType

基本类型

// java接口
User selectUserById(@Param("id") Integer id);
// XML文件
<select id="selectUserById" resultType="userMap">
    select id, name 
	from user
	where id = #{id}
</select>

集合类型

// java接口
List<User> userListByIds(@Param("ids") List<Integer> ids);
// XML文件
<select id="userListByIds" resultMap="userMap">
	select id, name
	from user
	where id in
		<foreach collection="ids" separator="," open="(" close=")" item="item">
			#{item}
		</foreach>
</select>

Map类型

// java接口
User queryByParams(@Param("map") Map<String, Object> parasms);
// XML文件
<select id="queryByParams" resultMap="userMap">
	select id, name
	from user
	where id = #{map.id} and name = #{map.name}
</select>

实体类型

// java接口
User queryByUser(@Param("user") User user);
// XML文件
<select id="queryByUser" resultMap="userMap">
	select id, name
	from user
	where id = #{user.id} and name = #{user.name}
</select>

多个参数类型

// java接口
User queryByIdAndName(@Param("id") Integer id, @Param("name") String name);
// XML文件
<select id="queryByIdAndName" resultMap="userMap">
	select id, name
	from user
	where id = #{id} and name = #{name}
</select>

XML文件编写示例

合理地使用空格和缩进来增强可读性,各类型sql语句示例如下

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.linkins.dao.mapper.UserMapper">
	-- 新增语句
	<insert id="insert">
		insert into user (id, name)
		values (1, 'z3');
	</insert>

	-- 删除语句
	<delete id = "deleteUserByIdAndName">
		delete from user
		where name = #{name}
			and id = #{id}
	</delete>

	-- 修改语句
	<update id="updateUserById">
		update user
		set name = #{name}
		where id = #{id}
	</update>

	-- 查询语句
	<select id="selectUserByName" resultMap="userMap">
		select id, name
		from user
		where name = 'z3'
	</select>

	-- sql片段
	<sql id="user">
		id,
		name
	</sql>
	-- 引用
	<include refid="user"/> 

	-- resultMap
	<resultMap type="Assets" id="userMap">  
		<id property="id" column="id" />  
		<result property="name" column="name" />
	</resultMap>
	-- 引用
	<select id="queryListByParam" parameterType="map" resultMap="userMap">
		do...
	</select>

	-- 条件判断
	<if test="name != null and name != ''">  
		name = #{name}  
	</if>

	-- 子查询
	<select id="selectUserByTeacherIdAndName" resultMap="userMap">
		select u.id, u.name
		from user u
		where u.name in (
			select t.name
			from teacher t
			where t.id = 1
				and t.name = 'z3'
			)
			and u.id = 2
	</select>
</mapper>