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的更多相关文章

  1. Hello Mybatis 03 数据关联

    ResultMap 在实际的开发中,数据库不总是我们希望看到的样子.比如我们希望User的主键是id但是数据库偏偏喜欢叫它u_id,这样一来原先的resultType似乎就失效了,不带这么玩的,整个人 ...

  2. MyBatis 03 缓存

    简介 什么是缓存 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,转从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题 ...

  3. MyBatis笔记03

    1.动态sql 01.if:单独使用if,后面必须有where 1=1 代码:<!-- 需要注意的事项:01. 在xml文件中 特殊字符的使用 &&必须换成 and或者 & ...

  4. Mybatis学习03

    title: Mybatis学习03 date: 2020-01-19 13:03:20 tags: Mybatis学习的第二天,内容有日志和分页. <!--more--> 1.日志 1. ...

  5. 👨‍💻Mybatis源码我搞透了,面试来问吧!写了134个源码类,1.03万行代码!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:手撸一万行! 完结撒花:4个月.20章.134个类.1.03万行代码! 22年3月初 ...

  6. mybatis 复习笔记03

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html 入门 1. 从 XML 中构建 SqlSessionFactory 每个基于 MyB ...

  7. 03.redis与ssm整合(mybatis二级缓存)

    SSM+redis整合 ssm框架之前已经搭建过了,这里不再做代码复制工作. 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存 ...

  8. 带着新人学springboot的应用03(springboot+mybatis+缓存 下)

    springboot+mybatis+缓存,基本的用法想必是会了,现在说一说内部大概的原理. 稍微提一下mybatis,只要导入了mybatis的依赖,那么有个自动配置类就会生效,你可以去mybati ...

  9. [03] SpringBoot+MyBatis+Shiro搭建杂谈

    0.写在前面的话 一直想能仿公司框架的形式,着手做一个简单的脚手架,一来是带着目标性能更好地学习,接触新的技术,另外自己如果有什么想要实现的简单需求,就可以进行快速开发,主要还是希望能在权限上有所控制 ...

  10. Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis

    第5章--MyBatis MyBatis入门 Abstract: 数据库框架的工作原理和使用方法(以MyBatis为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...

随机推荐

  1. DS18b20温度传感器基础使用

    认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...

  2. 用Python操作Excel,实现班级成绩的统计

    本次是在原来有一定格式的Excel文档中补充成绩. 安装的模块:xlwt . xlrd .xlutils xlrd的模块是只用读取xls文件,不能写文件,同理xlwt,只(新建写)不读已有的xls, ...

  3. 【052-week 预习周】学习总结

    目录 学习手册 学习理念 学员精选 课前准备 概览 数据结构思维导图 算法思维导图 学习手册 学习理念 让优秀的人一起学习 师傅领进门,修行靠个人 学员精选 稻盛和夫"六项精进" ...

  4. 【机器学习】【计算机视觉】非常全面的图像数据集《Actions》

    目录(?)[+]   1.搜狗实验室数据集: http://www.sogou.com/labs/dl/p.html 互联网图片库来自sogou图片搜索所索引的部分数据.其中收集了包括人物.动物.建筑 ...

  5. 【并行计算-CUDA开发】CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起

    掌握部分硬件知识,有助于程序员编写更好的CUDA程序,提升CUDA程序性能,本文目的是理清sp,sm,thread,block,grid,warp之间的关系.由于作者能力有限,难免有疏漏,恳请读者批评 ...

  6. 【VS开发】C++ opencv Mat基础

    OpenCV2:Mat 1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...

  7. 2019牛客暑期多校训练营(第五场)- G subsequence 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/G 题意:给定字符串s,t,求s中满足字典序大于t的子序列的个数. 思路:组合数学+dp.当子序列长度大于m时 ...

  8. delphi 相关好的资料网站

    1.Delphi编程技巧大全   http://www.delphitop.com/  (实例讲解所有组件) 2.Delphi学习大师  Delphi基础教程 视频教程  http://www.xue ...

  9. SQL SERVER DATEPART函数

    定义: DATEPART函数返回指定日期的指定部分. 语法: DATEPART(datepart,date) 参数: ①datepart 参数可以是下列的值: datepart 缩写 年(Year) ...

  10. Springboot问题解决记录

    本随笔只为了方便查阅 如何将SpringBoot项目地打成一个war包: 传送门:https://blog.csdn.net/zhoucheng05_13/article/details/779152 ...