搭建一个简单的Mybatis项目
MyBatis的主要作用是减化持久层开发。
使用Java语言,可以通过JDBC实现数据库的增删改查相关功能的开发!在使用JDBC的过程中,始终是建立与数据库的连接 > 设计所需要执行的SQL语句 > 获取Statement/PreparedStatement对象 > 执行SQL语句 > 处理结果 > 释放资源/归还连接这样的处理模式,代码相对比较固定!
MyBatis框架可以简化以上开发过程,在使用MyBatis实现增删改查相关功能时,只需要:
- 设计所需要执行的功能的抽象方法
- 设计该抽象方法对应的SQL语句
-
数据库准备
USE test; CREATE TABLE t_user ( id INT AUTO_INCREMENT COMMENT '用户id', username VARCHAR(16) NOT NULL UNIQUE COMMENT '用户名', password VARCHAR(16) NOT NULL COMMENT '密码', age INT COMMENT '年龄', phone VARCHAR(20) COMMENT '手机号码', email VARCHAR(30) COMMENT '电子邮箱', PRIMARY KEY (id) ) DEFAULT CHARSET=utf8;
插入数据
INSERT INTO t_user (username, password, age, phone, email) VALUES ('admin', '1234', 18, '13800138001', 'admin@qq.com'), ('root', '1234', 19, '13800138002', 'root@qq.com'), ('liucs', '1234', 48, '13800138003', 'liucs@qq.com'), ('zhangsan', '1234', 39, '13800138004', 'zhangsan@qq.com'), ('lisi', '1234', 27, '13800138005', 'lisi@qq.com'), ('wangwu', '1234', 25, '13800138006', 'wangwu@qq.com'), ('zhaoliu', '1234', 33, '13800138017', 'zhaoliu@qq.com'), ('xiaoming', '1234', 41, '1380013808', 'xiaoming@qq.com'), ('xiaohong', '1234', 43, '1380013809', 'xiaohong@qq.com'), ('lilei', '1234', 29, '13800138010', 'lilei@qq.com'), ('hanmm', '1234', 36, '13800138011', 'hanmm@qq.com');
-
创建maven项目,生成web.xml文件
-
在pom.xml中添加对应依赖
<!-- 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 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.10.RELEASE</version> </dependency> <!-- mysql连接 --> <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>
-
数据库连接:
创建db.properties文件,用于配置数据库连接的相关信息,如下:
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai driver=com.mysql.jdbc.Driver username=root password= initialSize=2 maxActive=10
在配置
driver
属性时,需要注意所使用的mysql-connector-java
的版本,如果使用的5.x
版本,该属性值应该是com.mysql.jdbc.Driver
,如果使用的是6.x
或更高版本,该属性值应该是com.mysql.cj.jdbc.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"></util: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); } }
-
接口和抽象方法
使用MyBatis时,需要定义各功能对应的抽象方法,这些抽象方法必须定义在接口中!
首先,应该创建UserMapper接口文件,然后,在接口中定义“插入用户数据”的抽象方法,关于抽象方法的设计原则:
如果需要执行的是增、删、改类型的操作,则使用
Integer(int)
作为方法的返回值,将表示“受影响的行数”,可用于判断操作成功与否,还可以设计为void
表示不关心受影响的行数;方法名称可以自定义,不可以重载;
参数列表根据所需要的参数来决定
插入用户数据需要执行的SQL语句大致是:
insert into (username, password, age, phone, email) values (?,?,?,?,?)
则抽象方法需要写5个参数,如果后续该数据表增加了更多的字段,则需要写更多参数,这种做法是有缺陷的,应该将这些参数封装到
User
类中:public class User { private Integer id; private String username; private String password; private Integer age; private String phone; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
定义UserMapper接口
public interface UserMapper { Integer insert(User user); //后续根据需求添加其他抽象方法 }
需要配置“接口文件在哪里”,以保证后续MyBatis框架工作时,能找到该接口:
<!-- 配置MapperScannerConfigurer --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置接口文件在哪里 --> <property name="basePackage" value="mybatis"/> </bean>
-
配置SQL映射文件:
在src/main/resources下创建名为mappers的文件夹,将映射文件放入其中
注意:在MyBatis中用于配置SQL语句的XML文件必须包括以下声明,否则将无法正常使用!
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
在配置该XML文件时,首先,需要添加根节点
<mapper>
,且必须配置namespace
属性<!-- namespace:对应哪个接口 --> <mapper namespace="mybatis.UserMapper"> </mapper>
根据所需要执行的SQL语句的种类,从
<insert>
、<delete>
、<update>
、<select>
中选择子级节点,节点的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"> <!-- 配置文件在哪 --> <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); }