Mybatis中特殊SQL的执行

目录
  • 1.模糊查询
  • 2.批量删除
  • 3.动态设置表名
  • 4. 添加功能获取自增的主键

1.模糊查询

大家应该还记得sql语句的模糊查询怎么写吧,那就是使用关键字like,
并且有相应的通配符一起使用,%表示多个字符,_表示一个字符,比如说现在有一张表user,查询name中第一个字母是l的人
select * from user where name like ‘_l’;
如果是查询name中有 l 的人select * from user where name like ‘%l%’;

模糊查询不可以使用#{},接下来通过案例来说明一下,提供一个mapper接口用来测试,里面定义了操作数据库的各种方法

/**
     * 根据用户名模糊查询用户信息
     */
    List<User> getUserByLike(@Param("username") String username);

在映射文件中写上我们要进行执行的sql语句

<select id="getUserByLike"
resultType="com.atguigu.mybatis.pojo.User">
        select *
        from t_user
        where username like  '%#{username}%';
    </select>  

然后进行测试

那要怎么解决上述问题呢,有两种方式可以解决。

解决方法1

SQL语句中的#{}换成${}

 <select id="getUserByLike"
resultType="com.atguigu.mybatis.pojo.User">
        select *
        from t_user
        where username like  '%${username}%';
    </select> 

解决方法2

使用字符串拼接

 <select id="getUserByLike" resultType="com.atguigu.mybatis.pojo.User">
        select *
        from t_user
        where username like  concat('%',#{username},'%');
    </select>

解决方法3(建议使用这种方式)

 <select id="getUserByLike" resultType="com.atguigu.mybatis.pojo.User">
        select *
        from t_user
        where username like   "%"#{username}"%";
    </select>

2.批量删除

delete from 表名 where 筛选条件

 int delete(@Param("ids") String ids);

在映射文件中写下面的代码

 <delete id="delete" >
        delete  from t_user where id in(#{ids});

    </delete>

那我们要怎么解决呢?

可以使用${}

 <delete id="delete" >
        delete  from t_user where id in(#{ids});

    </delete>

总结: 在这里批量删除不能使用#{},因为它会自动加上’ '进行字符串拼接 ,而我们的数据库中,字段id的属性是int类型的,由于#{}会自动加上单引号所以不可以,是不正确的,但是如果id字段的属性是varchar,我们就得用#{],而不是${}

3.动态设置表名

也就是说我们查询的时候,能不能不要把表名给写死,我们可以传入表的名字,然后根据表名来查询数据

  /**
     * 查询表名来查询数据
     */
    List<User> getUserByTableName(@Param("tableName") String table);
 <select id="getUserByTableName" resultType="com.atguigu.mybatis.pojo.User">
 
        select * from ${tableName}

    </select>

注意点:我们以前在学习MySQL的时候,比如说写一个查询语句select * from user;我们这里的表名不能加引号对吧,同样的道理我们在映射文件写的sql语句,表名也不能加引号,那样就变成字符串了,所以动态设置表名应该使用${}

4. 添加功能获取自增的主键

  • t_clazz(clazz_id,clazz_name)
  • t_student(student_id,student_name,clazz_id)
  • 1.添加班级信息
  • 2.获取新添加的班级id
  • 3.为班级分配学生,就是说把某一个学生的班级id修改成新添加的班级id
/**
 
添加用户信息
 
 
useGeneratedKeys:设置使用自增的主键

keyProperty:因为增删改有统一的返回值是受影响的行数,
因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
*/
int insertUser(Useruser);
<!
--int insertUser(Useruser);
-->
<insert id="insertUser"useGeneratedKeys="true"keyProperty="id">
insert into t_user values(null,#{username},#{password} )
</insert>

到此这篇关于Mybatis中特殊SQL的执行的文章就介绍到这了,更多相关Mybatis SQL 执行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Mybatis SqlSession执行流程

    目录 Mybatis执行SQL流程 SqlSession Executor Mybatis之Executor Mybatis之StatementHandler 进入ResultSetHandler Mybatis执行SQL流程 在看源码之前,我们需要了解一些基本知识,如果您没有阅读Mybatis SqlSessionFactory 初始化原理,可以先阅读Mybatis SqlSessionFactory 初始化原理这篇文章,这用更有助于我们理解接下来的文章 在看源码之前,我们需要了解一些基本知识

  • 浅谈MyBatis执行SQL的两种方式

    目录 前言 准备接口和Mapper配置文件: 使用SqlSession 发送 SQL 使用 Mapper 接口发送 SQL 比较两种发送 SQL 方式 前言 本文介绍MyBatis执行SQL语句的2种方式:SqlSession和Mapper接口以及它们的区别. 准备接口和Mapper配置文件: 定义UserMapper接口: package cn.cvs.dao; import cn.cvs.pojo.User; import java.util.List; public interface U

  • 使用mybatis的interceptor修改执行sql以及传入参数方式

    目录 mybatis interceptor修改执行sql以及传入参数 总体思路 1.Interceptor 代码实现 2.AutoConfiguration代码实现 mybatis interceptor 处理查询参数及查询结果 拦截器:拦截update,query方法 添加xml配置 mybatis interceptor修改执行sql以及传入参数 项目中途遇到业务需求更改,在查询某张表时需要增加条件,由于涉及的sql语句多而且依赖其他服务的jar,逐个修改sql语句和接口太繁杂.项目使用m

  • mybatis 通过拦截器打印完整的sql语句以及执行结果操作

    开发过程中,如果使用mybatis做为ORM框架,经常需要打印出完整的sql语句以及执行的结果做为参考. 虽然mybatis结合日志框架可以做到,但打印出来的通常都是sql和参数分开的. 有时我们需要调试这条sql的时候,就需要把参数填进去,这样未免有些浪费时间. 此时我们可以通过实现mybatis拦截器来做到打印带参数的完整的sql,以及结果通过json输出到控制台. 直接看代码和使用方法吧: MyBatis拦截器打印不带问号的完整sql语句拦截器 import java.text.DateF

  • SpringBoot配置使Mybatis打印SQL执行时的实际参数值操作

    问题描述 在开发过程中,默认配置下SpringBoot和Mybatis正常结合运行,但在打印的日志中动态sql中的参数位置显示的是?,当sql执行违背预期时不免是因为传到Mapper中sql参数值不正确所导致,这时候如果调试能查看sql执行时占位符处的值,这无疑能让问题展示得更加直观,如何在SpringBoot.Mybatis的框架下使日志中打印出sql执行时获得的实际参数呢? 问题表现 解决办法 在SpringBoot项目中的配置文件application.properties或者bootst

  • mybatis设置sql执行时间超时时间的方法

    存在这样的场景,当一些比较耗时的查询时,如果不中断,则会导致数据库堵塞,进而会拖垮整个数据库服务的正常运行. 1.如果你使用的是HikariCP连接池的话,可以在配置文件设置connetion-timeout这个属性(如application.properties) 2.如果你使用的是其他链接池,比如tomcat连接池,同时持久化框架用的是mybatis的话,那可以这样设置 2.1 在配置文件中设置全局的sql执行超时时间(单位s): mybatis.configuration.default-

  • MyBatis一次执行多条SQL语句的操作

    有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个: 1.多条sql分批执行: 2.存储过程或函数调用: 3.sql批量执行. 今天我要说的是MyBatis中如何一次执行多条语句(使用mysql数据库). 1.修改数据库连接参数加上allowMultiQueries=true,如: hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx:3306/xxxxx?characterEncoding=u

  • 浅谈MyBatis 如何执行一条 SQL语句

    前言 Mybatis 是 Java 开发中比较常用的 ORM 框架.在日常工作中,我们都是直接通过 Spring Boot 自动配置,并直接使用,但是却不知道 Mybatis 是如何执行一条 SQL 语句的,而这篇文章就是来揭开 Mybatis 的神秘面纱. 基础组件 我们要理解 Mybatis 的执行过程,就必须先了解 Mybatis 中都有哪一些重要的类,这些类的职责都是什么? SqlSession 我们都很熟悉,它对外提供用户和数据库之间交互需要使用的方法,隐藏了底层的细节.它默认是实现类

  • Mybatis中特殊SQL的执行

    目录 1.模糊查询 2.批量删除 3.动态设置表名 4. 添加功能获取自增的主键 1.模糊查询 大家应该还记得sql语句的模糊查询怎么写吧,那就是使用关键字like,并且有相应的通配符一起使用,%表示多个字符,_表示一个字符,比如说现在有一张表user,查询name中第一个字母是l的人select * from user where name like ‘_l’;如果是查询name中有 l 的人select * from user where name like ‘%l%’; 模糊查询不可以使用

  • MyBatis中防止SQL注入讲解

    SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者). SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性要求很高的应用中(比如银行软件),经常使用将SQL语句全部替换为存储过程这样的方式,来防止SQL注入.这

  • Mybatis 中的sql批量修改方法实现

    在项目中遇到需要批量更新的功能,原本想的是在Java中用循环访问数据库去更新,但是心里总觉得这样做会不会太频繁了,太耗费资源了,效率也很低,查了下mybatis的批量操作,原来确实有<foreach>标签可以做到. dao  层接口: public class Demo{ private int id; private String name; private String sex; } <pre name="code" class="html"&

  • Mybatis中动态SQL,if,where,foreach的使用教程详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.statement中直接定义使用动态SQL: 在statement中利用if 和 where 条件组合达到我们的需求,通过一个例子来说明: 原SQL语句

  • MyBatis中动态sql的实现方法示例

    1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql? 动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.有些时候,SQL语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可

  • Mybatis中的PageHelper的执行流程分析

    PageHelper Mybatis的执行流程 mybatis中首先要在配置文件中配置一些东西 然后根据这些配置去创建一个会话工厂 再根据会话工厂创建会话,会话发出操作数据库的sql语句 然后通过执行器操作数据 再使用mappedStatement对数据进行封装 这就是整个mybatis框架的执行情况. 插件的执行 它主要作用在Executor执行器与mappedeStatement之间 也就是说mybatis可以在插件中获得要执行的sql语句 在sql语句中添加limit语句,然后再去对sql

  • MyBatis中关于SQL的写法总结

    目录 一.MyBatis – if 语句 二.MyBatis --choose 语句 三.MyBatis – trim 四.MyBatis – where 五.MyBatis – set 六.MyBatis – foreach 七.MyBatis – concat 八.MyBatis – sql片段 最近MyBatis使用较多,在这里简单总结一下MyBatis的sql写法 说简单一点mybatis就是写原⽣sql,官方都说了 mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在

  • SQL Server 中查看SQL句子执行所用的时间

    复制代码 代码如下: set statistics profile on set statistics io on set statistics time on go 你执行的SQL语句 复制代码 代码如下: go set statistics profile off set statistics io off set statistics time off 执行完后点消息即可.

  • Mybatis中的动态SQL语句解析

    这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配

  • mybatis中<if>标签bool值类型为false判断方法

    昨天实现一个功能,根据文章的id或者别名查找文章. 起初采用mybatis的Example进行查询,对参数artName进行判断,如果是纯数字就byId查询,否则就by别名.由于查询文章的同时,需要关联查询文章分类标签,所以选择采用select语句映射的方式查询,但又不想写两个查询方法,就使用了mybatis中动态sql. /** * 查询文章 * @param artName id 或 别名 * @param byId 如果是 true 则按照id查询 * 否则 按照别名查询 * @retur

随机推荐