mybatis
1. MyBatis数据框架介绍
MyBatis是一个半自动的ORM持久层框架,需要提供包含SQL、映射规则、POJO的映射文件。
MyBatis的基本构成
- SqlSessionFactoryBuilder:根据配置信息来生成工厂接口SqlSesionFactory
- SqlSesionFactory:依靠工厂来生成SqlSession会话
- SqlSession:可以发送SQL去执行并返回结果,也可以获取Mapper的接口
- SQL Mapper:给出对应的SQL和映射规则,发送SQL去执行并返回结果
2. MyBatis全局配置文件
mybatis全局配置文件的标签结构:
<!-- 配置 -->
<configuration>
<!-- 属性 -->
<properties></properties>
<!-- 设置 -->
<settings>
<setting name="" value=""/>
</settings>
<!-- 类型别名 -->
<typeAliases></typeAliases>
<!-- 类型处理器 -->
<typeHandlers></typeHandlers>
<!-- 对象工厂 -->
<objectFactory type=""></objectFactory>
<!-- 插件 -->
<plugins>
<plugin interceptor=""></plugin>
</plugins>
<!-- 环境配置 -->
<environments default="">
<!-- 环境变量 -->
<environment id="">
<!-- 事务管理 -->
<transactionManager type=""></transactionManager>
<!-- 数据源 -->
<dataSource type=""></dataSource>
</environment>
</environments>
<!-- 数据库厂商标识 -->
<databaseIdProvider type=""></databaseIdProvider>
<!-- 映射器 -->
<mappers></mappers>
</configuration>
- properties:用于引入外部properties配置文件信息
- settings:对mybatis运行时的行为进行设置,如是否开启缓存、延迟加载等
- typeAliases:用于为java类设置别称
- typeHandlers:将预处理语句的参数或结果集转换成java类
- objectFactory:将查询的结果分装到对应的对象中
- plugins:配置插件
- environments:配置多个数据源信息
- environment:配置一个具体的数据源信息
- transactionManager:配置事务管理器
- dataSource:配置具体的数据库连接信息
- databaseIdProvider:支持的数据库类型
- mappers:要扫描的sql映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD com.Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<!-- 设置等待数据库响应秒数 -->
<setting name="defaultStatementTimeout" value="5"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com.mybatis.demo.mapper.UserMapper.xml"/>
<!-- 批量注册 -->
<package name="com.mybatis.demo.mapper"/>
</mappers>
</configuration>
3. Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD com.Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<select id="selectUser" parameterType="String" resultType="com.mybatis.demo.pojo.User" databaseId="mysql">
select * from user where id = #{id}
</select>
</mapper>
MyBatis实现简单的用户管理系统,有新增用户、更新用户、删除用户、查询用户的功能。
创建maven项目,导入springboot和mybatis相关依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
编辑application.yml配置文件:
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/JDBCTest01?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
username: root
password: 123456
mybatis:
type-aliases-package: com.demo.springbootmybatis.pojo
mapper-locations: classpath:/mapper/*.xml
logging:
file:
name: log/log.log
level:
root: info
com.demo.springbootmybatis: debug
新增pojo类:
package com.demo.springbootmybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
String name;
String id;
int age;
}
编写DAO接口:
package com.demo.springbootmybatis.dao;
import com.demo.springbootmybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserDao {
void insertUser(User user);
void updateUser(User user);
User selectUser(String id);
void deleteUser(String id);
}
编写Service接口:
package com.demo.springbootmybatis.service;
import com.demo.springbootmybatis.pojo.User;
public interface UserService {
void insertUser(User user);
void updateUser(User user);
User selectUser(String id);
void deleteUser(String id);
}
编写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">
<mapper namespace="com.demo.springbootmybatis.dao.UserDao">
<select id="selectUser" parameterType="String" resultType="com.demo.springbootmybatis.pojo.User">
select * from user where id = #{id}
</select>
<insert id="insertUser" parameterType="com.demo.springbootmybatis.pojo.User">
insert into user values (#{name}, #{id}, #{age})
</insert>
<update id="updateUser" parameterType="com.demo.springbootmybatis.pojo.User">
update user set name = #{name} , age = #{age} where id = #{id}
</update>
<delete id="deleteUser" parameterType="com.demo.springbootmybatis.pojo.User">
delete from user where id = #{id}
</delete>
</mapper>
Service实现类:
package com.demo.springbootmybatis.service.impl;
import com.demo.springbootmybatis.dao.UserDao;
import com.demo.springbootmybatis.pojo.User;
import com.demo.springbootmybatis.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void insertUser(User user) {
userDao.insertUser(user);
log.info("新增了用户{}", user);
}
@Override
public void updateUser(User user) {
userDao.updateUser(user);
log.info("更新了用户{}", user);
}
@Override
public User selectUser(String id) {
User user = userDao.selectUser(id);
log.info("查询结果:{}", user);
return user;
}
@Override
public void deleteUser(String id) {
userDao.deleteUser(id);
log.info("删除id为{}的用户成功", id);
}
}
编写控制层:
package com.demo.springbootmybatis.controller;
import com.demo.springbootmybatis.pojo.User;
import com.demo.springbootmybatis.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/insert")
public String insertUser(String name, String id, int age) {
User user = new User(name, id, age);
log.info("即将插入新用户{}", user);
userService.insertUser(user);
return "新增用户成功!";
}
// http://localhost:8080/user/insert?name=Dinasour&id=111&age=22222
@RequestMapping("/update")
public String updateUser(String name, String id, int age) {
User user = new User(name, id, age);
log.info("即将更新id为{}的用户", id);
userService.updateUser(user);
return "更新用户成功!";
}
// http://localhost:8080/user/update?name=Pig&id=111&age=3
@RequestMapping("/select")
public String selectUser(String id) {
log.info("即将查找id{}", id);
User user = userService.selectUser(id);
if(user == null) {
return "没有符合条件的用户!";
}
return user.toString();
}
// http://localhost:8080/user/select?id=111
@RequestMapping("/delete")
public String deleteUser(String id) {
log.info("即将删除id{}", id);
userService.deleteUser(id);
return "删除用户成功!";
}
// http://localhost:8080/user/delete?id=111
}