MyBatis框架的配置及其使用
1. 创建项目
创建新的项目,需要在pom.xml中添加多项依赖,首先,应该添加mybatis
依赖:
<!-- Mybatis框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
MyBatis本身是可以独立使用的,但是,推荐结合Spring框架一起使用,所以,还需要添加mybatis-spring
依赖:
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
整合后,框架的底层实现需要使用到spring-jdbc
的依赖:
<!-- Spring JDBC依赖,必须与其它Spring依赖使用完全相同的版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
注意:同一个项目中如果添加多个spring-
为前缀的依赖,这些依赖必须使用相同的版本!
由于本次将使用MySQL数据库,所以,还需要添加MySQL数据库连接的mysql-connector-java
依赖:
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
然后,还需要添加数据库连接池commons-dbcp
的依赖:
<!-- 数据库连接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
最后,在编程时,为了及时检测代码,还应该添加单元测试junit
的依赖:
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
所以,当前项目中需要添加的完整的依赖的代码是:
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!-- Spring JDBC依赖,必须与其它Spring依赖使用完全相同的版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<!-- Mybatis框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
<!-- Thymeleaf整合Spring -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 配置数据库连接
在src/main/resources/下创建db.properties配置文件,并在该文件中配置连接数据库的信息:
url=jdbc:mysql://localhost:3306/User?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Chongqing
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=2
maxActive=10
接下来,就需要在spring-dao.xml中读取以上配置信息,以便于后续可以通过Spring获取这些配置的值!所以,添加配置:
<!-- 读取db.properties的配置 -->
<util:properties id="config" location="classpath:db.properties"/>
以上读取到的配置将应用于获取数据库连接的数据源,所以,还需要在spring-dao.xml中配置BasicDataSource
:
<!-- 配置数据源 -->
<bean class="org.apache.commons.dbcp.BasicDataSource">
<!-- 以下注入属性的各节点中 -->
<!-- name的值是BasicDataSource中的属性值 -->
<!-- value的值是Spring表达式,config是以上读取配置文件的节点的id,右侧名称是db.properties中定义的属性名 -->
<property name="url" value="#{config.url}"/>
<property name="driverClassName" value="#{config.driver}"/>
<property name="username" value="#{config.username}"/>
<property name="password" value="#{config.password}"/>
<property name="initialSize" value="#{config.initialSize}"/>
<property name="maxActive" value="#{config.maxActive}"/>
</bean>
然后,执行单元测试:
public class Tests {
BasicDataSource dataSource;
@Test
public void getConnection() throws SQLException {
// 加载Spring配置文件,获得Spring容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("spring-dao.xml");
// 从Spring容器中获取对象
dataSource = ac.getBean("dataSource", BasicDataSource.class);
// 测试
System.out.println(dataSource.getConnection());
// 释放资源
ac.close();
}
}
3. 编写抽象方法
MyBatis框架要求抽象方法都必须声明在接口中,所以,先创建cn.tedu.mybatis
包,并在这个包中创建UserMapper
接口:
package cn.tedu.mybatis;
public interface UserMapper {
}
为了便于处理数据,应该将用户信息相关的属性封装为一个类,所以,在cn.tedu.mybatis
包下创建User
类,并且根据t_user
数据表的字段来设计User
类中的属性:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
// 生成SET/GET方法,toString()方法
}
然后,需要在接口中添加“插入用户数据”的抽象方法,关于MyBatis框架使用的抽象方法的声明原则:
- 如果即将执行的是INSERT、UPDATE、DELETE类型的操作,则使用
Integer
/int
作为返回值类型,表示受影响的行数,当然,如果不关心这个返回值,也可以将返回值类型声明为void
,但是,并不推荐; - 方法名称可以自定义;
- 参数列表可按需设计。
所以,在UserMapper
接口中添加“插入用户数据”的抽象方法:
package cn.tedu.mybatis;
public interface UserMapper {
Integer addnew(User user);
}
完成后,还需要在spring-dao.xml中配置接口文件的位置,否则,MyBatis框架将不知道在哪里找接口及接口的抽象方法!(即使此前配置了组件扫描,也要做这项配置),所以,在spring-dao.xml中添加关于MapperScannerConfigurer
的配置:
<!-- 配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件的位置 -->
<property name="basePackage" value="cn.tedu.mybatis" />
</bean>
4. 配置抽象方法对应的SQL语句
这个SomeMapper.xml文件就是用于配置SQL语句的文件!该文件的顶部有相关声明:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
注意:以上声明是必须存在的,且不可修改!
该文件的根节点必须是``节点,且必须配置namespace
属性:
<!-- namespace属性:当前XML文件对应哪个接口,取值为接口的全名 -->
<mapper namespace="cn.tedu.mybatis.UserMapper">
</mapper>
然后,在的子级添加节点,以对应抽象方法,可以使用
、、
、``,应该根据将要执行的SQL语句的类型来选择子级节点!
本次要执行的是INSERT类型的操作,所以,选择``节点进行配置,该节点的id
属性值就是对应的抽象方法的名称:
<!-- id属性:抽象方法的名称,不包含括号及参数列表 -->
<insert id="addnew">
</insert>
在以上节点的内部,就可以开始配置SQL语句,各值使用#{}
格式的占位符,占位符中的名称就是抽象方法的参数User
类型中的属性名:
<!-- id属性:抽象方法的名称,不包含括号及参数列表 -->
<insert id="addnew">
INSERT INTO t_user (
username, password, age, phone, email
) VALUES (
#{username}, #{password}, #{age}, #{phone}, #{email}
)
</insert>
然后,还需要配置SqlSessionFactoryBean
类,以指定这些配置SQL语句的XML文件在哪里,及框架执行数据访问时通过哪个数据源连接到数据库,所以,在spring-dao.xml中添加:
<!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置XML文件在哪里 -->
<property name="mapperLocations" value="classpath:mappers/*.xml" />
<!-- 指定访问数据时使用的数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
最后,在Tests测试类中编写并执行单元测试