7、Mybatis之特殊SQL
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的更多相关文章
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
- MyBatis探究-----动态SQL详解
1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...
- mybatis 的sql语句及使用mybatis的动态sql mybatis防注入
由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接 :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...
- java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件
前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
随机推荐
- sql server 系统表详细说明
sql server 系统表详细说明 sysaltfiles 主数据库 保存数据库的文件syscharsets 主数据库字符集与排序顺序sysconfigures 主数据库 配置选项 syscurco ...
- # 代码随想录算法训练营Day10 栈与队列| 理论基础 232.用栈实现队列 225. 用队列实现栈
栈与队列理论基础 队列是先进先出,栈是先进后出 关于栈的四个问题 C++中stack 是容器么? 我们使用的stack是属于哪个版本的STL? 我们使用的STL中stack是如何实现的? stack ...
- 代码随想录算法训练营Day7哈希表| 454.四数相加II383. 赎金信15. 三数之和18. 四数之和 |总结
454.四数相加Ⅱ 题目链接:454.四数相加 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:. ...
- Python潮流周刊#3:PyPI 的安全问题
你好,我是豌豆花下猫.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 文章&教程 1.掌握Py ...
- drf之频率类源码
1 频率类 写一个类,继承SimpleRateThrottle,重写get_cache_key,返回[ip,用户id]什么,就以什么做限制,编写类属性 scope = 字符串,在配置文件中配置 'DE ...
- Java(if选择、switch选择、循环)
1.if 选择结构 //语法 if(表达式){ //语句:(表达式为真) }else{ //语句:(表达式为假) } --------------------------------------- 例 ...
- element-ui中Select 选择器异步加载下一页
场景 当我们使用 Select 选择器存放大量数据的时候. 会发现存在这么2个问题. 1.接口响应时间较长.(因为数据量较多,一次查询的所有)甚至有可能超时. 2.前端下拉框滑动卡顿. 这个时候们如何 ...
- 2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间
2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数. 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」. 所谓「表现良好的时间 ...
- 【python基础】类-初识类
1.面向对象思想 在认识类之前,我们需要理解面向对象思想和面向过程思想. 面向过程思想:要拥有一间房屋,面向过程像是自己来修盖房屋,如果需要经过选址.购买材料.砌墙.装修等步骤,面向过程编程,就相当于 ...
- 【WebServer】项目总体流程
1. 项目总体流程: 事件处理模式:采用Epoll边沿触发的IO多路复用技术,模拟Proactor模式: 主线程使用epoll监听与客户端连接的socket,并在主线程中对这些socket执行数据读写 ...