你不得不知道的MyBatis基础知识 MyBatis的CURD之单表(2)



MyBatis的CURD

1. Insert操作
  • 普通添加
    <insert id="addUsers" parameterType="com.fuful.domian.Users" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
        insert into Users(uname, upwd) values (#{uname,jdbcType=VARCHAR},#{upwd,jdbcType=VARCHAR});
    </insert>
  • 批量添加
 <!--foreach批处理-->
    <insert id="addManyUsers" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
        insert into Users(uname, upwd) values
        <foreach collection="list" item="item" separator=",">
            (#{item.uname},#{item.upwd})
        </foreach>
    </insert>

2. select操作
  • 条件查询
  <select id="findByUserName" resultType="com.fuful.domian.Users">
        SELECT <include refid="selStr" /> FROM Users where uname = #{parUserName,jdbcType=VARCHAR}
    </select>
  • 全部查询
    <select id="findByAll" resultType="com.fuful.domian.Users">
        SELECT <include refid="selStr" /> FROM Users
    </select>
  • 模糊查询
<!--  第一个需要在传值的时候加%%  -->
<!--    <select id="findByLikeUserName" resultType="com.fuful.domian.Users">-->
<!--        select uid,uname,upwd,addtime from Users where uname like #{parUserName,jdbcType=VARCHAR}-->
<!--    </select>-->

    <select id="findByLikeUserName" resultType="com.fuful.domian.Users">
        SELECT <include refid="selStr" /> FROM Users where uname like CONCAT('%',#{parUserName,jdbcType=VARCHAR},'%')
    </select>

3. sql - 文字替换
 - <sql>,<include>标签
- 配合<include refid = "selStr">标签使用
  <!--sql替换-->
    <sql id="selStr">uid,uname,upwd,addtime</sql>

    <sql id="selStr2">uname,upwd</sql>

4. update操作
 <update id="updateUpwd">
        UPDATE Users SET upwd = #{newUpwd} where uid = #{uid}
    </update>
5. delete操作
 <!--foreach批处理-->
    <delete id="delManyUsers">
        delete from Users where uid in
        <foreach collection="list" item="u" open="(" close=")" separator=",">
            #{u.uid}
        </foreach>
    </delete>

UsersMapper接口

public interface UsersMapper {
    int addUsers(Users users);
    Users findByUserName(@Param("parUserName") String parUserName);
    List<Users> findByAll();
    List<Users> findByLikeUserName(@Param("parUserName") String parUserName);
    int updateUpwd(@Param("uid") int uid,@Param("newUpwd") String newUpwd);
    int addManyUsers(List<Users> manyUsers);
    int delManyUsers(List<Users> manyUsers);
}


ps1: 数据库中可以使用字符串拼接的?

  • mysql:mysql中使用+号
  • Oracle:Oracle中使用||
1. Mysql的字符串拼接
  1. CONCAT():最常用的字符串拼接方法,但遇到拼接中的字符串出现null的情况会返回null
语法:CONCAT(string1,string2)
  1. CONCAT_WS():concat with separator,多了个分隔符功能;如果某个字符串为null,会忽略null,并返回其他字符串的值
语法:CONCAT_WS(separator,str1,str2,)
代表 concat with separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数
  1. GROUP_CONCAT():连接字段,多个值显示为一行
语法 :group_concat( [DISTINCT] 连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
连接的可以是多个字段,也可以对连接字段进行排序
  1. +号
2. Oracle的字符串拼接

Oracle的字符串拼接有两种方式:

  1. 采用 || 符号,用’||'来一次串连多个字串。
SELECT 'A' || 'B' from dual;//执行的结果就是AB
  1. 采用CONCAT进行连接,与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两个以上字符串的拼接;换言之,一次只能将两个字串串连起来
SELECT CONCAT('A','B') FROM dual;//执行结果也是AB

ps2: @Param注解

  作用: 用注解来简化xml配置的时候(比如Mybatis的Mapper.xml中的sql参数引入),@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)。

实例说明:

  1. 使用@Param注解

Mapper接口方法:

 public int getUsersDetail(@Param("userid") int userid);

对应Sql Mapper.xml文件:

 <select id="getUserDetail" statementType="CALLABLE" resultMap="baseMap">
          Exec WebApi_Get_CustomerList #{userid}
 </select>

说明:

  当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以,当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。

  1. 不使用@Param注解

  不使用@Param注解时,最好传递 Javabean。在SQL语句里就可以直接引用JavaBean的属性,而且只能引用JavaBean存在的属性。

Mapper接口方法:

 public int getUsersDetail(User user);

对应Sql Mapper.xml文件:

 <!--这里直接引用对象属性即可,不需要对象.属性的方式--> 
<select id="getUserDetail" statementType="CALLABLE" resultMap="baseMap">
          Exec WebApi_Get_CustomerList #{userid}
</select>
 

ps3: foreach批处理

  foreach 作用是对一个集合进行遍历 通常用在构建IN条件语句

foreach属性
collection属性: 主要分3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
    list对象默认用list作为键,array对象默认用array作为键,map没有默认的键 也可以使用@Param(“keyName”)来设置键。

使用实例

  1. 传入单参数List
// mapper接口
List<Role> getRolesByRoleIds(@Param("roleIds") List<Integer> roleIds);

// mapper sql  注意collection
<select id="getRolesByRoleIds" parameterType="java.util.List" resultMap="roleInfo">
        SELECT role_id,role_name,valid FROM sys_role WHERE role_id IN 
        <foreach collection="roleIds" item="roleId" index="index" open="(" separator="," close=")">
            #{roleId}
        </foreach>
    </select>

  1. 传入单参数array (类似于list)

  2. 传入多参数封装为map

// 多参数封装为map
Map ids = new HashMap<>();
ids.put("userId", userId);
ids.put("roleIds",roleIds);
this.roleOfUserMapper.addRoleOfUserByIds(ids);

// mapper 接口
int addRoleOfUserByIds(Map ids);

// mybatis sql
<insert id="addRoleOfUserByIds" parameterType="java.util.HashMap">
        <selectKey keyProperty="serialNo" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT into sys_role_of_user(user_id, role_id, priority, start_date) VALUES
        <foreach collection="roleIds" item="roleId" separator=",">
           (#{userId},#{roleId},0,now())
        </foreach>
    </insert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TomLazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值