文章目录
- 1. Mybatis-驼峰映射
- 1.1 案例演示
- 1.2 驼峰规则说明
- 2. Mybatis 缓存机制
- 2.1 缓存概念
- 2.2 Mybatis 提供缓存机制
- 2.3 一级缓存测试
- 2.4 二级缓存测试
- 2.4.1 指定使用二级缓存
- 2.4.2 二级缓存测试
- 2.4.3 注意事项
- 3. SpringBoot整合Mybatis
- 3.1 创建项目
- 3.2 修改pom.xml文件
- 3.3 代码结构
- 3.4 SpringBoot整合Mybatis
- 3.4.1 编辑application.yml
- 3.4.2 将Mapper接口交给容器管理
- 3.4.3 Mybatis 单元测试案例
- 3.5 关于Mapper接口对象的说明
- 3.5.1 代理方式介绍
- 3.5.1.1 JDK动态代理
- 6.5.1.2 CGLIB动态代理
- 3.6 SSM框架案例
- 3.6.1 业务需求
- 3.6.2 框架关系图
- 3.6.3 层级代码实现
- 3.6.4 编辑UserController
- 3.6.5 编辑UserService
- 3.6.5 编辑UserService
- 3.6.6 编辑UserMapper
- 3.6.7 页面效果展现
- 4. 框架代码案例练习
- 4.1 根据ID查询数据
- 4.1.1 需求说明
- 4.1.2 编辑UserController
- 4.1.3 编辑UserService
- 4.1.4 编辑UserMapper
- 4.1.5 页面效果展现
- 4.2 根据age和sex查询数据
- 4.2.1 业务需求
- 4.2.2 编辑UserController
- 4.2.3 编辑UserService
- 4.2.4 编辑UserMapper
- 4.3.1 业务需求
- 4.3.2 编辑UserController
- 4.3.2 编辑UserService
- 4.3.2 编辑UserMapper
1. Mybatis-驼峰映射
1.1 案例演示
问题说明: 工作中使用驼峰规则的定义的场景比较多的.但是如果每个属性都需要自己手动的封装,则比较繁琐. 所以框架应该提供自动映射的功能.
1.2 驼峰规则说明
- 官网描述:
- 设置settings
<!--配置settings信息-->
<settings>
<!--开启驼峰映射规则-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--type: POJO对象的路径 alias: 为当前的POJO对象起的别名-->
<!--<typeAlias type="com.jt.pojo.User" alias="User"/>-->
<!--设置别名包 -->
<package name="com.jt.pojo"/>
</typeAliases>
- 驼峰规则映射说明
<!--查询用户信息 开启驼峰映射规则
resultType:
1.适用与单表查询,同时要求属性名称与字段相同.
2.如果属性与字段满足驼峰命名规则,开启驼峰映射之后,
可以使用resultType
resultMap:
1.如果字段不一致时使用
2.多表关联查询时使用.
3.如果开启了驼峰映射规则, 则自动映射的属性可以省略,最好标识主键
4.如果使用驼峰规则映射时,需要映射封装对象时(一对一/一对多),默认条件下.驼峰规则失效.
可以使用: autoMapping="true" 要求开启驼峰映射.
5.默认条件下 一对一,一对多不会自动完成驼峰规则映射.
需要配置 autoMapping="true"才能自动映射
-->
<select id="getAll" resultMap="getEmpMap">
select e.emp_id,e.emp_name,
d.dept_id,d.dept_name
from emp e,dept d
where e.dept_id = d.dept_id
</select>
<resultMap id="getEmpMap" type="Emp" autoMapping="true">
<id column="emp_id" property="empId"/>
<!--其它属性自动映射-->
<!--实现部门映射-->
<association property="dept" javaType="Dept" autoMapping="true">
<id column="dept_id" property="deptId"/>
</association>
</resultMap>
2. Mybatis 缓存机制
2.1 缓存概念
如果有大量相同的请求查询数据库,则数据库需要执行多次重复的sql,那么并发压力高,查询效率低. 如果引入缓存机制,则可以极大的提升用户的查询的效率.
2.2 Mybatis 提供缓存机制
Mybatis中有2级缓存
一级缓存 SqlSession 在同一个sqlSession内部 执行多次查询 缓存有效. 一级缓存默认开启状态.
二级缓存 SqlSessionFactory级别. 利用同一个工厂,创建的不同的SqlSession 可以实现数据的共享(缓存机制). 二级缓存默认也是开启的.
2.3 一级缓存测试
结论: 利用同一个SqlSession,执行多次数据库操作, 则缓存有效.sql只执行一次.
@Test
public void testCache(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> list1 = empMapper.getAll();
List<Emp> list2 = empMapper.getAll();
List<Emp> list3 = empMapper.getAll();
sqlSession.close();
}
2.4 二级缓存测试
2.4.1 指定使用二级缓存
语法: 在各自的xml 映射文件中 指定缓存标签.
2.4.2 二级缓存测试
注意事项: sqlSession关闭之后,二级缓存才能生效
//测试二级缓存
@Test
public void testCache2(){
SqlSession sqlSession1 = sqlSessionFactory.openSession();
EmpMapper empMapper = sqlSession1.getMapper(EmpMapper.class);
List<Emp> list1 = empMapper.getAll();
sqlSession1.close(); //sqlSession使用之后必须关闭.否则二级缓存不生效.
//利用同一个SqlSessionFactory 创建不同的SqlSession
SqlSession sqlSession2 = sqlSessionFactory.openSession();
EmpMapper empMapper2 = sqlSession2.getMapper(EmpMapper.class);
List<Emp> list2 = empMapper2.getAll();
sqlSession2.close();
}
2.4.3 注意事项
如果需要使用一级/二级缓存,则POJO对象必须实现序列化接口. 否则数据不可以被缓存.
图解序列化规则:
3. SpringBoot整合Mybatis
3.1 创建项目
3.2 修改pom.xml文件
说明: 在新项目中添加依赖信息
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--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>
</dependencies>
3.3 代码结构
3.4 SpringBoot整合Mybatis
3.4.1 编辑application.yml
#配置端口号
server:
port: 8090
#管理数据源
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
#SpringBoot整合Mybatis
mybatis:
#指定别名包
type-aliases-package: com.jt.pojo
#扫描指定路径下的映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
3.4.2 将Mapper接口交给容器管理
- 通过@Mapper注解 管理对象
@Mapper //将Mapper接口交给Spring容器管理.
public interface UserMapper {
List<User> findAll();
}
- 通过包扫描的方式,管理mapper接口 编辑主启动类, 指定包扫描路径
@SpringBootApplication
//按照指定的包路径,扫描mapper的接口管理对象
@MapperScan("com.jt.mapper")
public class SpringbootSsmApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootSsmApplication.class, args);
}
}
3.4.3 Mybatis 单元测试案例
@SpringBootTest
class SpringbootSsmApplicationTests {
@Autowired //注入指定的对象
private UserMapper userMapper; //IDEA 编译提示 不影响执行
/**
* 测试SpringBoot整合Mybatis
*/
@Test
public void testfindAll(){
List<User> userList = userMapper.findAll();
System.out.println(userList);
}
}
3.5 关于Mapper接口对象的说明
解释:
- 将接口交给Spring容器管理,spring会根据class类型,动态的选择创建代理对象. 最终将代理对象交给spring容器管理.
- 代理对象的使用
3.5.1 代理方式介绍
3.5.1.1 JDK动态代理
特点:
- 要求被代理者,必须有接口.
- 默认条件下如果有接口,则使用JDK动态代理
6.5.1.2 CGLIB动态代理
特点:
- 不管被代理者是否有接口,都可以为其创建代理对象.
- 代理对象是目标对象的子类. 继承关系.
结论:
- Spring中如果有接口,默认使用JDK代理方式,如果没有接口,则默认使用CGLIB代理方式.
- Spring5以后,自身接口对象创建代理对象时,使用cglib
3.6 SSM框架案例
3.6.1 业务需求
用户访问URL: http://localhost:8090/findAll
返回值: List 的JSON串.
3.6.2 框架关系图
3.6.3 层级代码实现
3.6.4 编辑UserController
@RestController //@ResponseBody 将list集合转化为json
public class UserController {
@Autowired
private UserService userService;
/**
* URL: http://localhost:8090/findAll
* 参数: 无
* 返回值: List<User>
*/
@RequestMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}
3.6.5 编辑UserService
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.findAll();
}
}
3.6.5 编辑UserService
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.findAll();
}
}
3.6.6 编辑UserMapper
mapper接口
public interface UserMapper {
List<User> findAll();
}
mapper映射文件
<mapper namespace="com.jt.mapper.UserMapper">
<!--必须配置别名包-->
<select id="findAll" resultType="User">
select * from demo_user
</select>
</mapper>
3.6.7 页面效果展现
4. 框架代码案例练习
4.1 根据ID查询数据
4.1.1 需求说明
根据Id查询数据库
URL: http://localhost:8090/findUserById?id=1
返回值: User对象
4.1.2 编辑UserController
/**
* 需求: http://localhost:8090/findUserById?id=1
* 参数接收: id=1
* 返回值: User对象
*/
@RequestMapping("/findUserById")
public User findUserById(Integer id){
return userService.findUserById(id);
}
4.1.3 编辑UserService
@Override
public User findUserById(Integer id) {
return userMapper.findUserById(id);
}
4.1.4 编辑UserMapper
//注解和映射文件只能二选一
@Select("select * from demo_user where id = #{id}")
User findUserById(Integer id);
4.1.5 页面效果展现
4.2 根据age和sex查询数据
4.2.1 业务需求
URL: http://localhost:8090/findUserByAS
返回值: List集合封装.
4.2.2 编辑UserController
/**
* URL地址: http://localhost:8090/findUserByAS?age=18&sex=女
* 参数: age=18 sex=女
* 返回值: List<集合>
* 参数接收: 如果是多个参数,并且参数名称与属性名称一致,可以使用对象接收
*/
@RequestMapping("/findUserByAS")
public List<User> findUserByAS(User user){
return userService.findUserByAS(user);
}
4.2.3 编辑UserService
@Override
public List<User> findUserByAS(User user) {
return userMapper.findUserByAS(user);
}
4.2.4 编辑UserMapper
## 4.3 RestFul参数传递
4.3.1 业务需求
说明: 要求按照id修改数据
restFul请求路径: http://localhost:8090/updateById/1/黑熊精/3000/男
4.3.2 编辑UserController
/**
* URL: http://localhost:8090/updateById/1/黑熊精/3000/男
* 参数: 4个
* 返回值: "修改成功!!!!"
* restFul结构 参数分析 {属性名称}
* 参数接收:
* 1. 单个参数使用 @PathVariable Integer id接收
* 2. 如果多个参数接收 使用对象 mvc自动提供的功能.
*/
@RequestMapping("/updateById/{id}/{name}/{age}/{sex}")
public String updateById(User user){
userService.updateById(user);
return "用户修改成功";
}
4.3.2 编辑UserService
//spring整合mybatis之后,事务自动提交.
@Override
public void updateById(User user) {
userMapper.updateById(user);
}
4.3.2 编辑UserMapper
@Update("update demo_user set name=#{name},age=#{age},sex =#{sex} where id=#{id}")
void updateById(User user);