mybatis 相关内容理解
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper">
注意这个明明空间
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
一个用ID 一个用result 有什么区别
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果
id & result
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
这些元素是结果映射的基础。id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。
这两者之间的唯一不同是,id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。
<resultMap type="SysUser" id="SysUserResult"> <id property="userId" column="user_id" /> <result property="deptId" column="dept_id" /> <result property="userName" column="user_name" /> <result property="nickName" column="nick_name" /> <result property="email" column="email" /> <result property="phonenumber" column="phonenumber" /> <result property="sex" column="sex" /> <result property="avatar" column="avatar" /> <result property="password" column="password" /> <result property="status" column="status" /> <result property="delFlag" column="del_flag" /> <result property="loginIp" column="login_ip" /> <result property="loginDate" column="login_date" /> <result property="createBy" column="create_by" /> <result property="createTime" column="create_time" /> <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> <result property="remark" column="remark" /> <association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult" /> <collection property="roles" javaType="java.util.List" resultMap="RoleResult" /> </resultMap> <resultMap id="deptResult" type="SysDept"> <id property="deptId" column="dept_id" /> <result property="parentId" column="parent_id" /> <result property="deptName" column="dept_name" /> <result property="orderNum" column="order_num" /> <result property="leader" column="leader" /> <result property="status" column="dept_status" /> </resultMap> <resultMap id="RoleResult" type="SysRole"> <id property="roleId" column="role_id" /> <result property="roleName" column="role_name" /> <result property="roleKey" column="role_key" /> <result property="roleSort" column="role_sort" /> <result property="dataScope" column="data_scope" /> <result property="status" column="role_status" /> </resultMap>
association 表示关联
association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
collection 表示数据集合
ofType="Post" 这个可以简写部分类容
collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
discriminator – 使用结果值来决定使用哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
xml文件中
select 标识会映射sql中的select查询语句
insert 标识会映射sql总的insert命令语句
update 标识会映射sql总的update命令语句
delete 标识会映射sql总的delete命令语句
增删改返回的都是int 类型,无需返回接收类型
parameterType 表示要传的参数类型
resultMap 表示返回的结果数据集
id="DaProtocolResult" 查询的结果集复用 使用 resultMap 接受
resultMap="DaProtocolResult"
id="selectDaProtocolVo" 查询的语句,可以复用,但是要使用 include 嵌套
include 表示的是sql代码片段
<include refid="selectDaProtocolVo"/>
sql
这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个 SQL 片段可以在其它语句中使用,例如:
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>
<where> </where> 标识表示条件内容
也可以不适应这个标识,直接使用where语句
<select id="selectDaProtocolById" parameterType="Long" resultMap="DaProtocolResult">
<include refid="selectDaProtocolVo"/>
where protocol_id = #{protocolId}
</select>
trim 标识 表示要做非空条件判断,符合条件的才做操作
prefix表示前标识
suffix 表示后标识
suffixOverrides 表示隔离符
if 表示条件
test 表示判断内容
参数用#号和{}包住
参数符号
#{id}
首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,
然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 Author 表已经在 id 列上使用了自动生成
<insert id="insertDaProtocol" parameterType="DaProtocol">
insert into da_protocol
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="protocolId != null">protocol_id,</if>
<if test="protocolDocUrl != null">protocol_doc_url,</if>
<if test="productModelCode != null and productModelCode != ''">product_model_code,</if>
<if test="versionNumber != null">version_number,</if>
<if test="isNews != null">is_news,</if>
<if test="createTime != null">create_time,</if>
<if test="creatorId != null">creator_id,</if>
<if test="updateTime != null">update_time,</if>
<if test="updateId != null">update_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="protocolId != null">#{protocolId},</if>
<if test="protocolDocUrl != null">#{protocolDocUrl},</if>
<if test="productModelCode != null and productModelCode != ''">#{productModelCode},</if>
<if test="versionNumber != null">#{versionNumber},</if>
<if test="isNews != null">#{isNews},</if>
<if test="createTime != null">#{createTime},</if>
<if test="creatorId != null">#{creatorId},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="updateId != null">#{updateId},</if>
</trim>
</insert>
<update id="updateDaProtocol" parameterType="DaProtocol">
update da_protocol
<trim prefix="SET" suffixOverrides=",">
<if test="protocolDocUrl != null">protocol_doc_url = #{protocolDocUrl},</if>
<if test="productModelCode != null and productModelCode != ''">product_model_code = #{productModelCode},</if>
<if test="versionNumber != null">version_number = #{versionNumber},</if>
<if test="isNews != null">is_news = #{isNews},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="creatorId != null">creator_id = #{creatorId},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="updateId != null">update_id = #{updateId},</if>
</trim>
where protocol_id = #{protocolId}
</update>
这个循环需要灵活使用
foreach 标识表示循环
item 表示对应的内容
collection 标识对应的容器类型
open="(" 表示开头
separator 表示间隔符号
close=")" 表示关闭符号
<delete id="deleteDaProtocolByIds" parameterType="String">
delete from da_protocol where protocol_id in
<foreach item="protocolId" collection="array" open="(" separator="," close=")">
#{protocolId}
</foreach>
</delete>
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username, password, email, bio) values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach>
</insert>
<resultMap id="vehicleResult" type="Vehicle"> <id property="id" column="id" /> <result property="vin" column="vin"/> <result property="year" column="year"/> <result property="make" column="make"/> <result property="model" column="model"/> <result property="color" column="color"/> <discriminator javaType="int" column="vehicle_type"> <case value="1" resultType="carResult"> <result property="doorCount" column="door_count" /> </case> <case value="2" resultType="truckResult"> <result property="boxSize" column="box_size" /> <result property="extendedCab" column="extended_cab" /> </case> <case value="3" resultType="vanResult"> <result property="powerSlidingDoor" column="power_sliding_door" /> </case> <case value="4" resultType="suvResult"> <result property="allWheelDrive" column="all_wheel_drive" /> </case> </discriminator> </resultMap>
like 查询方法
<if test="productName != null and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
参考:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
https://mybatis.org/mybatis-3/zh/dynamic-sql.html