目录
3.1将核心配置文件夹合并.springBootx整合mybatis
3.2会话工厂用mybatis-plu代替,使用接口继承调用其方法
1.mybaits概述
1.1Mybatis简述
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的**持久层框架**,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
1.2mybatis核心及相关概念
核心:简化了JDBC操作数据库的过程,是一个优秀的ORM框架,
两个配置文件:
核心配置文件---用来配置数据库的连接的参数
映射文件 – 用来写SQL
两个核心工具类
Splsessionfatory---会话工厂,用来产生会话
sqlSession --会话,用来执行SQL
相关概念:
ORM---对象关系映射:是指把表里字段的值,自动映射给类里的属性
1.3 mybatis其他概念
mybatis除了对应的核心概念外,还有其他许多东西需要我们去理解和学习,具体可以参考mybatis官网的说明:MyBatis中文网
本文章只是说明一个大概,mybatis具体应用很多,我们会通过后边的实例进行讲解和说明。
1.3.1 配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
其中properties和mapper是我们经常看到和配置,具体实例如下:
1.3.2 XML 映射器
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
select
查询语句是 MyBatis 中最常用的元素之一——光能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。 MyBatis 的基本原则之一是:在每个插入、更新或删除操作之间,通常会执行多个查询操作。
insert, update 和 delete
数据变更语句 insert,update 和 delete 的实现非常接近:
sql
这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
参数
之前见到的所有语句都使用了简单的参数形式。但实际上,参数是 MyBatis 非常强大的元素。
结果映射
resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
自动映射
正如你在前面一节看到的,在简单的场景下,MyBatis 可以为你自动映射查询结果。但如果遇到复杂的场景,你需要构建一个结果映射。 但是在本节中,你将看到,你可以混合使用这两种策略。让我们深入了解一下自动映射是怎样工作的。
缓存
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
<cache/>
基本上就是这样。这个简单语句的效果如下:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
- 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
提示 缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。
2.入门案例
2.1项目结构及创建步骤:
步骤:
- 修改pom文件,添加Mybaits的jar包依赖 My-baits-Spring-boot-starter
- 创建核心配置文件,指定连接数据库的参数 dreiver url, username passsword
- 创建映射文件,写Sql
- 创建user类 可用lombok快速编程
- 在核心配置文件中引入映射文件 <mappers>
- 创建测试类
入门案例结构
2.2 修改pom文件
<!--连接mybait导包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
2.3 创建核心配置文件application.yml
#设立服务器端口号
server:
port: 2340
2.4 创建pojo类,封装数据为对象
@Data //get set tostring
@Accessors(chain = true)
//@Component
public class User implements Serializable {
//序列化:保证数据传输的完整性
private Integer id;
private String name;
private Integer age;
private String sex;
}
2.5 创建映射文件,写Sql语句
映射文件Mybatis/UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--规则: namespace必须与接口一一对应 -->
<mapper namespace="com.jt.mapper.UserMapper">
<sql id="cols">
id,name,age,sex
</sql>
<!--CRUD
定义别名包: 添加了别名包之后可以简化resultType编辑.
-->
<select id="getAll" resultType="User">
select * from demo_user
</select>
</mapper>
接口文件UserMapper,sql语句与接口内的方法一一对应
public interface UserMapper {
List<User> getAll();
2.6 创建映射接口,引入核心配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的核心配置文件 -->
<configuration>
<!--用来设置别名,type是类的全路径,alais是以后要用的别名-->
<typeAliases>
<typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias>
</typeAliases>
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/
mybatisdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
<mapper resource="mapper/DeptMapper.xml"></mapper>
</mappers>
</configuration>
2.7 创建测试类 完成数据的查询
@Test
public void get() throws IOException {
//1,读取核心配置文件 2,创建会话工厂
//3,创建Sql会话工厂 4,执行sql 5,处理结果
//1,读取核心配置文件.
InputStream in = Resources.getResourceAsStream("mybaits-config.xml");
//2,创建会话工厂工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3,创建Sql会话工厂
SqlSession session =factory.openSession();
//4,执行sql
//session.selectList("namespace的值.id的值");//查询出多个结果
List<User> list=session.selectList("UserMapperNS.getAll");//查询出多个结果
//5,处理结果
for(User u:list){
System.out.println(u);
}
}
2.8调用流程以及简化结构
简化别名
模拟会话工厂调用
3.mybati整合升级
3.1将核心配置文件夹合并.springBootx整合mybatis
#设立服务器端口号
server:
port: 2340
#spring连接数据库
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: lydon
#SpringBoot整合mybatis配置
mybatis:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
3.2会话工厂用mybatis-plu代替,使用接口继承调用其方法
pom.xml中的配置
<!--导入MP包之后,删除原有的Mybatis的包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
接口调用方法
4.动态sql语句的测试
4.1查询数据库数据
include标签:
<sql id="cols">
id,name,age,sex
</sql>
<select id="getById" resultType="User">
select
<include refid="cols"></include>
from demo_user where id=1
</select>
if标签:双重判定
<select id="getNameAge" resultType="User">
select
<include refid="cols"></include>
from demo_user
<if test="name!=null">
<if test="age!=age">
where name=#{name}
and age=#{age}
</if>
</if>
</select>
foreach遍历标签:循环
<select id="getByIdTri" resultType="User">
select
<include refid="cols"></include>
from demo_user
where id in
<foreach collection="ids" item="id" index="index"
separator="," open="(" close=")">
#{id}
</foreach>
</select>
4.2sql语句规范
查询:
<select id="getAll02" resultType="Student">
select * from students
</select>
删除:
<delete id="deleteBYId" parameterType="">
delete * from student where id=#{id}
</delete>
插入:
<insert id="insert" parameterType="">
insert from student values id={id},name=#{name},brand=#{brand}
</insert>
更新(修改):
<update id="updataById" parameterType="">
update from student where id=#{id}
</update>
4.3MP相关ApI语法
1.in和or
/**
* 案例6: 查询Id=1,3,5,6,7的数据
* 关键字: 单表查询 in or 效率相差不大
* 多表查询时 建议使用 or 性能更快
* 可变参数类型:
* 1.可变参数类型 数据结构实质是一个数组.
* 2.定义可变参数类型时,必须位于方法参数的最后一位!
* void addUser(Integer age,Integer... ids);
* void addUser(Integer age,Integer[] ids);
*/
@Test
public void testIn(){
//1.方法1 条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("age","1,3,5,6,7");
queryWrapper.in("id",1,2,3,4,5,6);
List<User> userList1 = userMapper.selectList(queryWrapper);
//2.MP 特殊方法调用 以后尽可能使用对象类型(对象有方法)
Integer[] ids = new Integer[]{1,2,3,4,5,6};
List idList = Arrays.asList(ids);
List<User> userList2 = userMapper.selectBatchIds(idList);
System.out.println(userList1);
System.out.println(userList2);
}
2 条件构造器-动态Sql
/**
* 案例7: 根据 name/sex 动态查询数据库
* 解析: 如果name/sex有值则动态拼接where条件.
* 否则不写where条件.
* 动态Sql实现: condition 参数
* 布尔类型值 true: 拼接where条件
* false: 不拼接where条件
* 字符串判断API:
* StringUtils.hasLength(name);
*/
@Test
public void testSelectNS(){
String name = null;
String sex = "";
QueryWrapper<User> queryWrapper = new QueryWrapper();
//判断是否有值
boolean nameFlag = StringUtils.hasLength(name);
boolean sexFlag = StringUtils.hasLength(sex);
queryWrapper.eq(nameFlag,"name",name)
.eq(sexFlag,"sex",sex);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
4.4数据库mp练习
练习Mybatis sql操作
1.根据Id=1 查询用户
2.根据name=“王昭君” 和sex=“女” 查询数据.
3.利用模糊查询: 查询name包含"精"的数据.
4.查询demo_user表中的数据要求按照年龄排序,如果年龄相同按照性别排序.
5.根据name和age动态查询查询数据 如果name和age不为null则拼接where条件
中间使用 and链接
Sql: select * from demo_user where name=“xxx” and age=“xxx”
6.查询ID=1,3,4,6,7的数据