1. 创建MyBatis项目
创建Maven Project,Group Id使用cn.tedu.mybatis,Artifact Id使用MyBatis,Packaing选择war(也可以选择jar)。
项目创建出来后,需要:生成web.xml文件;在pom.xml中添加依赖;从前序项目中复制spring-mvc.xml到当前项目;添加Tomcat运行环境(此案例可以不需要);打开前序项目的web.xml,将DispatcherServlet和CharacterEncodingFilter的配置复制到当前项目中。
本次另外需要添加依赖:
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!-- SpringJDBC -->
<!-- 注意:与当前项目使用的其它spring依赖保持相同的版本号 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- mysql连接 -->
<!-- 可选版本号:8.0.12~8.0.16,5.1.4~5.1.6 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</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.12</version>
</dependency>
然后,将spring-mvc.xml复制一份,得到spring-dao.xml,删除spring-dao.xml文件内的配置!
2. 数据库连接
在src/main/resources下创建db.properties文件,用于配置数据库连接的相关信息:
url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=2
maxActive=10
在配置driver属性时,需要注意所使用的mysql-connector-java的版本,如果使用的5.x版本,该属性值应该是com.mysql.jdbc.Driver,如果使用的是6.x或更高版本,该属性值应该是com.mysql.cj.jdbc.Driver,如果不确定到底应该用哪个值,可以展开mysql-connector-java的jar包文件来观察!另外,在该jar包中还有META-INF/services/java.sql.Driver文件,该文件内记录的就是使用该jar包时应该使用的Driver类。
如果使用的是6.x或以上版本的mysql-connector-java,在配置连接数据库的URL时,还必须显式的设置serverTimezone参数的值!在中国大陆地区可使用的值有Asia/Shanghai和Asia/Chongqing。
需要在spring-dao.xml中添加配置,读取以上db.properties中的配置信息:
<util:properties id="config" location="classpath:db.properties" />
然后,连接数据库时,使用到的数据源将是BasicDataSource,则需要将以上读取到的数据库连接信息注入到BasicDataSource的属性中去:
<!-- 配置数据源,保证其能够连接数据库 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<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 {
ClassPathXmlApplicationContext ac;
@Before
public void doBefore() {
ac = new ClassPathXmlApplicationContext(
"spring-dao.xml");
}
@After
public void doAfter() {
ac.close();
}
@Test
public void getConnection() throws SQLException {
BasicDataSource dataSource = ac.getBean("dataSource", BasicDataSource.class);
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
3. 接口与抽象方法
暂定目标:使用MyBatis向数据表中插入新的用户数据。
使用MyBatis时,需要定义各功能对应的抽象方法,这些抽象方法必须定义在接口中!
首先,应该创建cn.tedu.mybatis.UserMapper接口文件,然后,在接口中定义“插入用户数据”的抽象方法,关于抽象方法的设计原则:
- 如果需要执行的是增、删、改类型的操作,则使用Integer作为方法的返回值,将表示“受影响的行数”,可用于判断操作成功与否,也可以设计为int,还可以设计为void表示不关心受影响的行数;
- 方法名称可以自定义,不可以重载;
- 参数列表根据所需要的参数来决定,可以参考此前学习JDBC时,SQL中有哪些问号,就写哪些参数。
此次“插入用户数据”需要执行的SQL语句大致是:
insert into (username, password, age, phone, email) values (?,?,?,?,?)
则抽象方法需要写5个参数,如果后续该数据表增加了更多的字段,则需要写更多参数,这种做法是有缺陷的,应该将这些参数封装到cn.tedu.mybatis.User类中:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
}
则抽象方法可以设计为:
Integer insert(User user);
接下来,需要配置“接口文件在哪里”,以保证后续MyBatis框架工作时,能找到该接口:
<!-- 配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件在哪里 -->
<property name="basePackage"
value="cn.tedu.mybatis" />
</bean>
- 配置SQL映射
下载编写配置文件的XML文件压缩包。
在src/main/resources下创建名为mappers的文件夹,并将压缩包中的SomeMapper.xml复制到该文件夹下。
注意:在MyBatis中用于配置SQL语句的XML文件必须包括以下声明,否则将无法正常使用!
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
在配置该XML文件时,首先,需要添加根节点,且必须配置namespace属性,该属性值表示对应哪个接口文件:
<!-- namespace:对应哪个接口 -->
<mapper namespace="cn.tedu.mybatis.UserMapper">
</mapper>
然后,根据所需要执行的SQL语句的种类,从、、、中选择子级节点,节点的id属性就是抽象方法的名称,然后,在节点内容编写需要执行的SQL语句,参数部分使用#{}格式的占位符,占位符内部的名称是方法的参数User类中的属性名:
<!-- id:抽象方法的名称 -->
<insert id="insert">
INSERT INTO t_user (
username, password,
age, phone,
email
) VALUES (
#{username}, #{password},
#{age}, #{phone},
#{email}
)
</insert>
然后,还需要配置“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>
最后,编写并执行单元测试:
@Test
public void insert() {
User user = new User();
user.setUsername("zhaoqi");
user.setPassword("888999");
user.setPhone("010-88888888");
Integer rows = userMapper.insert(user);
System.out.println("rows=" + rows);
}