MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1 创建数据库
create database db_mybatis; use db_mybatis; create table t_books( id int auto_increment primary key, name varchar(30) null, author varchar(20) null )default charset=utf8; insert into t_books(name,author) values('Java程序设计','张三丰'); insert into t_books(name,author) values('微信小程序开发','张无忌'); select * from t_books;
2 创建项目
首先创建一个SpringBoot工程,添加Web、MyBatis、MySQL依赖,方法如下。
创建项目时,在项目的Dependencies中勾选SQL下的MySQL Driver、MyBatis Framework,Web下的Spring Web即可。
创建完成后,项目的目录结构如下图所示:
项目的依赖代码如下所示,即pom.xml中依赖部
<dependencies> <!--SpringWeb依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MyBatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!--MySQL驱动依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
3 基本配置
3.1 配置数据库连接信息
在src/main/resources下的application.properties文件中配置数据库连接信息,这处与JdbcTemplate相同,代码如下:
spring.datasource.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.2 配置mybatis
在src/main/resources下新建mybatis-config.xml文件,文件内容如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--导入外部配置文件--> <properties resource="application.properties"/> <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="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!-- 配置Mapper.xl文件的路径 <mapper resource="com/sky/demo/dao/AccountMapper.xml" /> --> <package name="com.example.mybatisdemo.dao"/> </mappers> </configuration>
在该配置文件中有,两个需要注意的,一个是数据库的连接信息,是从外部配置文件中取得的,所以需要导入外部配置文件;另一个是配置Mapper映射文件的路径,有两种方式,一是为每一个Mapper文件配置,另一是配置Mapper文件的包路径。
4 访问数据库基本操作
4.1 创建SqlSessionFactory
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory的实体可以通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。此处的XML文件即上面配置mybatis-config.xml文件。然后创建工具类,取得SqlSession对象。
在com.example.mybatisdemo包中创建util包,在包中创建DBUtil类,代码如下:
package com.example.mybatisdemo.tool; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /** * ClassName:DBUtil * Description:从mybatis-config.xml中建出SqlSessionFactory的实例 * date:2021/1/12 8:27 * * @author Administrator * @since JDK 1.8 */ public class DBUtil { private static SqlSessionFactory sqlSessionFactory; static{ String resource="mybatis-config.xml"; try { InputStream in= Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } }
4.2 创建POJO实体类
创建相应的POJO实体类与数据库的数据表进行对应。例如在数据库中有数据表t_books,则创建对应的类。
在com.example.mybatisdemo包下新建包entity,然后在该包下创建Book类,该类与t_books数据表对应,其中属性的名称为了简单,与数据表中的字段名一致。代码如下,
package com.example.mybatisdemo.entity; /** * ClassName:Book * Description:与数据表t_books对应 * date:2021/1/12 8:35 * * @author Administrator * @since JDK 1.8 */ public class Book { private Integer id; private String name; private String author; //此处省略了setter和getter }
4.3 采用接口的方式创建Mapper映射
在com.example.mybatisdemo.dao包中创建接口IBookMapper文件,代码如下:
package com.example.mybatisdemo.dao; import com.example.mybatisdemo.entity.Book; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; /** * ClassName:IBookMapper * Description: * date:2021/1/12 8:39 * * @author Administrator * @since JDK 1.8 */ public interface IBookMapper { /** * 查询所有书籍信息 * @return 所有书籍信息的List集合 */ @Select("select * from t_books") @Results({ @Result(property = "id",column = "id"), @Result(property = "name",column = "name"), @Result(property = "author",column = "author") }) public List<Book> getBooks(); }
4.4 编写控制层代码
在com.example.mybatisdemo下创建controller包,在包上新建BookController类,代码如下:
package com.example.mybatisdemo.controller; import com.example.mybatisdemo.dao.IBookMapper; import com.example.mybatisdemo.entity.Book; import com.example.mybatisdemo.tool.DBUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * ClassName:BookController * Description: * date:2021/1/12 8:46 * * @author Administrator * @since JDK 1.8 */ @RestController @RequestMapping("/book/*") public class BookController { private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class); @RequestMapping("books") @ResponseBody public List<Book> showBooks(){ List<Book> books=iBookMapper.getBooks(); return books; } }
5 启动程序,测试
启动程序后,在浏览器地址栏输入
http://localhost:8080/book/books
后发现程序出错了,错误信息如下所示:
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver} ### The error may exist in com/example/mybatisdemo/dao/IBookMapper.java (best guess) ### The error may involve com.example.mybatisdemo.dao.IBookMapper.getBooks ### The error occurred while executing a query ### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver}] with root cause java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver} at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:244) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:223) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:219) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:432) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89) ~[mybatis-3.5.6.jar:3.5.6]
根据错误信息的提示,应该是找不到数据源driver等信息,修改mybatis-config.xml配置件如下 :
<dataSource type="POOLED"> <property name="driver" value="${spring.datasource.driver-class-name}"/> <property name="url" value="${spring.datasource.url}"/> <property name="username" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> </dataSource>
再次启动程序,浏览结果如下
至此,即实现了SpringBoot与MyBatis的整合。在以上的程序中,并没分为数据访问层、业务层、控制层,控制器部分仅仅是实现前端UI与后端的交互或前端UI间跳转,并不进行业务处理,因此,增加业务层。
6 业务层
在com.example.mybatisdemo包中新建service包,在包中新建BookService类,将原控制器中的代码提取到service包中相关的类中。代码如下:
package com.example.mybatisdemo.service; import com.example.mybatisdemo.dao.IBookMapper; import com.example.mybatisdemo.entity.Book; import com.example.mybatisdemo.tool.DBUtil; import org.springframework.stereotype.Service; import java.util.List; /** * ClassName:BookService * Description:Book类的业务逻辑 * date:2021/1/12 10:08 * * @author Administrator * @since JDK 1.8 */ @Service public class BookService { private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class); /** * 取得所有书籍信息 * @return 所有书籍信息的List集合 */ public List<Book> getBooks(){ return iBookMapper.getBooks(); } }
BookController修改如下:
@RestController @RequestMapping("/book/*") public class BookController { @Autowired private BookService bookService; @RequestMapping("books") @ResponseBody public List<Book> showBooks(){ List<Book> books=bookService.getBooks(); return books; } }
至此,SpringBoot整合MyBatis基本完成。