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为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...
随机推荐
- Python-sympy科学计算与数据处理(方程,微分,微分方程,积分)
方程 a,b,c,x = symbols("a b c x") my_eq = Eq(a*x**2+b*x+c,0) solve(my_eq,x) Out[12]: [(-b + ...
- V8的垃圾回收和内存限制
V8的垃圾回收和内存限制 前言 在第三次浏览器大战中,来自Google的Chrome浏览器凭借优异的性能成为聚光灯下的焦点.而Chrome的成功离不开站在其背后的JavaScript引擎V8. 随着V ...
- 20190521 - macOS 中显示隐藏文件的快捷键
macOS 中显示隐藏文件,以前总是借助于命令行或第三方软件,其实有一个快捷键: shift + cmmand + .
- Jmeter接口测试 2=> Jmeter工具的介绍
第一节 接口测试流程 参数化:EXCEl文件参数化.数据库参数化.直接代码中配置.配置文件 预处理请求(前置处理):对请求的参数进行预处理.准备,如加密数据.组织测试数据 发起请求:httpclien ...
- Django-Form组件-forms.ModelForm
froms.ModelForm 具有models操作数据库字段的功能,还具有Form的功能.较Form组件而言,根据model自动生成Form. 使用注册的案例进行初步认识 # 使用ModelForm ...
- 手把手教你在pycharm上上传项目至GitHub
如果你还没有下载Git,请移步下载:https://git-scm.com/downloads 下载后解压傻瓜式安装,不过请记住你的安装目录,我们会用到. 以我的安装目录为例:D:\Program F ...
- 添加SSH keys到github帐号
使用git clone命令从github上同步github上的代码库时,如果使用SSH链接(如我自己的esesgrid项目:git@github.com:hmilycc/esesgrid.git),而 ...
- SpringBoot配置文件可存放位置和加载顺序
使用IDEA创建一个spring初始化项目后.默认的配置文件在resources文件夹下. SpringBoot启动时,会扫描application.properties或application.ym ...
- Design Phone Directory
Design a Phone Directory which supports the following operations: get: Provide a number which is not ...
- java分词工具hanlp介绍
前几天(6月28日),在第23届中国国际软件博览会上,hanlp这款自然语言处理工具荣获了“2019年第二十三届中国国际软件博览会优秀产品”. HanLP是由一系列模型预算法组成的工具包,结合深度神经 ...