Mybatis 简介
MyBatis 历史
MyBatis 特性
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录
MyBatis 是一个 半自动的 ORM(Object Relation Mapping)框架
1、在 Maven 项目中使用 Mybatis
先创建一个普通的 Maven 项目,然后在 pom.xml 文件中引入 Mybatis 的依赖,因为要连接数据库,所以还需要引入数据库连接的依赖
copy 1 <dependencies>
2 <dependency>
3 <groupId>org.mybatis</groupId>
4 <artifactId>mybatis</artifactId>
5 <version>3.5.10</version>
6 </dependency>
7 <dependency>
8 <groupId>mysql</groupId>
9 <artifactId>mysql-connector-java</artifactId>
10 <version>8.0.33</version>
11 </dependency>
12 </dependencies>
复制代码
要使用 Mybatis 需要配置 Mybatis 的核心配置,在 resources 资源文件夹下创建一个 mybatis 配置文件(名字随意),并写入配置,配置参考 Mybatis 官方文档mybatis – MyBatis 3 | 入门
在数据源<dataSource>的配置中,配置好 driver,url,username,password
copy 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <environments default="development">
7 <environment id="development">
8 <transactionManager type="JDBC"/>
9 <dataSource type="POOLED">
10 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
11 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
12 <property name="username" value="root"/>
13 <property name="password" value="root"/>
14 </dataSource>
15 </environment>
16 </environments>
17 <!--<mappers>
18 <mapper resource="org/mybatis/example/BlogMapper.xml"/>
19 </mappers>-->
20 </configuration>
复制代码
习惯上命名为mybatis-config.xml
,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。 核心配置文件主要用于配置连接数据库的环境以及 MyBatis 的全局配置信息 核心配置文件存放的位置是 src/main/resources 目录下
现在需要一个数据库和表和一些数据用做连接测试
1 CREATE DATABASE IF NOT EXISTS `mybatis` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2
3 CREATE TABLE USER(
4 `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
5 `name` VARCHAR(100) COMMENT '姓名',
6 `age` TINYINT UNSIGNED COMMENT '年龄',
7 `gender` TINYINT UNSIGNED COMMENT '性别, 1:男, 2:女',
8 `phone` VARCHAR(11) COMMENT '手机号'
9 ) COMMENT '用户表';
10
11 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'白眉鹰王',55,'1','18800000000');
12 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'金毛狮王',45,'1','18800000001');
13 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'青翼蝠王',38,'1','18800000002');
14 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'紫衫龙王',42,'2','18800000003');
15 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明左使',37,'1','18800000004');
16 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明右使',48,'1','18800000005');
复制代码
构建整体项目结构 controller、service、mapper 三层架构,创建一个实体类对应数据库的表结构,创建 MyBatis 的映射文件 xxxMapper.xml
在 resources 文件目录下创建 mapper 的时候需要和 main 文件目录下的 mapper 同包名,在创建 directory 的时候,目录结构不能使用点,而是用/代替
User 实体类中的属性需要和表中的字段名相对应,这里也可以用 Lombok 注解
mapper 接口的全类名和映射文件的命名空间(namespace)保持一致、mapper 接口中方法的方法名和映射文件中编写 SQL 的标签的 id 属性保持一致
然后在 mapper 中写我们需要的语句,查询语句用<select>、增加语句用<insert>、删除语句用<delete>、修改语句用<update>标签,返回类型 resultType 要和实体类中的实体类名称对应
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6 <mapper namespace="mapper.UserMapper">
7
8 <select id="selectAll" resultType="pojo.User">
9 SELECT id, name, age, gender, phone FROM user
10 </select>
11 </mapper>
复制代码
写好了之后回到 mybatis-config.xml 中配置一下 mapper 映射
在 UserMapper 中将 UserMapper.xml 中配置好的方法声明一下,方法名要和上面的 id 对应上
在 service 层写好业务逻辑代码,在接口中声明方法,在实现类中实现方法
1 public class UserServiceImpl implements UserService {
2
3 @Override
4 public List<User> selectAll() throws IOException {
5 //读取MyBatis的核心配置文件
6 InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
7 //获取SqlSessionFactoryBuilder对象
8 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
9 //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
10 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
11 //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
12 SqlSession sqlSession = sqlSessionFactory.openSession();
13 //通过代理模式创建UserMapper接口的代理实现类对象
14 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
15 //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
16 List<User> users = mapper.selectAll();
17 return users;
18 }
19 }
复制代码
在 controller 层中写好处理结果代码
1 public class UserController {
2 private UserService userService = new UserServiceImpl();
3
4 public void selectAll() throws IOException {
5 List<User> users = userService.selectAll();
6 users.forEach(System.out::println);
7 }
8 }
复制代码
创建一个 Test 类去测试 mybatis 数据库连接,因为没有引入单元测试依赖,所以这里用主函数去测试
发现结果成功输出打印
如果 SQL 语句比较简单,可以使用 mybatis 中的注解,查询语句用 @Select、增加语句用 @Insert、删除语句用 @Delete、修改语句用 @Update 注解
在里面写上 sql 语句,再运行发现,也可以查询成功。
当然,复杂一点的 sql 语句和动态 SQL 建议还是使用 Mapper 配置,只是简单的 sql 语句写在注解里面可以简化,复杂的 sql 只会增加代码的复杂度
总结
在 Maven 项目中,使用 mybatis 需要先导入 mybatis 依赖和连接数据库的依赖,然后创建 mybatis 配置文件,在配置文件中配置数据源细信息,随后创建 MyBatis 的映射文件 Mapper,在 mapper 文件中写好对应的语句,然后在业务层进行 SqlSession 连接,调用 mapper 中的方法,再在 controller 层处理返回方法。
2、用 Spring 框架整合 Mybatis
同样的先创建一个 Maven 项目,然后在 pom.xml 文件中引入 Spring 的依赖,Mybatis 的依赖,数据库连接依赖,druid 连接池依赖,spring-mybatis 依赖,spring-jdbc 依赖。
1 <dependencies>
2 <dependency>
3 <groupId>org.mybatis</groupId>
4 <artifactId>mybatis</artifactId>
5 <version>3.5.10</version>
6 </dependency>
7 <dependency>
8 <groupId>mysql</groupId>
9 <artifactId>mysql-connector-java</artifactId>
10 <version>8.0.33</version>
11 </dependency>
12 <dependency>
13 <groupId>org.springframework</groupId>
14 <artifactId>spring-context</artifactId>
15 <version>5.3.30</version>
16 </dependency>
17 <dependency>
18 <groupId>com.alibaba</groupId>
19 <artifactId>druid</artifactId>
20 <version>1.2.20</version>
21 </dependency>
22 <dependency>
23 <groupId>org.mybatis</groupId>
24 <artifactId>mybatis-spring</artifactId>
25 <version>1.3.2</version>
26 </dependency>
27 <dependency>
28 <groupId>org.springframework</groupId>
29 <artifactId>spring-jdbc</artifactId>
30 <version>5.3.2</version>
31 </dependency>
32 </dependencies>
复制代码
构建整体项目结构
2.1、基于 XML 整合 Mybatis
和上面步骤相同,编写 Mapper 和 Mapper.xml,一定要放在相同路径下
在 UserMapper.xml 中写我们需要的语句,并在 UserMapper 接口中写对应 id 的方法声明;
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6 <mapper namespace="mapper.UserMapper">
7
8 <select id="selectAll" resultType="pojo.User">
9 SELECT id, name, age, gender, phone FROM user
10 </select>
11 </mapper>
复制代码
public interface UserMapper {
List<User> selectAll();
}
复制代码
同样的,简单的 SQL 语句也可以用 @Select 注解编写,不需要 UserMapper.xml 配置
在 Spring 配置文件中配置 SqlSessionFactoryBean
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
7 <bean class="org.mybatis.spring.SqlSessionFactoryBean">
8 <property name="dataSource" ref="dataSource"></property>
9 </bean>
10
11 <!--配置数据源信息-->
12 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
13 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
14 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"></property>
15 <property name="username" value="root"></property>
16 <property name="password" value="root"></property>
17 </bean>
18 </beans>
复制代码
对应的是之前配置文件中的
1 <dataSource type="POOLED">
2 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
3 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
4 <property name="username" value="root"/>
5 <property name="password" value="root"/>
6 </dataSource>
复制代码
在 Spring 配置文件中配置 MapperScannerConfigurer
1 <!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
3 <property name="basePackage" value="mapper"></property>
4 </bean>
复制代码
对应的是
1 <mappers>
2 <package name="com.tedu.mapper"/>
3 </mappers>
复制代码
在 Spring 配置文件中配置好之后,在使用的时候就不用手动创建了,直接注入即可。
在 UserServiceImpl 属性中添加 UserMapper,并为其添加 setter 方法用于注入。
1 public class UserServiceImpl implements UserService {
2 private UserMapper userMapper;
3
4 public void setUserMapper(UserMapper userMapper) {
5 this.userMapper = userMapper;
6 }
7
8 @Override
9 public List<User> selectAll() {
10 return userMapper.selectAll();
11 }
12 }
复制代码
同样,在 UserController 属性中添加 UserService,并为其添加 setter 方法用于注入。在 selectAll 方法中处理返回的结果。
1 public class UserController {
2 private UserService userService;
3
4 public void setUserService(UserService userService) {
5 this.userService = userService;
6 }
7
8 public void selectAll(){
9 List<User> users = userService.selectAll();
10 users.forEach(System.out::println);
11 }
12 }
复制代码
在 Spring 配置文件中配置上述 UserService 和 UserController 用于注入
1 <bean id="userServiceImpl" class="service.impl.UserServiceImpl">
2 <property name="userMapper" ref="userMapper"></property>
3 </bean>
4
5 <bean id="userContorller" class="controller.UserController">
6 <property name="userService" ref="userServiceImpl"></property>
7 </bean>
复制代码
最后创建一个测试类进行数据库连接测试
1 public class TestSelectAll {
2 public static void main(String[] args) {
3 ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
4 UserController userController = context.getBean(UserController.class);
5 userController.selectAll();
6 }
7 }
复制代码
可以在控制台看到打印的结果
总结
基于 XML 方式整合 Mybatis 首先需要创建 Spring 的配置文件,在 XML 配置文件中去配置 bean,将 bean 对象交由 Spring 容器管理,其余的 mapper 和普通方法一样。需要配置数据源 DataSource,配置 SqlSessionFactoryBean、配置 MapperScannerConfigurer,再配置 UserMapper、UserService 和 UserController。在测试类中用 ClassPathXmlApplicationContext 和 getBean 获取到 UserContorller 对象再调用其方法即可。这种方式不用编写 mybatis-config.xml 配置文件,在 Spring 配置文件中全部配置了,虽然简化了部分操作,但是还是较为繁琐,下面讲一种用注解方式整合 mybatis。
2.2、基于注解整合 Mybatis
导入和上述基于 XML 整合 mybatis 方法相同的依赖
再构建同样的项目结构
还需要在 resources 资源目录下面添加一个配置文件用于存放数据源配置信息
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3307/mybatis
复制代码
除了像上面方法构建的项目结构之外,还需要一个配置类进行配置
1 @Configuration
2 @ComponentScan("cn.test")
3 @PropertySource("classpath:jdbc.properties")
4 @MapperScan("cn.test.mapper")
5 public class MybatisConfig {
6
7 @Bean
8 public DataSource dataSource(
9 @Value("${jdbc.driver}") String driver,
10 @Value("${jdbc.username}") String username,
11 @Value("${jdbc.password}") String passwrod,
12 @Value("${jdbc.url}") String url
13 ){
14 DruidDataSource dataSource = new DruidDataSource();
15 dataSource.setDriverClassName(driver);
16 dataSource.setUsername(username);
17 dataSource.setPassword(passwrod);
18 dataSource.setUrl(url);
19 return dataSource;
20 }
21
22 @Bean
23 public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){
24 SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
25 sqlSessionFactoryBean.setDataSource(dataSource);
26 return sqlSessionFactoryBean;
27 }
28 }
复制代码
@Configuration 注解是声明该类是一个配置类
@ComponentScan 注解是包扫描,扫描该包和该包的子孙包中的类带有 @Component 注解的类,交由 Spring 容器管理
@PropertySource 注解是设置资源文件目录,classpath 后是 properties 文件的路径,加载后可以用 ${}占位符获取 properties 文件中的属性
@MapperScan 注解是设置 Mapper 文件扫描,相当于 mybatis 配置文件中<mapper>标签
配置文件中用 @Bean 注解配置非自定义 Bean 的配置,在 dataSource 方法中传入连接数据库四要素并且用 @Value 注解去注入值,其中用 ${}占位符获取 properties 文件中的属性,最后方法返回 dataSource,同样的用 sqlSessionFactoryBean 方法 sqlSessionFactoryBean,在参数中用 @AutoWried 注入 dataSource 参数,其中 @AuroWired 注解可省略,最后方法返回 sqlSessionFactoryBean。
这样,在 Config 配置文件中就完成了 SqlSessionFactoryBean 和 MapperScannerConfigurer 的配置
接下来就是编写 UserMapper 和 UserMapper.xml 文件,这里就不在用 XML 配置文件进行演示,如需要,上面的其他方法都有演示,这里就用注解的方式编写 SQL 语句。
随后,编写三层架构的代码,在 UserController 中,用 @AuroWired 注解自动注入 UserService,并且在类上加上 @Controller 注解,表示该类是 Contriller 层类并交由 Spring 容器管理
1 @Controller
2 public class UserController {
3 @Autowired
4 private UserService userService;
5
6 public void findAll() {
7 List<User> all = userService.findAll();
8 all.forEach(System.out::println);
9 }
10 }
复制代码
在 UserServiceImpl 中用,@AuroWired 注解自动注入 UserMapper,并且在类上加上 @Service 注解,表示该类是 Service 层类并交由 Spring 容器管理
1 @Service
2 public class UserServiceImpl implements UserService {
3
4 @Autowired
5 private UserMapper userMapper;
6 @Override
7 public List<User> findAll() {
8 return userMapper.findAll();
9 }
10 }
复制代码
在 UserMapper 中,编写 SQL 方法,用 @Select 注解编写 SQL 语句,因为在配置文件中加了 @MapperScan("cn.test.mapper")注解,所以在此类上不需要加任何 Component 注解
1 public interface UserMapper {
2 @Select("SELECT id, name, age, gender, phone FROM user")
3 List<User> findAll();
4 }
复制代码
最后,编写测试方法进行数据库连接测试
1 public class TestAnnoMyBatis {
2 public static void main(String[] args) {
3 ApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);
4 UserController userController = context.getBean(UserController.class);
5 userController.findAll();
6 }
7 }
复制代码
在测试方法中用 AnnotationConfigApplicationContext 方法加载 MybatisConfig 配置文件,同样在控制台中可以看到成功输出结果
总结
基于注解整合 Mybatis 方法中,我们不需要配置任何 XML 文件,其他操作基本相同,只需要新增一个配置文件,在配置文件中用一些注解和方法去完成配置。同时,在管理 Bean 时,也是用注解去自动装配,交由 Spring 容器去管理。大大简化了配置。
3、SpringBoot 整合 Mybatis
用 SpringBoot 框架整合 Mybatis 相对就较为简单了
首先创建于一个 SpringBoot 项目
在勾选依赖的时候,需要勾选 MyBatisFarmework 依赖和 MySql 依赖进行数据的连接和 Mybatis 的使用
创建完成之后在 application.properties 配置文件中配置数据源
spring.datasource.url=jdbc:mysql://localhost:3307/mybatis?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
复制代码
然后在 UserMapper 中开始写 SQL 语句
1 @Mapper
2 public interface UserMapper {
3
4 @Select("SELECT id, name, age, gender, phone FROM user")
5 List<User> userList();
6 }
复制代码
一定要在 UserMapper 类上加上 @Mapper 注解,@Mapper 注解是识别他为 mybatis 的 mapper 接口,会自动的把 加 @Mapper 注解的接口生成动态代理类。
同样的,在 UserService 中用 @AutoWired 对 UserMapper 进行注入,并在该类上加上 @Service 注解
1 @Service
2 public class UserServiceImpl implements UserService {
3 @Autowired
4 private UserMapper userMapper;
5
6 public List<User> userList(){
7 return userMapper.userList();
8 }
9 }
复制代码
在 UserController 中用 @AutoWired 对 UserService 进行注入并处理返回的结果,并在该类上加上 @Controiller 注解
1 @Controller
2 public class UserController {
3 @Autowired
4 private UserService userService;
5
6 public void userList(){
7 List<User> users = userService.userList();
8 users.forEach(System.out::println);
9 }
10 }
复制代码
最后在 SpringBoot 的测试类中写一个测试方法进行数据库连接的测试
1 @SpringBootTest
2 class SpringBootMybatisApplicationTests {
3
4 @Autowired
5 private UserController userController;
6 @Test
7 public void test(){
8 userController.userList();
9 }
10
11 }
复制代码
可以看到控制台成功输出结果
总结
使用 SpringBoot 框架整合 Mybatis 更为简单,只需要在 application.properties 配置文件中配置数据源四要素就行,随后就可以直接在 Mapper 中写 SQL 语句,最后可以在 SpringBootTest 类中直接进行测试。
文章转载自:琮墨
原文链接:https://www.cnblogs.com/congmo/p/17835799.html
评论