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为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...
随机推荐
- java+ueditor word粘贴上传
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- java文件上传系统
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- Python3 编程第一步_关键字end
关键字end可以被用于防止输出新的一行,或者在输出的末尾添加不同的字符: a, b = 0, 1 while b < 1000: print(b, end=',') a, b = b, a+b ...
- Vue组件v-if新渲染的组件不更新
Vue组件v-if新渲染的组件不更新:可能原因是Vue识别到是相似组件(高度相似甚至相同)不会更新元素.给原来的组件和新组件分别给不同的key值让Vue识别为不同的组件.
- 【图像处理】H.264开源解码器评测
转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以 ...
- ZOJ Problem Set - 1004
1.翻译参考 http://liucw.blog.51cto.com/6751239/1198026 2.代码参考 http://www.cnblogs.com/devymex/archive/201 ...
- [转帖]CentOS7安装xrdp(windows远程桌面连接linux)
CentOS7安装xrdp(windows远程桌面连接linux) https://blog.csdn.net/sgrrmswtvt/article/details/81869208 You Konw ...
- DAO语句如何定义属性类型
字体设置:代码 14px 文字 幼圆 15px public interface IAddressDAO { //添加地址 public boolean doCreate(Address addres ...
- shell 字符
Shell 中的符号: 在shell中有很多符号代表了一些意思,重点说说 键盘上的符号在shell中的意义. 通配符: ~ 匹配家目录 ? 匹配单个字符.( ?之匹配单一的一个字符.x11 这种的就 ...
- linux下vi编辑器常用命令
最近折腾云主机centOS,不得不接触到各种命令,特别是vi编辑器. 时常悔恨当时没好好听金老伯的linux课,导致现在操作命令用的十分生疏,甚至跳转行首行尾都要查一查才知道. 所以〒▽〒有了下面这篇 ...