1.SpringBoot简化Mybatis
1.1 项目整合
1.1.1 创建项目
1.1.2 导入jar包
说明: 在pom.xml文件中 添加jar包文件
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--添加lombok的包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1.1.3 删除多余的文件
说明: 将多余的文件删除,保留图中的文件即可
2. 修改配置文件名称
1.1.4 关于主启动类异常的说明
提示: “开箱即用” 原则
报错信息:
报错原理说明:
由于Mybatis依赖了JDBC的jar包. 但是该jar包文件是启动项. 当主启动类运行时,开始加载主启动项. 但是JDBC需要链接数据库.所以必须有相关的配置信息.但是此时YML文件中没有数据源的配置.所以报错.
1.1.5 修改YML配置文件
#1.配置端口号 注意缩进!!!!!
server:
port: 8090
#2.配置数据源
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: root
mybatis:
type-aliases-package: com.jt.pojo
#将所有的映射文件全部加载
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
1.1.6 将Mapper接口交给容器管理
package com.jt.mapper;
import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {
//指定接口方法 查询demo_user的全部数据
List<User> findAll();
}
1.1.7 编辑测试类
package com.jt;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper;
@Test
public void testDemo1(){
List<User> userList = userMapper.findAll();
System.out.println(userList);
}
}
2. Mybatis 基本用法
2.1 根据ID查询数据
2.1.1 编辑测试方法
@Test
public void testFindUserById(){
int id = 1;
User user = userMapper.findUserById(id);
System.out.println(user);
}
2.1.2 编辑Mapper接口
@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {
//指定接口方法 查询demo_user的全部数据
List<User> findAll();
//根据ID查询数据库
User findUserById(int id);
}
2.1.3 编辑UserMapper.xml映射文件
<!-- 根据ID查询数据库
动态取值: #{key}
-->
<select id="findUserById" resultType="com.jt.pojo.User">
select * from demo_user where id = #{id}
</select>
2.2 Sql语句打印
说明: 在YML文件中 添加日志操作
#1.配置端口号 注意缩进!!!!!
server:
port: 8090
#2.配置数据源
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
#yml文件 0不解析 如果字母以0开头则引号包裹
#password: "0123456"
password: root
#3.配置Mybatis
mybatis:
type-aliases-package: com.jt.pojo
#将所有的映射文件全部加载
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#4.打印Sql com.jt.mapper下的Sql日志
logging:
level:
com.jt.mapper: debug
2.3 根据name和age查询
2.3.1 编辑测试类
/**
* 知识点:
* 1.如果是多个参数传递,则一般采用对象的方式封装.
*/
@Test
public void testFindByNA(){
String name = "孙尚香";
int age = 18;
User user = new User();
user.setName(name).setAge(age);
List<User> userList = userMapper.findUserByNA(user);
System.out.println(userList);
}
2.3.2 编辑UserMapper
@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {
//指定接口方法 查询demo_user的全部数据
List<User> findAll();
//根据ID查询数据库
User findUserById(int id);
List<User> findUserByNA(User user);
}
2.3.3 编辑UserMapper.xml映射文件
<!-- 根据name和age查询数据
知识点: 别名包
在配置文件中指定包路径: 可以自动的实现包路径的拼接
resultType规则:
1. 首先根据别名包匹配.设定..
2. 如果匹配不成功,则按照路径匹配.
参数传递的规则:
1. 如果是单个参数,则使用#{key} 获取的参数的值
2. 如果是对象参数,则使用#{属性} 获取的是属性值
-->
<select id="findUserByNA" resultType="User">
select * from demo_user where
name = #{name} and age = #{age}
</select>
2.4 查询age>18 age <100 的用户
2.4.1 Sql语句
select * from demo_user where age>18 and age <100
2.4.2 编辑测试类
/**
* 知识点3:
* 说明: 如果多个参数不方便使用 User对象封装时,应该使用万能的集合Map
*/
@Test
public void testFindByAge(){
int minAge = 18;
int maxAge = 100;
Map<String,Integer> map = new HashMap<>();
map.put("minAge",minAge);
map.put("maxAge",maxAge);
List<User> userList = userMapper.findUserByAge(map);
System.out.println(userList);
}
2.4.3 编辑Mapper接口
@Mapper //将接口交给Spring容器管理 Map<userMapper,JDK代理对象>
public interface UserMapper {
//指定接口方法 查询demo_user的全部数据
List<User> findAll();
//根据ID查询数据库
User findUserById(int id);
List<User> findUserByNA(User user);
//习惯: 参数只有一个
List<User> findUserByAge(Map<String, Integer> map);
}
2.4.4 编辑xml 映射文件
<!--
根据年龄查询数据
语法: 如果传递的参数是Map, 则使用#{key}
xml转译字符:
1. > >
2. < <
3. & &
-->
<select id="findUserByAge" resultType="User">
select * from demo_user where age > #{minAge}
and age < #{maxAge}
</select>
2.4.5 转义标签
<!--
根据年龄查询数据
语法: 如果传递的参数是Map, 则使用#{key}
xml转译字符:
1. > >
2. < <
3. & &
4. 万能转译字符
<![CDATA[ 转移内容 ]]>
-->
<select id="findUserByAge" resultType="User">
<![CDATA[
select * from demo_user
where age > #{minAge} and age < #{maxAge}
]]>
</select>
2.5 利用注解@Param实现数据封装
2.5.1 编辑测试类
/**
* 知识点4:
* 利用注解实现数据的封装
*/
@Test
public void testFindByAge2(){
int minAge = 18;
int maxAge = 100;
List<User> userList = userMapper.findUserByAge2(minAge,maxAge);
System.out.println(userList);
}
2.5.2 编辑接口文件
//原则:Mybatis只支持单值传参 将多值封装为单值
//注解:@Param("key") int minAge(值)
// 作用:将数据封装为Map
List<User> findUserByAge2(@Param("minAge") int minAge, @Param("maxAge") int maxAge);
2.5.3 编辑xml映射文件
<select id="findUserByAge2" resultType="User">
<![CDATA[
select * from demo_user
where age > #{minAge} and age < #{maxAge}
]]>
</select>
2.6 模糊查询
2.6.1 业务需求
查询name字段中包含"君"的用户
Sql语句:.
SELECT * FROM demo_user WHERE NAME LIKE "%君%"
2.6.2 编辑测试方法
/**
* 知识点5:
* 利用注解实现数据的封装
*/
@Test
public void testFindUserByLike(){
String name = "%" + "君" + "%";
List<User> userList = userMapper.findUserByLike(name);
System.out.println(userList);
}
2.6.3 编辑接口方法
List<User> findUserByLike(String name);
2.6.4 编辑xml映射文件
<!--模糊查询 特别注意表名的大小写问题!!!!!
windows系统中: 不区分大小写
Linux系统中: 区分大小写问题.
-->
<select id="findUserByLike" resultType="User">
SELECT * FROM demo_user WHERE NAME LIKE #{name}
</select>
方式2: xml配置文件动态拼接%
<!--模糊查询 特别注意表名的大小写问题!!!!!
windows系统中: 不区分大小写
Linux系统中: 区分大小写问题.
语法: "%" 这样的方式
-->
<select id="findUserByLike" resultType="User">
SELECT * FROM demo_user WHERE NAME LIKE "%"#{name}"%"
</select>
2.7 Sql标签用法
2.7.1 业务需求
说明: Sql语句中经常出现重复的数据.如果每次重复的内容都自己手写.则开发的效率低.
优化: 将公共的Sql进行抽取
优势: Sql标签可以节省代码
缺点: 可读性变差了, 如果是关联操作 则根据情况而定.
2.7.2 Sql标签用法
<!--模糊查询 特别注意表名的大小写问题!!!!!
windows系统中: 不区分大小写
Linux系统中: 区分大小写问题.
语法: "%" 这样的方式
-->
<select id="findUserByLike" resultType="User">
SELECT <include refid="tableColumn"/> FROM demo_user WHERE NAME LIKE "%"#{name}"%"
</select>
<!--Sql标签: 抽取公共的Sql语句 -->
<sql id="tableColumn">
id,name,age,sex
</sql>
2.8 Mybatis中的集合参数写法
2.8.1 业务需求
查询id=1,2,3,5,7的数据
select * from demo_user where id in (1,2,3,5,7........)
2.8.2 编辑测试类
//前端: URL?id=1,2,3,4,5 获取之后一般采用数组接收
@Test
public void testFindListByIn(){
int[] array = {1,2,3,5,7};
List<User> userList = userMapper.findListByIn(array);
System.out.println(userList);
}
2.8.3 编辑Mapper接口
List<User> findListByIn(int[] array);
2.8.4 编辑Mapper 映射文件
<!--
关于Mybatis的遍历的写法
foreach:
1. collection 需要遍历的集合
1.1 数组 关键字: array/list
1.2 list集合 关键字: list/array
1.3 Map<key,array/list> 关键字:key
2. open/close 循环体的开始和结束 可以写到循环之外简化标签
3. item 当前遍历数据的变量名
4. separator 分割符
-->
<select id="findListByIn" resultType="User">
select * from demo_user where id in (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</select>
2.9 用户新增
2.9.1 编辑测试方法
@Test
public void testInsertUser(){
User user = new User();
user.setName("张三").setAge(18).setSex("男");
userMapper.saveUser(user);
System.out.println("新增成功!!!!");
}
2.9.2 编辑接口方法
void saveUser(User user);
2.9.3 编辑xml映射文件
<insert id="saveUser">
insert into demo_user(id,name,age,sex)
value (null, #{name},#{age},#{sex})
</insert>