mybatis-03
mybatis-03
1、mybatis的别名【两种】
在MyBatis中可以为变量类型定义别名。简化映射文件的定义,在核心配置文件中定义的别名。
别名应用:MyBatis框架先将resultType定义忽略大小写,作为类型的完全命名,查找类型,如果类型不存在,则检索别名定义, 如果别名定义不存在,抛出异常。
mybatis的别名使用步骤
①mybatis总体配置文件里配置别名标签 typeAliases
<!-- 配置别名 -->
<typeAliases>
<!-- <typeAlias type="com.boom.pojo.User" alias="user"/> -->
<package name="com.boom.pojo"/>
</typeAliases>
②mapper映射文件里resultType需要注意写法
typeAlias配置别名,resultType需要跟alias对应
package配置别名,扫描的是包,resultType需要些对应的实体类的类名
<select id="selectById" parameterType="int" resultType="User">
select * from user where userid=#{userid}
</select>
2、mybatis返回值类型
就是查询语法处理结果集行数据的方式,就是select标签的resultType属性.
2.1 简单类型
八种基本类型,包装类型,String。代表只处理结果集行数据中的第一个字段。常用于处理数据量查询语法: select username from student
2.2 自定义类型
自定义的java对象类型.将结果集中的行数据,封装成对应对象,并返回。最常用的返回结果类型.
<!-- 返回的结果集只对姓名做映射 -->
<select id="selectById2" parameterType="int" resultType="string">
select username from user where userid=#{userid}
</select>
2.3 map集合类型
Map集合对象:将结果集的行数据封装为一个Map类型的对象,字段名作为key,字段值作为value。最通用的返回结果类型。可以处理部分字段查询,多表联合查询,符合查询等,对应复杂查询语法。
<!-- map -->
<select id="selectByAll" parameterType="int" resultType="map">
select * from user
</select>
3、【mapper动态构建】
只定义接口和SQL映射文件,不编写DAO实现类型。通过遵循MyBatis定义规范,实现动态的DAO接口实现类构建。MyBatis在定义数据访问接口的时候, 在包的命名上有特有习惯.习惯是: xxx.mapper。
必要规范:
①mybatis做动态绑定的时要求接口的名称要和被绑定的映射文件名称必须一致
②要求映射文件的命名空间(namespace)与接口的全限定名完全一致
③要求标签的ID值,和对应的接口方法命名完全一致
④总体配置文件里管理映射用package【核心配置文件中一次性读取所有的SQL映射文件】
<mappers>
<package name="com.boom.mapper"/>
</mappers>
⑤调用的API发生了变化拿到session调用getMapper
SqlSession session = MybatisUtil.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
System.out.println(mapper.selectById(1));
4、mybatis动态SQL
1)if标签(用于判断的标签)
语法:<if test=”布尔表达式”>
应用限制:布尔表达式中使用的变量命名,必须是自定义类型属性或Map的key
if条件判断的运算符写法:
大于 gt 小于lt 等于eq
大于等于gte 小于等于lte 不等于neq
也可直接写:>、<、>=、<=、 !=
<!-- 根据不同条件进行不同的查询 -->
<select id="selectByproPerties" resultType="User">
select * from user where 1=1
<if test="userid !=null">
and userid = #{userid}
</if>
<if test="username != null and username.length() > 0">
and username = #{username}
</if>
<if test="userage != null">
and userage = #{userage}
</if>
</select>
mapper.xml
//根据不同条件进行不同的查询
User user = new User();
user.setUserage(18);
user.setUsername("小红");
List<User> list = mapper.selectByproPerties(user );
for (User users : list) {
System.out.println(users);
}
TestMapper.java
动态SQL主要看控制台打印的日志记录
2)where标签
用于定义where条件查询子句的标签
语法:<where>定义标签或SQL语法</where>
应用特性:会根据标签体内容,决定是否增加where子句, 如果标签体中有内容,增加where查询子句。如果标签体无内容,不增加where查询子句。 在where标签拼接查询子句条件的时候,,会检查第一个查询条件,且只检查第一个查询条件。检查查询条件前是否有and或or关键字,如果有关键字,删除.。如果没有关键字,不做任何操作。
特点:如果在mapper.xml中不写where 1=1,查询语句也会自动拼接where 1=1,如果给定条件,where标签会在SQL语句中拼接成大写的WHERE
<select id="selectByproPerties_where" resultType="User">
select * from user
<where>
<if test="userid !=null">
and userid = #{userid}
</if>
<if test="username != null and username.length() > 0">
and username = #{username}
</if>
<if test="userage != null">
and userage = #{userage}
</if>
</where>
</select>
mapper.xml
//根据不同条件进行不同的查询
User user = new User();
user.setUserage(18);
//user.setUsername("小红");
List<User> list = mapper.selectByproPerties_where(user );
for (User users : list) {
System.out.println(users);
}
TestMapper.java

3)choose标签(二选一的结果)
补充if标签的判断逻辑标签。 可以实现类似java中的if else if else的判断标签
语法: <choose> <when test=”布尔表达式”></when><otherwise></otherwise></choose>
含义: <when>标签相当于if或else if. <otherwise>标签相当于是else
<select id="selectByproPerties_choose" resultType="User">
select * from user
<where>
<choose>
<when test="username != null and username.length() > 0">
username = #{username}
</when>
<otherwise>
userage = 18
</otherwise>
</choose>
</where>
</select>
mapper.xml
SqlSession session = MybatisUtil.openSession();
UserMapper mapper = session.getMapper(UserMapper.class); User user = new User();
//user.setUsername("小红");
List<User> list = mapper.selectByproPerties_choose(user );
for (User users : list) {
System.out.println(users);
}
TestMapper.java

4)foreach标签
循环迭代标签,常用于处理集合条件.如:批量新增, 范围条件查询.
当循环的集合为Map的时候, 默认循环遍历value数据集合. 可以通过表达式调用java方法,实现key数据集合的遍历.
<insert id="insertuser_batch">
insert into user(username,userage) values
<foreach collection="list" separator="," item="user">
(#{user.username},#{user.userage})
</foreach>
</insert>
mapper.xml写法一
定义接口:void insertuser_batch(List<User> list);
SqlSession session = MybatisUtil.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
List<User> list = new ArrayList<>();
list.add(new User("a1", 21));
list.add(new User("a2", 22));
list.add(new User("a3", 23));
mapper.insertuser_batch(list);
TsetMapepr.java

查看数据库是否批量添加成功:【测试避免麻烦:开启mybatis事物自动提交】
循环迭代标签参数的详解
标签可以循环数组, Collection, Map
属性:
collection - 参数对象的property或field, 以及Map集合的key. 要循环的集合
open - 循环数据的前缀
close - 循环数据的后缀
item - 每次循环的变量命名
separator- 以什么符号分割
mapper.xml写法二
5)trim标签
在标签内容数据的前后,增加或减少一个字符串.
先删除前后缀,再增加前后缀.
prefix 给sql语句拼接的前缀 先去后加
suffix 给sql语句拼接的后缀
prefixesToOverride 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixesToOverride属性指定,
假设该属性指定为”AND”,当sql语句的开头为”AND”,trim标签将会去除该”AND”
suffixesToOverride 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixesToOverride属性指定
6)set标签
用于动态拼接更新语句中set子句的标签.
更新数据:根据参数的属性决定更新什么字段,自动去掉set语句最后的那个逗号
如果有属性值,则更新字段。 如果没有属性值,则不更新字段
<!-- 根据id进行更新 -->
<update id="updateById">
update user
<set>
<if test="username != null and username.length() > 0">
username = #{username},
</if>
<if test="userage != null">
userage = #{userage},
</if>
</set>
<where>
userid =#{userid}
</where>
</update>
mapper.xml
定义接口:void updateById(User user);
SqlSession session = MybatisUtil.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUserid(1);
user.setUserage(20);
user.setUsername("更新");
mapper.updateById(user);
TestMapper

7)sql标签
定义SQL语法片段的标签,可以简化配置文件, 提供SQL语法的通用性.
5、mybatis事物和filter过滤器
事物处理:实现javax.servlet.Filter;
web.xml配置
用ThreadLocal去完成事物的一致性
mybatis-03的更多相关文章
- Hello Mybatis 03 数据关联
ResultMap 在实际的开发中,数据库不总是我们希望看到的样子.比如我们希望User的主键是id但是数据库偏偏喜欢叫它u_id,这样一来原先的resultType似乎就失效了,不带这么玩的,整个人 ...
- MyBatis 03 缓存
简介 什么是缓存 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,转从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题 ...
- MyBatis笔记03
1.动态sql 01.if:单独使用if,后面必须有where 1=1 代码:<!-- 需要注意的事项:01. 在xml文件中 特殊字符的使用 &&必须换成 and或者 & ...
- Mybatis学习03
title: Mybatis学习03 date: 2020-01-19 13:03:20 tags: Mybatis学习的第二天,内容有日志和分页. <!--more--> 1.日志 1. ...
- 👨💻Mybatis源码我搞透了,面试来问吧!写了134个源码类,1.03万行代码!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:手撸一万行! 完结撒花:4个月.20章.134个类.1.03万行代码! 22年3月初 ...
- mybatis 复习笔记03
参考:http://www.mybatis.org/mybatis-3/zh/configuration.html 入门 1. 从 XML 中构建 SqlSessionFactory 每个基于 MyB ...
- 03.redis与ssm整合(mybatis二级缓存)
SSM+redis整合 ssm框架之前已经搭建过了,这里不再做代码复制工作. 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存 ...
- 带着新人学springboot的应用03(springboot+mybatis+缓存 下)
springboot+mybatis+缓存,基本的用法想必是会了,现在说一说内部大概的原理. 稍微提一下mybatis,只要导入了mybatis的依赖,那么有个自动配置类就会生效,你可以去mybati ...
- [03] SpringBoot+MyBatis+Shiro搭建杂谈
0.写在前面的话 一直想能仿公司框架的形式,着手做一个简单的脚手架,一来是带着目标性能更好地学习,接触新的技术,另外自己如果有什么想要实现的简单需求,就可以进行快速开发,主要还是希望能在权限上有所控制 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis
第5章--MyBatis MyBatis入门 Abstract: 数据库框架的工作原理和使用方法(以MyBatis为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...
随机推荐
- 后缀数组--summer-work之我连模板题都做不起
这章要比上章的AC自动机要难理解. 这里首先要理解基数排序:基数排序与桶排序,计数排序[详解] 下面通过这个积累信心:五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码) 下面认真研读下这篇: [转 ...
- Docker Swarm常用命令
#查看集群节点 docker node ls #创建nginx服务 #docker pull hub.test.com:5000/almi/nginx:0.1 #下载私有仓库镜像 docker ser ...
- 8-1 文本三级剑客之sed
文本三级剑客之sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern ...
- 【并行计算-CUDA开发】CUDA bank conflict in shared memory
http://hi.baidu.com/pengkuny/item/c8070b388d75d481b611db7a 以前以为 shared memory 是一个万能的 L1 cache,速度很快,只 ...
- moment的简单使用方式
官网地址:http://momentjs.cn/ 常见示例↓ moment().format('YYYY-MM-DD HH:mm:ss'); // ’2015-11-30 23:10:10‘ mome ...
- python库 使用shutil来删除文件夹时报PermissionError时的解决方案
解决方案: def handle_remove_read_only(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remov ...
- SpringBoot默认日志的使用方法及常用配置
SpringBoot默认采用slf4j+logback 的组合形式,但也提供对JUL.log4j2.Logback提供了默认配置. 我们使用IDEA的spring初始化创建一个springboot项目 ...
- WijmoJS 中自定义 React 菜单和列表项模板
WijmoJS 中自定义 React 菜单和列表项模板 在V2019.0 Update2 的全新版本中,React 框架下 WijmoJS 的前端UI组件功能再度增强. WijmoJS的菜单和类似列表 ...
- SQLite进阶-9.别名
我们可以暂时给表或者列重命名为另一个名字,称为别名,重命名只是临时运行时改变,不会改变数据库中的实际的名字. -- 语法 SELECT column_name AS column_alias_name ...
- 数据排序 sort
排序命令: 常和管道进行协作的命令 -sort (默认使用字符的第一个字符进行排序) -n 按数字排序 -r 反序排序 -o 结果 输出到文件 -t 分隔符 (sort -n -t &qu ...