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为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...
随机推荐
- React Native pod install报错 `Yoga (= 0.44.3.React)` required by `React/Core (0.44.3)`
使用pod安装,可能会因为Podfile的路径指向错误或者没有路径指向因为报错. 报错截图如下: 这是因为在指定的路径没有寻找到相应的组件.此时就需要修改podfile文件中的路径,由于上方提示没有 ...
- React Native细节知识点总结<一>
1.propTypes: static propTypes = { name:PropTypes.string, ID:PropTypes.number.isRequired, } 'isRequir ...
- Java泛型(1):概述
通常而言,我们使用一种容器来存储一种类型的对象.而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象.因此,与其使用Object,我们可以暂时不指定类型. 看下面3个例子: (1) 我们有时候 ...
- Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)
主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...
- Mac 常用配置(JDK切换,ll命令设置)
打开 /Users/用户/.bash_profile文件 1.JDK切换,添加如下内容 export JAVA_6_HOME=`/usr/libexec/java_home -v 1.6` # 设置 ...
- webshell劫持工具【全站劫持】
演示视频下载地址:https://share.weiyun.com/53hPGYj 需要联系QQ:1743685523 ---------------------------------------- ...
- Transformer详解
0 简述 Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行. 并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提 ...
- 2019icpc南京网络赛
B. super_log(扩展欧拉函数) 题意:求aa...(b个a)模M的值. 思路:递归用欧拉函数求解,我们知道欧拉降幂公式: 如果讨论b和φ(p)的关系会很麻烦,网上证明了一种精妙的方法,只需重 ...
- [转帖]PostgreSQL的用户、角色和权限管理
PostgreSQL的用户.角色和权限管理 2018年05月18日 14:02:29 jerry-89 阅读数 6143 https://blog.csdn.net/eagle89/article/d ...
- Nginx整合Tomcat
现在先不考虑集群的配置问题,只实现Nginx实现一台tomact的代理 1.我们需要一个web项目,这里我把先准备好的web.war文件部署到Tomact服务器上 mvn clean install ...