1.下载指定版本mybatis用户指南pdf的方法
(1)进入mybatis官方文档mybatis官方文档
(2)点击首页的“项目的Git代码库”按钮进入项目git代码页面
(3)点击mybatis-3
(4)跳转页面滑动到README.md部分,然后点击“Download Latest”
(5)找到项目中需要用到的mybatis版本,然后点击下载zip文件
(6)解压缩后即可得到对应的pdf文件。
2.mybatis配置
(1)mybatis主配置文件
在项目resources下新建mybatis.xml,然后进入mybatis3.2.7.pdf的Getting Started章节,复制如下配置内容:
<?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>
<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 resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
配置文件详解:
configuration:配置信息
environments:当前的开发环境集合
<environment id="development”>:当前的某一个开发环境
<transactionManager type=“JDBC”/>:事物管理,使用默认的JDBC管理
<dataSource type=“POOLED”>:数据源,POOLED代表使用默认的数据库连接池
<property name=“driver” value=”
d
r
i
v
e
r
”
/
>
:
数
据
库
连
接
驱
动
<
p
r
o
p
e
r
t
y
n
a
m
e
=
"
u
r
l
"
v
a
l
u
e
=
"
{driver}”/>:数据库连接驱动 <property name="url" value="
driver”/>:数据库连接驱动<propertyname="url"value="{url}”/>:数据库连接url
<property name=“username” value=”
u
s
e
r
n
a
m
e
”
/
>
:
数
据
库
连
接
用
户
名
<
p
r
o
p
e
r
t
y
n
a
m
e
=
"
p
a
s
s
w
o
r
d
"
v
a
l
u
e
=
"
{username}”/>:数据库连接用户名 <property name="password" value="
username”/>:数据库连接用户名<propertyname="password"value="{password}”/>:数据库连接密码
mappers:映射配置文件的路径
(2)创建数据库&表&加数据
略
(3)项目中创建实体类
- 变量的定义
- 变量对应的set及get方法
- 额外的toString方法;
代码如下:
import java.util.Date;
import java.util.List;
public class Users {
private Integer id; // 用户编号
// private String username; // 登录账号
private String name; // 登录账号
private String userpass; // 登录密码
private String nickname; // 用户昵称
private Integer age; // 用户年龄
private String gender; // 用户性别
private String email; // 用户邮箱
private String phone; // 联系方式
private Date createTime; // 创建时间
private Date updateTime; // 账号最后修改时间
private Date lastLogin; // 用户最后登录时间
private Integer userStatus; // 用户账号状态 0 正常 1 锁定 2 删除
private String remark; // 用户备注信息
private List<Address> addresses; // 用户地址信息【地址列表,有一个是默认地址】
public Users() {
}
public Users(Integer id) {
this.id = id;
}
public Users(String name, String userpass, String nickname, Integer age, String gender, String email, String phone) {
this.name = name;
this.userpass = userpass;
this.nickname = nickname;
this.age = age;
this.gender = gender;
this.email = email;
this.phone = phone;
}
public Users(Integer id, String nickname, Integer age, String gender, String email, String phone, Date updateTime, String remark) {
this.id = id;
this.nickname = nickname;
this.age = age;
this.gender = gender;
this.email = email;
this.phone = phone;
this.updateTime = updateTime;
this.remark = remark;
}
public Users(String name, String userpass, String nickname, Integer age, String gender, String email, String phone, Date createTime, Date updateTime, Date lastLogin, Integer userStatus) {
this.name = name;
this.userpass = userpass;
this.nickname = nickname;
this.age = age;
this.gender = gender;
this.email = email;
this.phone = phone;
this.createTime = createTime;
this.updateTime = updateTime;
this.lastLogin = lastLogin;
this.userStatus = userStatus;
}
public Users(Integer id, String nickname, Integer age, String gender, String email, String phone, String remark) {
this.id = id;
this.nickname = nickname;
this.age = age;
this.gender = gender;
this.email = email;
this.phone = phone;
this.remark = remark;
}
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
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;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getLastLogin() {
return lastLogin;
}
public void setLastLogin(Date lastLogin) {
this.lastLogin = lastLogin;
}
public Integer getUserStatus() {
return userStatus;
}
public void setUserStatus(Integer userStatus) {
this.userStatus = userStatus;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", name='" + name + '\'' +
", userpass='" + userpass + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", lastLogin=" + lastLogin +
", userStatus=" + userStatus +
", remark='" + remark + '\'' +
", addresses=" + addresses +
'}';
}
}
(4)resources下新建mapper文件夹,在mapper文件夹下新建mapper映射文件usersMapper.xml(命名规则:实体类名称+Mapper.xml),内容参考mybatis3.2.7.pdf–Getting Started章节–Exploring Mapped SQL Statements部分:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
讲解:
mapper:用于定义一个映射配置文件的根节点
namespace属性:用来配置命名空间,主要进行session级别的缓存管理(命名空间默认情况下,使用我们当前操作的实体类的全路径)
select中的id:查询的名称
select中的resultType:返回值类型
select中的
实际代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd”>
<mapper namespace="com.damu.entity.Users">
<!--<select id="findUsers" resultType="com.damu.entity.Users">-->
<select id="findUsers" resultMap="forUsers">
select * from users
<if test="id != null">
where id = #{id}
</if>
</select>
<!-- 自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段 -->
<resultMap id="forUsers" type="com.damu.entity.Users">
<!-- 绑定id主键 -->
<id property="id" column="id"></id>
<!-- result配置,主要配置普通属性,column表示配置的是数据库字段名称 property配置的是实体类的属性名称 -->
<result column="username" property="name"></result>
<collection property="addresses" column="id" ofType="com.damu.entity.Address" select="getAddress"></collection>
</resultMap>
<select id="getAddress" resultType="com.damu.entity.Address">
select * from address where userid = #{id}
</select>
<sql id="user_fields">
username, userpass, nickname, age, gender, email, phone, createTime, updateTime, lastLogin, userstatus, remark
</sql>
<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
insert into users( <include refid="user_fields"></include>)
values(#{name},#{userpass}, #{nickname}, #{age}, #{gender}, #{email}, #{phone}, #{createTime}, #{updateTime}, #{lastLogin}, #{userStatus}, #{remark})
</insert>
<update id="updateUser">
update users
<set>
<if test="name != null">username = #{name},</if>
<if test="userpass != null">userpass = #{userpass},</if>
<if test="nickname != null">nickname = #{nickname},</if>
<if test="age != null">age = #{age},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="email != null">email = #{email},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="createTime != null">createTime = #{createTime},</if>
<if test="updateTime != null">updateTime = #{updateTime},</if>
<if test="lastLogin != null">lastlogin = #{lastLogin},</if>
<if test="userStatus != null">userStatus = #{userStatus},</if>
<if test="remark != null">remark = #{remark},</if>
</set>
where id = #{id}
</update>
<delete id="delUser">
delete from users where id = #{id}
</delete>
</mapper>
(5)新建测试类,通过junit进行测试
查询junit的依赖包(maven引用的方式)
https://mvnrepository.com/artifact/junit/junit/4.12
在pom.xml中添加依赖如下:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
测试类代码如下:
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 org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class TestDemo {
/*
通过junit进行测试
*/
@Test
public void testDemo1(){
//初始化mybatis配置环境
String resource = "mybatis.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//打开和数据库之间的会话
SqlSession session = factory.openSession();
//进行数据处理
List<Users> ulist = session.selectList("userList");//userList为usersMappers.xml中select部分的id
for (Users user: ulist
) {
System.out.println(user);
}
//关闭会话
session.close();
}
}
(6)运行测试类即可看到结果。
3.mybatis核心API操作过程分解
(1)读取mybatis主配置文件以及实体映射配置文件:
-
mybatis.xml
-
实体类名称+Mapper.xml
(2)构建一个和数据库之间的会话 -
这个过程主要是由SqlSessionFactoryBuilder来进行处理
-
SqlSessionFactoryBuilder结合配置文件,构建出来SqlSessionFactory工厂类(这个工厂类,整个程序中只需要构建一次)
-
通过SqlSessionFactory,open出一个SqlSession,即和数据库的一个会话
-
通过绘画的执行器,即Executor,来执行sql语句(要执行的sql语句,提前配置到了实体类名称+Mapper.xml配置文件中)
-
执行器,在执行映射配置文件时,需要参数(HashMap String\Integer POJO),参数可缺省
-
通过映射规则Mapped Statement来进行数据操作,即从数据库中查询数据或进行增删改的操作
-
获取结果数据,对结果数据进行处理
4.Mybatis架构分解
接口层提供了如下接口: -
数据查询接口
-
数据新增接口
-
数据更新接口
-
数据删除接口
-
获取配置接口
对于封装,mybatis主要执行了四个步骤: -
参数映射
-
SQL解析
-
SQL执行
-
结果映射