上一篇帖子写了一个简单的增删改查demo,详见https://blog.csdn.net/wrongyao/article/details/84614556,这篇帖子主要对xml的常用标签配置做一个总结。
1、insert标签
<insert id="insert" useGeneratedKeys="true" keyProperty="sysUserId" eyColumn="sys_user_id">
INSERT INTO `sys_user` (
sys_user_id,
user_name,
PASSWORD,
email,
create_time,
head_img
)
VALUES(
null,
#{userName},
#{password},
#{email},
SYSDATE(),
#{headImg}
);
</insert>
主要属性:
id :命名空间中的唯一标识符,可用来代表这条语句;
parameterType :传入的参数,参数是可选的,mybatis可以自动推断类型,不建议配置;
flushCache :默认值为 true ,任何时候只要语句被调用,都会清空一级缓存和二级缓存;
useGeneratedKeys :MyBatis 使用 JDBC的getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值为false,需要取出改为true;
keyProperty:MyBatis 通过 getGeneratedKeys 获取主键值后将要赋值的属性,如果希望得到多个数据库自动生成的列,属性值也可以是以逗号分隔的属性名称列表;
keyColumn:主键所在的列,多个列,用逗号隔开。
后三个属性通常一起使用,配置完以后,在插入时会自动将生成的id赋值到插入的对象中。如下:
获取注解还可以通过下列方式
<selectKey keyColumn="sys_user_id" resultType="integer" keyProperty="sysUserId" order="AFTER">
SELECT LAST_INSERT_ID ()
</selectKey>
不同的数据有不同的取法,上述为mysql的自增主键
2、delete和update标签属性都比较简单,主要用法会结合动态sql使用,后面再总结。
<delete id="delete">
DELETE
FROM
sys_user
WHERE
sys_user_id = #{sysUserId}
</delete>
3、select标签
<select id="selectById" resultMap="BaseResultMap">
SELECT
*
FROM
sys_user
WHERE
sys_user_id = #{id};
</select>
属性:
id :命名空间中的唯 标识符,可用来代表这条语句;
resultMap :用于设置返回值的类型和映射关系。可以直接在select标签中写别名,如sys_user_id sysUserID,但是这种写法,不易重用,不推荐这样用,关于resultMap标签的属性,在后面会介绍;
resultType:表示结果类型,和resultMap二者必居其一。在统计表的总条数的时候,就需要配置为integer(既可以是全路径java.lang.integer)也可以是别名(int或integer);
parameterType:四大标签一样,都是表示传入参数,不建议配置,留给mybatis自动识别即可;
4、resultMap标签
<resultMap id="BaseResultMap" type="com.honor.model.SysUser">
<id column="sys_user_id" property="sysUserId" jdbcType="INTEGER"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="INTEGER"/>
<result column="head_img" property="headImg" jdbcType="VARCHAR"/>
</resultMap>
resultMap的属性
id :resultMap的唯一标识,在select的resultMap属性中引用;
type:映射的java对象全路径或者别名(需要自己配置);
extends 选填,可以配置当前的 resultMap 继承自其 他的 re sultMap ,属性值为继承 resultMap的id
autoMapping :选填,可选值为 true和false,默认为true,用于配置是否启用非映射字段(没有在 resultMap 中配置的字段〉的自动映射功能,该配置可以覆盖全局的autoMappingBehavior 配置。
resultMap包含的子标签
id:一个id 结果,标记结果作为 id (唯一值),可以帮助提高整体性能。
result :注入到 Java 对象属性的普通结果。
id和result中的属性,两者一致
column 从数据库中得到的列名 或者是列的别名;
property :映射到列结果的属性,可以简单的属性名称,也可以是嵌套的复杂对象的属性如a.b.c(a对象中b属性的c属性);
javaType:java类型,可以全限定名,也可以是别名;如果映射到对象mybatis可以自己推断,如果映射到map,必须指定。
jdbcType:列对应的数据库类型。网上说,没有验证过,jdbctype在mybatis中是对应数据库中的类型,在为null或者时间戳时,需要指定jdbctype,不然回报空指针。
constructor 配置使用构造方法注入结果,包含以下两个子标签
idArg: id 参数,标记结果作为 id (唯一值),可以帮助提高整体性能。
arg :注入到构造方法的一个普通结果。
例:下述例子会找到参数为Interger和String的构造方法
<constructor>
<idArg column="sys_user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<arg column="user_name" javaType="java.lang.String" jdbcType="VARCHAR"/>
</constructor>
association:一个复杂的类型关联,许多结果将包成这种类型;
<resultMap id="sysUser" type="com.honor.model.SysUser">
<id column="sys_user_id" property="sysUserId" jdbcType="INTEGER"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
<result column="head_img" property="headImg" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<association property="sysRole" resultMap="sysRole"/>
</resultMap>
<resultMap id="sysRole" type="com.honor.model.SysRole">
<id column="sys_role_id" property="sysRoleId"/>
<id column="role_name" property="roleName"/>
</resultMap>
public class SysUser {
private Integer sysUserId;
private String userName;
private String password;
private String email;
private Date createTime;
private String headImg;
private SysRole sysRole;
上述例子假设,SysUser中只有一个SysRole不考虑实际逻辑,为sysRole配置映射时,就需要用association属性。
collection:复杂类型的集合;
public class SysUser {
private Integer sysUserId;
private String userName;
private String password;
private String email;
private Date createTime;
private String headImg;
private List<SysRole> sysRoles;
将上述的sysrole改为sysroles
<resultMap id="sysUser" type="com.honor.model.SysUser">
<id column="sys_user_id" property="sysUserId" jdbcType="INTEGER"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
<result column="head_img" property="headImg" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<collection property="sysRoles" resultMap="sysRoles"/>
</resultMap>
<resultMap id="sysRoles" type="com.honor.model.SysRole">
<id column="sys_role_id" property="sysRoleId"/>
<id column="role_name" property="roleName"/>
</resultMap>
collection可以映射列表如List,经实测association也可以做到。
discriminator :根据结果值来决定使用哪个结果映射(resultMap);
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
<case value="3" resultMap="vanResult"/>
<case value="4" resultMap="suvResult"/>
</discriminator>