首页 > 数据库 >Mybatis进阶之动态SQL

Mybatis进阶之动态SQL

时间:2024-03-28 18:32:37浏览次数:32  
标签:userName 进阶 yhm userPassword user SQL Mybatis where select

1、MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${}#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引

号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,

可以自动添加单引号

1.1 多种查询情况

  1. 通过一个参数查询一个实体类对象

    Admin getAdminByyym(String username);
    <!-- 1.为单个变量时  Admin getAdminByyym(String username);-->
      <select id="getAdminByyym" resultType="com.pojo.Admin">
           <!-- select * from admin where yhm = #{username}   {}里的值是任意的 -->  
           select * from admin where yhm = '${usename}' <!-- 用$必须加单引号 且里面的值只能为usename -->
      </select>

    只有一个参数的时候{}里的参数名字随便写,他都能一一对应。

  2. 通过两个及以上的参数查询一个实体类对象

          2.1 使用param1、param2.....进行赋值

  //多个参数变量获取值时
  Admin checklogin(String yhm,String mm);
<!-- 2.为多个变量时  Admin checklogin(String yhm,String mm); -->
<select id="checklogin" resultType="com.pojo.Admin">
    select * from admin where yhm = #{param1} and mm = #{param2}
</select>

使用 #{param1}指定对应的参数为第一个

    2.2 使用 @Param给参数命名
Admin checkLoginByParam(@Param("yhm") String yhm, @Param("mm") String mm);
<!-- Admin checkLoginByParam(@Param("yhm") String yhm, @Param("mm") String mm); -->
<select id="checkLoginByParam" resultType="com.pojo.Admin">
    select * from admin where yhm = #{yhm} and mm = #{mm}
</select>

#{yhm}里的参数名要跟@Param("yhm")保持一致 

        2.3  使用map封装参数(推荐使用)

 User selectUserBymap(Map<String, Object> map);
  <!--  User selectUserBymap(Map<String, Object> map); -->
  <select id="selectUserBymap" resultType="com.mybatis.pojo.User" parameterType="java.util.Map">
     select * from t_user where userName = #{userName} and userPassword = #{userPassword}
  </select>  
    Map<String, Object> map = new HashMap<>();
    map.put("userName", "czh");
    map.put("userPassword", "654321");
    
    User user =  userMapper.selectUserBymap(map);
    System.out.println(user);

这时候#{}里的变量要与JavaBean一致。

2. 其他可能用到的案例:

  1. 查个数

      //1.查询总数
      Integer getcount();
          <!-- Integer getcount(); -->
          <select id="getcount" resultType="Integer">
                 select count(*) from admin
          </select>
  2. 多个参数的添加

     //多个参数添加值时
      void insertAdminByparam(Admin admin);
           <!-- 多个变量添加时  void insertAdminByparam(Admin admin); -->
          <insert id="insertAdminByparam">
              insert into admin values(null,#{yhm},#{mm})
          </insert>
    
    
     Admin admin5 =new Admin(null, "1","12");
     adminMapper.insertAdminByparam(admin5); 

    {}里的参数要与数据库表字段一致

  3.  

    批量添加多个员工

      void inertMoreAdmin(@Param("admins") List<Admin> admins);
          <!-- void inertMoreAdmin(@Param("admins") List<Admin> admins); -->
          <insert id="inertMoreAdmin">
               insert into admin values
               <foreach collection="admins" item="admins" separator=",">
                   (null,#{admins.yhm},#{admins.mm})
               </foreach>
          </insert>
        //批量添加
        Admin admin7 = new Admin(null,"12","12");
        Admin admin8 = new Admin(null,"12333","12333");
        List<Admin> list2 = new ArrayList<>();
        list2.add(admin7);
        list2.add(admin8);
        adminMapper.inertMoreAdmin(list2);

    4. 模糊查询      '%${yhm}%'

  //模糊查询的使用
  List<User> selectUserByLike(String userName);
  <!--  List<User> selectUserByLike(); -->
  <select id="selectUserByLike" resultType="com.mybatis.pojo.User" parameterType="String" >
      select * from t_user where userName like '%${yhm}%'
  </select>

3、动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了

解决 拼接SQL语句字符串时的痛点问题。

3.1 if

if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之

标签中的内容不会执行

  <!--  List<User> userList(User user); -->
  <select id="userList" resultType="com.mybatis.javaBean.User" parameterType="com.mybatis.javaBean.User">
      select * from t_user where 1=1
      <if test="userName != '' and userName != null">
          and userName like '%${userName}%'
      </if>
      <if test="userPassword != '' and userPassword != null ">
          and userPassword = #{userPassword}
      </if>
      <if test="sex != '' and sex != null ">
          and sex = #{sex}
      </if>
  </select>
    User user2 = new User();
    user2.setUserName("李明");
    user2.setSex("男");
    List<User> usersLists = userMapper.userList(user2);
    System.out.println(usersLists);

3.2 where

where就是数据库中的where语句,它一般和if结合使用;

a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

b>若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的

and去掉

注意:where标签不能去掉条件最后多余的and

  <select id="userList" resultType="com.mybatis.pojo.User" parameterType="com.mybatis.pojo.User">
      select * from t_user
     <where>
        <if test="userName != '' and userName != null">
          userName like '%${userName}%'
      </if>
      <if test="userPassword != '' and userPassword != null ">
          and userPassword = #{userPassword}
      </if>
      <if test="sex != '' and sex != null ">
          and sex = #{sex}
      </if>
     </where>
  </select>

3.3 trim

trim用于去掉或添加标签中的内容

常用属性:

prefix:在trim标签中的内容的前面添加某些内容

prefixOverrides:在trim标签中的内容的前面去掉某些内容

suffix:在trim标签中的内容的后面添加某些内容

suffixOverrides:在trim标签中的内容的后面去掉某些内容

 <select id="userList" resultType="com.mybatis.pojo.User" parameterType="com.mybatis.pojo.User">
    select * from t_user 
    <trim prefix="where" suffixOverrides="and">
      <if test="userName != '' and userName != null">
          userName like '%${userName}%' and 
      </if>
      <if test="userPassword != '' and userPassword != null ">
          userPassword = #{userPassword} and 
      </if>
      <if test="sex != '' and sex != null ">
          sex = #{sex}
      </if>
    </trim>
  </select>
​
​
 <insert id="insertSelective" parameterType="com.buyerApp.system.admin.admin.pojo.Admin">
    insert into admin
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="yhm != null">
        yhm,
      </if>
      <if test="mm != null">
        mm,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="yhm != null">
        #{yhm,jdbcType=VARCHAR},
      </if>
      <if test="mm != null">
        #{mm,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

3.4 choose、when、otherwise

choose、when、 otherwise相当于if...else if..else

 <select id="userList" resultType="com.mybatis.pojo.User" parameterType="com.mybatis.pojo.User">
    select * from t_user
    <where>
       <choose>
          <when test="userName != '' and userName != null">
              userName = #{userName}
          </when>
          <when test="userPassword != '' and userPassword != null">
              userPassword = #{userPassword}
          </when>
          <when test="sex != '' and sex != null ">
              sex = #{sex}
          </when>
          <otherwise>
              age = 20
          </otherwise>
       </choose>
    </where>
测试
    User user2 = new User();
    user2.setUserName("李明");
    user2.setSex("男");
    List<User> usersLists = userMapper.userList(user2);
    System.out.println(usersLists);

最终结果只满足一个

DEBUG [main] - ==>  Preparing: select * from t_user WHERE userName = ? 
DEBUG [main] - ==> Parameters: 李明(String)
DEBUG [main] - <== Total: 1
[User [id=4, userName=李明, userPassword=123, sex=男, age=25]]

3.5 foreach

循环

<!--  int InsertmoreUser(@Param("userlist") List<User> list);-->
  <insert id="InsertmoreUser" >
     insert into t_user values
       <foreach collection="userlist" item="user" separator=","> 
           (null,#{user.userName},#{user.userPassword},#{user.sex},#{user.age})
        </foreach>
  </insert>
​
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">
  delete from t_emp where
  <foreach collection="eids" item="eid" separator="or">
    eid = #{eid}
  </foreach>
</delete>
​
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">
  delete from t_emp where eid in
  <foreach collection="eids" item="eid" separator="," open="(" close=")">
    #{eid}
  </foreach>
</delete>

这里的collection是指所有的数据,item指的是这所有数据要循环的单个数据。#{user.userName}其中userName要与Java Bean中的变量一致。

3.6、SQL片段

sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入

    <sql id="userColumns">
       userName,userPassword,sex
    </sql>
   select <include refid="userColumns"></include> from t_user

注意:没查到的默认为0 或者 null

3.7 set

用于update语句中

 <update id="updateByPrimaryKeySelective" parameterType="com.buyerApp.system.admin.admin.pojo.Admin">
    update admin
    <set>
      <if test="yhm != null">
        yhm = #{yhm,jdbcType=VARCHAR},
      </if>
      <if test="mm != null">
        mm = #{mm,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>

具体案例源代码:mybatis源代码

标签:userName,进阶,yhm,userPassword,user,SQL,Mybatis,where,select
From: https://blog.csdn.net/qq_43905491/article/details/137119971

相关文章

  • 【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
    在PostgreSQL中,我们可以使用SELECTDISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。1.SELECTDISTINCT语句SELECTDISTINCT语句用于从表中选择不重复的记录。如果没有指定列名,则会选择所有列。在......
  • MySQL主从复制
    目录一、主从复制的原理二、搭建主从复制(一主一从)1、两台主机安装MySQL2、修改配置文件3、创建主从复制用户4、主从库重启并验证server_id5、配置从库与主库的复制关系6、验证主从复制一、主从复制的原理master服务器将数据的改变记录二进制日志,当master上的数据发生改变时,则将......
  • 一条SQL查询语句是如何执行的
    一条SQL查询语句是如何执行的?连接器1、先连接到数据库中,这时候工作的是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。查询缓存2、连接建立完成后,就可以执行select语句,执行逻辑就到了第二步,查询缓存。MySQL拿到一个查询后,会先到查询缓存看看,之前是不是执......
  • SQL去除空格
    在SQL中,去除空格可以使用以下几种方法:使用`REPLACE()`函数。可以将字符串中的空格替换为空字符,从而去除所有空格。例如,`REPLACE(column_name,'','')`将指定列中的所有空格替换掉。12345使用`TRIM()`函数。这个函数可以去除字符串首尾的空格。例如,`TRI......
  • MySQL各类查询语句DQL——聚合函数
    插入数据insertintostudentvalues(0,'2024-02-2510:10:10','赵灵儿','123','15612345678',16,'女','逍遥哥哥,你终于找到我了。');insertintostudentvalues(0,'2024-02-2510:10:10','王语嫣','123&......
  • MySQL学习必备SQL_DDL_DML_DQL
     MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,1.学生表DDLCREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(......
  • MySQL学习必备查询语句like_between and_in
     MySQL创建数据库需要自行创建数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,建表操作:CREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(20......
  • Sql Server 清理长期存在的无用会话
    DECLARE@killCommandNVARCHAR(1000);DECLARE@sessionIDINT;--定义超时阈值(以分钟为单位)DECLARE@idleTimeThresholdINT=30;--获取超过超时阈值的会话ID列表SELECT@sessionID=session_idFROMsys.dm_exec_sessionsWHEREstatus='sleeping'-......
  • MySQL各类查询语句DQL——like_between and_null_in
    创建数据库CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyin......
  • MySQL各类查询语句DQL--like_in_between_and
    建表语句CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(3)DEFAULTNULL,......