7.1 创建接口、映射文件和测试类

++++++++++++++++++++++++++分割线++++++++++++++++++++++++++

注意namespace属性值为对应接口的全限定类名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.rain.mybatis.mapper.SpecialSQLMapper"> </mapper>

++++++++++++++++++++++++++分割线++++++++++++++++++++++++++

7.2、模糊查询

7.2.1、接口方法

List<User> getUserByLike(@Param("mohu") String mohu);

7.2.2、测试方法

    @Test
public void testGetUserByLike(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SpecialSQLMapper specialSQLMapper = sqlSession.getMapper(SpecialSQLMapper.class);
List<User> users = specialSQLMapper.getUserByLike("a");
for (User user : users) {
System.out.println(user);
}
}

7.2.3、映射文件

7.2.3.1、字符串拼接

    <!--List<User> getUserByLike(@Param("mohu") String mohu);-->
<select id="getUserByLike" resultType="User">
select * from t_user where username like '%${mohu}%'
</select>

7.2.3.2、函数处理

注意:各种数据库的字符串拼接函数会不相同,本示例用的是Mysql的字符串拼接函数

    <!--List<User> getUserByLike(@Param("mohu") String mohu);-->
<select id="getUserByLike" resultType="User">
select * from t_user where username like concat('%',#{mohu},"%")
</select>

7.2.3.3、双引号拼接

注意:这种方式最常用;因为既没有SQL注入的问题,也没有不同数据库函数不一致问题

    <!--List<User> getUserByLike(@Param("mohu") String mohu);-->
<select id="getUserByLike" resultType="User">
select * from t_user where username like "%"#{mohu}"%"
</select>

7.3、批量删除

7.3.1、接口方法

void deleteMoreUser(@Param("ids") String ids);

7.3.2、测试方法

    @Test
public void testDeleteMoreUser(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SpecialSQLMapper specialSQLMapper = sqlSession.getMapper(SpecialSQLMapper.class);
specialSQLMapper.deleteMoreUser("7,8");
sqlSession.close();
}

7.3.3、映射文件

注意:这里使用#{}占位符赋值会报错,因为ids是字符串,占位符赋值会自动为其添加单引号,而id字段是数值类型;

除了使用${}字符串拼接之外,批量删除还可以用Mybatis的动态SQL功能

    <!--void deleteMoreUser(@Param("ids") String ids);-->
<delete id="deleteMoreUser">
delete from t_user where id in (${ids})
</delete>

7.3.4、执行效果

+++++++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++++++

7.4、动态设置表名

7.4.1、接口方法

List<Map<String,Object>> getAllData(@Param("tableName") String tableName);

7.4.2、映射文件

注意:这里使用#{}占位符赋值会报错,因为表名不能有单引号

    <!--List<Map<String,Object>> getAllData(@Param("tableName") String tableName);-->
<select id="getAllData" resultType="Map">
select * from ${tableName}
</select>

7.4.3、测试方法

    @Test
public void testGetAllData(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SpecialSQLMapper specialSQLMapper = sqlSession.getMapper(SpecialSQLMapper.class);
List<Map<String, Object>> t_user = specialSQLMapper.getAllData("t_user");
for (Map<String, Object> map : t_user) {
System.out.println(map);
}
sqlSession.close();
}

7.4.4、执行效果

7.5、添加功能获取自增主键

7.5.1、接口方法

注意:当参数是实体类时,不需要使用@Param注解,因为可以通过实体类的属性名来获取参数值

void insertUser(User user);

7.5.2、映射文件

注意:因为增删改的返回值是存放受影响的行数的,所以获取的自增主键只能存放在实体类的某个属性中

    <!--void insertUser(User user);-->
<!--
useGeneratedKeys属性:设置当前的添加功能使用自增主键
keyProperty属性:设置获取的自增主键放在实体类的哪个属性中
-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values (null ,#{username},#{password},#{age},#{gender},#{email})
</insert>

7.5.3、测试方法

    @Test
public void testInsertUser(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SpecialSQLMapper specialSQLMapper = sqlSession.getMapper(SpecialSQLMapper.class);
User user = new User();
user.setUsername("111");
user.setPassword("111");
user.setEmail("111@11.com");
user.setGender("1");
user.setAge(11);
System.out.println(user);
specialSQLMapper.insertUser(user);
System.out.println(user);
sqlSession.close();
}

7.5.4、执行效果

注意执行添加功能后,id值的变化

7、Mybatis之特殊SQL的更多相关文章

  1. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. Mybatis学习记录(五)----Mybatis的动态SQL

    1.  什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...

  4. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  5. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  6. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  7. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

  8. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  9. mybatis 的sql语句及使用mybatis的动态sql mybatis防注入

    由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接  :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...

  10. java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件

    前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...

随机推荐

  1. 2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。

    2021-04-04:给定一个非负数组arr,和一个正数m. 返回arr的所有子序列中累加和%m之后的最大值. 福大大 答案2021-04-04: 自然智慧即可. 1.递归,累加和. 2.动态规划,累 ...

  2. 2021-07-12:缺失的第一个正数。给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。比如[3,4,5

    2021-07-12:缺失的第一个正数.给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数.请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案.比如[3,4,5 ...

  3. java中this的内存原理以及成员变量和局部变量

    this的内存原理 1.this的作用: 区分局部变量和成员变量 eg: public class Student{ private int age; public void method(){ in ...

  4. Spring Boot 配置文件总结

    前言 Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值. ...

  5. 8张图带你全面了解kafka的核心机制

    前言 kafka是目前企业中很常用的消息队列产品,可以用于削峰.解耦.异步通信.特别是在大数据领域中应用尤为广泛,主要得益于它的高吞吐量.低延迟,在我们公司的解决方案中也有用到.既然kafka在企业中 ...

  6. 汉字编码新尝试:字理组字编码方案v0.0

    ↑对,这就是正片↑(同步自敝知乎专栏,不定期更新) 高清(确信)版:http://farter.cn/zzdm/latest.png 不用任何教程,试试对着表解码一下: 43 295 817 146 ...

  7. 2014年蓝桥杯C/C++大学B组省赛真题(奇怪的分式)

    题目描述: 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是:1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)老师刚想批评他,转念一想 ...

  8. QT 绘制波形图、频谱图、瀑布图、星座图、眼图、语图

    说明 最近在学中频信号处理的一些东西,顺便用 QT 写了一个小工具,可以显示信号的时域波形图.幅度谱.功率谱.二次方谱.四次方谱.八次方谱.瞬时包络.瞬时频率.瞬时相位.非线性瞬时相位.瞬时幅度直方图 ...

  9. 基于nerdctl+buildkitd+containerd实现镜像构建

    1.容器技术简介 容器技术除了的docker之外,还有coreOS的rkt.google的gvisor.以及docker开源的containerd.redhat的podman.阿⾥的pouch等,为了 ...

  10. JUC同步锁原理源码解析四----Semaphore

    JUC同步锁原理源码解析四----Semaphore Semaphore 1.Semaphore的来源 A counting semaphore. Conceptually, a semaphore ...