Mybatis进阶

表与实体类的映射

resultType

当要查询的类的变量名和表的字段名都一致时,可以直接使用resultType属性指定要输出结果的类型。

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    //方法省略
}

UserMapper.xml

<select id="findUserById" parameterType="Integer" resultType="User">
    select * from user where id = #{id}
</select>

resultMap

当类的属性和表的字段不一致时就不能直接设置resultType=”XXX”了,需要配置resultMap映射类与表。
单表查询

单表查询

当类的userId属性映射到表的user_id字段,其余属性与表的字段名相同。

Orders.java

public class Orders  implements Serializable{
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //方法省略
}

OrderMapper.xml

<!-- 省略 -->
<!-- type:返回值类型 id:映射规则的id -->
<resultMap type="Orders" id="orders">
    <!-- column:表的字段名 property:类的属性名 -->
    <result column="user_id" property="userId"/>
    <!-- 其余相同的可以省略 -->
</resultMap>
<!-- resultMap:指定映射规则 -->
<select id="selectOrdersList" resultMap="orders">
    SELECT id, user_id, number, createtime, note FROM orders
</select>
<!-- 省略 -->

一对一

一对一使用association标签。
假设一个Orders对应一个User:
Orders类中有一user成员变量。

Orders.java

public class Orders  implements Serializable{
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    private User user;//附加对象  用户对象
    //方法省略
}

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    //方法省略
}

OrderMapper.xml

<!-- 省略 -->
<!-- 一对一关联 查询  以订单为中心 关联用户-->
<resultMap type="Orders" id="order">
    <!-- orders表和Orders对象映射-->
    <!-- 使用了association,即便字段名和变量名相同也不可省略 -->
    <result column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createtime"/>
    <!-- 一对一 property:变量名  javaType:变量类型-->
    <association property="user" javaType="User">
        <!-- user表和Orders.user对象映射-->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
    </association>
</resultMap>
<select id="selectOrders" resultMap="order">
    SELECT o.id,o.user_id,o.number,o.createtime,u.username 
    FROM orders o left join user u on o.user_id = u.id
</select>
<!-- 省略 -->

一对多

假设一个用户对应多个订单,一个User类有成员变量orderList。

Orders.java

public class Orders  implements Serializable{
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //方法省略
}

User.java

public class User implements Serializable {
    private Integer id;
    private String username;
    private List<Orders> ordersList;//附加对象List
    //方法省略
}

OrderMapper.xml

<!-- 一对多关联 -->
<resultMap type="User" id="user">
    <id column="user_id" property="id"/>
    <result column="username" property="username"/>
    <!-- 一对多 ofType:List元素泛型类型 -->
    <collection property="ordersList" ofType="Orders">
        <id column="id" property="id"/>
        <result column="number" property="number"/>
    </collection>
</resultMap>
<select id="selectUserList" resultMap="user">
    SELECT o.id,o.user_id,o.number,o.createtime,u.username 
    FROM user uleft join orders o on o.user_id = u.id
</select>

SQL动态拼接

if

只要是test条件成立,就会拼接。
实现根据性别和姓名查询:

<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
    select * from user where 1=1
    <if test="sex!=null and sex!=''">
        and sex = #{sex}
    </if>
    <if test="username!=null and username!=''">
        and username = #{username}
    </if>
</select>

where

会自动的给Sql语句添加where关键字,并将第一个and去除。

<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
    select * from user
    <where>
        <if test="sex != null and sex != ''">
            and sex = #{sex} 
        </if>
        <if test="username != null and username != ''">
            and username = #{username}
        </if>
    </where>
</select>

choose when otherwise

条件只要有一个成立,其他的就不会再判断了。
如果没有成立的条件则默认执行otherwise中的内容

<select id="selectUserByIdAndUsername" parameterType="User" resultType="User">
    select * from user
    <where>
        <choose>
        <when test="id != null and id != ''">
            and id = #{id} 
        </when>
        <when test="username != null and username != ''">
            and username = #{username}
        </when>
        </choose>
        <otherwise>
            and 1 = 1
        </otherwise>
    </where>
</select>

set

产生一个set关键字,自动去除最后一个逗号。

<update id="updateUser">
    update user 
    <set>
        <if test="username!=null and username!=''">
            username=#{username},
        </if>
        <if test="sex !=null and sex !=''">
            sex=#{sex},
        </if>
    </set>
    where id=#{id}
</update>

foreach

遍历
collection:要遍历的集合对象
item:记录每次遍历的结果
open:在结果的左边添加内容
separator:结果和结果之间的内容
close:在最后添加的内容

<select id="selectUserByIds" parameterType="QueryVo" resultType="User">
    select * from user
    <where>
        <foreach collection="list" item="id" separator="," open="id in (" close=")">
            #{id}
        </foreach>
    </where>
</select>

sql include

sql:在外部声明公用SQL语句
include:引入声明的公共SQL语句
优点:便于SQL的整体修改
缺点:难以阅读

<sql id="selectUser">
    select * from user
</sql>
<select id="selectUserById" parameterType="Integer" resultType="User">
    <include refid="selectUser"/>
    where id = #{v}
</select>

#{}和${}的区别

#{} 占位符,SQL预编译时会被替换成?,可以防止SQL注入。
${} 拼接符,SQL编译时会被替换成相应字符串,有SQL注入安全问题。

举例

例如:假设传入参数为 uid=1。

开始

select * from t_user where uid = #{uid}
select * from t_user where uid = '${uid}'

然后

select * from t_user where uid = ?
select * from t_user where uid = '1'

最后

select * from t_user where uid = '1'
select * from t_user where uid = '1'
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇