一.写在前面
为了避免重复造轮子,项目创建的全过程可以参考如下链接
https://blog.csdn.net/weixin_44586943/article/details/107433966
二、启动报错
参考如上链接的时候,报了两个错,一个是Whitelabel Error Page,一个是SQL的错误,解决方法的参考网址如下
https://blog.csdn.net/drose29/article/details/89351919
https://blog.csdn.net/qq_43285534/article/details/108792823
三、Mybatis的原理
Mybaties其实就是对JDBC进行了封装,所以了解Mybaties原理,必须要先了解JDBC原理
3.1 JDBC的原理 (mybatis是对JDBC的封装)
1.注册和加载数据库驱动
class.forName(com.mysql.jdbc.Driver")
2.获取数据库连接 :
3.获取语句执行对象,然后执行SQL语句 获取执行结果,最后释放资源
既可以通过createStatement()方法来获取Statement对象
也可以调用prepareStatement()方法获得PrepareStatement,这个可以防止数据库注入
4.四个核心的对象
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表
3.2 Mybatis的工作原理
一句话描述:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。
四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
上面中流程就是MyBatis内部核心流程,每一步流程的详细说明如下文所述:
(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。
(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
UserMapper.xml中的注意点
<namespace>这里填写的是UserMapper接口的位置</namespace>
<select id =”方法的名字 ” resultType=”返回的类型” parameterType=”入参的格式”>
Bean的字段少于数据库的字段时,bean中没有的字段返回结果就不展示
Bean的字段大于数据库字段时,bean中多出来的字段返回结果不展示
当bean中的字段的名字和数据库一致,但是类型不一致的时候,解析结果会报错,类型不匹配
参考链接:
-
关于原理以下的老哥写的比较明白
https://blog.csdn.net/leisurelen/article/details/105997388 -
mybatis的面试总结
https://blog.csdn.net/a745233700/article/details/80977133 -
mybaties的原理其他网址
https://www.cnblogs.com/scuury/p/10371246.html
http://www.mybatis.cn/archives/821.html
四 SpringBoot + mybaties搭建一个项目,创建的过长不再赘述,参考上面的链接
目录结构
每个类的代码
UserController.java
@RestController
public class UserController {
@Autowired
private UserService userMapper;
@RequestMapping("test")
public String findAll() {
return "xlm:" + JSONArray.toJSONString(userMapper.findAll());
}
@RequestMapping("test2")
public String findAll2() {
return "注解:" + JSONArray.toJSONString(userMapper.findAll2());
}
}
UserMapper.java
@Mapper
@Repository
public interface UserMapper {
/**
* xml映射方式
*
* @return user
*/
List<User> findAll();
/**
* 注解方式
*
* @return user
*/
@Select("select * from user")
List<User> findAll2();
}
User.java
public class User {
public int age;
public String name;
public String password;
public String address;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
UserService.java
public interface UserService {
List<User> findAll();
List<User> findAll2();
}
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.findAll();
}
@Override
public List<User> findAll2() {
return userMapper.findAll2();
}
}
BootApplication.java
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
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.linxi.boot.mapper.UserMapper">
<select id="findAll" resultType="com.linxi.boot.model.User" parameterType="java.lang.Integer">
select * from user
</select>
</mapper>
Application.yaml
server:
port: 8888
spring:
datasource:
# url: jdbc:mysql://localhost:3306/java_study1?serverTimezone=UTC
url: jdbc:mysql://localhost:3306/java_study1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath*:mapper/*.xml
点击启动类进行启动,并在浏览器访问