mybatis0030-mapper.xml中insert,delete,update,select四大标签的常用配置

上一篇帖子写了一个简单的增删改查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>   

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值