​MyBatis官方网站链接​


  1. 什么是MyBatis?MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  2. MyBatis编程基本套路

  mysql-connector-java
mybaits
4. 在src/main/resources目录下创建mybatis-config.xml
(1)配置envirnoments:用于配置数据库连接特性的元素,可以有多个environment子元素,每一个子元素都代表一个数据库连接环境,比如用于开发环境,但是必须在environment子元素上指定当前程序运行时使用的environment.
(2)配置mappers:SQL映射文件引入
/*mappers举例:
<!--有几种方式,这里使用的是直接引用类路径上的映射配置文件-->
<!--从类路径上加载Sql映射文件-->
<mappers>
<mapper resource="mapper/TBUserMapper.xml"/>
</mappers>
*/
(3)typeAliese:为类型定义别名,个人感觉像typedef
/* typeAliese举例:
<!--为类型定义别名-->
<typeAliases>
<typeAlias type="com.ytsky.mybatisdemo1.entity.TbUser" alias="TbUser"/>
</typeAliases>
*/
5. 在src/main/resources目录下创建UserMapper.xml
在该文件中添加sql语句映射
<select id="" resultType="">
<insert id="" parameterType="">
<update id="" parameterType="">
<delete id="">
6. 创建映射接口
接口方法名称为映射文件中sql映射的id
方法参数与parameterType指定的类型一致
返回类型与session中操作方法,如selectOne等的返回类型一致。


如果有一个需求到来,该怎么做呢?
第一步:在mapper文件中添加sql映射,调试SQL语句、指定返回类型、指定参数类型
第二步:在映射接口中添加方法,方法名与id名一致
第三步:在应用中,获得SqlSessionFactory对象
第四步:从SqlSessionFactory对象获得SqlSession对象
第五步:调用sqlSession对象的getMapper方法获得某个接口的代理对象
第六步:调用映射接口代理对象的方法操作数据库
第七步:根据返回的数据进行进一步处理。



下面是一个项目结构示例,紧接着我们会根据如下提到的过程实现一下:MyBatis编程_xml



数据库表结构如下:MyBatis编程_xml_02



pom.xml文件



<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.ytsky</groupId>
<artifactId>mybaits_demo1</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>

</project>
  1. 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>
<!--为类型定义别名-->
<typeAliases>
<typeAlias type="com.ytsky.mybatisdemo1.entity.TbUser" alias="TbUser"/>
</typeAliases>
<!--用于配置数据库连接特性的元素,
可以有多个environment子元素,每一个子元素都代表一个数据库连接环境,比如用于开发环境
但是必须在environment子元素上指定当前程序运行时使用的environment
-->
<environments default="development">
<!--定义一个mybatis数据库环境,取名为development,指定该环境中的数据库事务管理-->
<environment id="development">
<!--当前数据库连接使用的事务管理器。默认使用的是JDBC提供的事务管理器-->
<transactionManager type="JDBC"/>
<!--配置数据源特性,一个池化的数据源,缓存数据库连接对象,降低数据库连接频率,提高数据库连接性能-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/db_quote?characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!-- <environment id="deployment">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>-->
</environments>

<!--SQL映射文件引入-->
<!--有几种方式,这里使用的是直接引用类路径上的映射配置文件-->
<!--从类路径上加载Sql映射文件-->
<mappers>
<mapper resource="mapper/TBUserMapper.xml"/>
</mappers>
</configuration>
  1. TBUserMapper.xml文件
<?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">

<!--MyBatis是对象到SQL的映射-->
<!--开发者使用MyBatis编写SQL语句,并指定该SQL语句查询结果要装入的对象-->
<!--对每一个映射文件来讲,其中的每一个配置都将会被加载到内存中组成一个映射结构,从namespace.id到sql语句-->
<!--namespace在整个Mybatis运行环境中是唯一的-->
<!--用于标识某个sql语句映射相关配置的id在当前namespace中是唯一的也是唯一的-->
<mapper namespace="com.ytsky.mybatisdemo1.mapper.UserMapper">
<select id="selectUserById" resultType="TbUser">
select id, name, password, level
from db_quote.tb_user
where id = #{id}
</select>

<select id="selectAll" resultType="TbUser">
select id, name, password, level
from db_quote.tb_user
</select>

<select id="selectAllEmpUser" resultType="TbUser">
select id, name, password, level
from db_quote.tb_user
where level = '普通员工'
</select>

<insert id="insert" parameterType="TbUser">
insert into db_quote.tb_user (id, name, password, level)
VALUES (#{id}, #{name}, md5(#{password}), #{level});
</insert>

<update id="updateById" parameterType="TbUser">
update db_quote.tb_user
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="password!=null">
password = md5(#{password}),
</if>
<if test="level!=null">
level = #{level}
</if>
</set>
where id=#{id}
</update>

<delete id="deleteById">
delete from db_quote.tb_user
where id=#{id}
</delete>

</mapper>
  1. UserMapper文件
package com.ytsky.mybatisdemo1.mapper;

import com.ytsky.mybatisdemo1.entity.TbUser;
import java.util.List;

public interface UserMapper {
public TbUser selectUserById(Long id);
public List<TbUser> selectAll();
public List<TbUser> selectAllEmpUser();
public int insert(TbUser tbUser);
public int updateById(TbUser tbUser);
public int deleteById(Long id);
}
  1. TbUser文件
package com.ytsky.mybatisdemo1.entity;

import java.util.Objects;

/**
* 用于封装tb_user表中每一条记录的对象
* 由于在数据库表中的每一条记录称为实体,所以这种类也叫做实体类
*/
public class TbUser {
private Long id;
private String name;
private String level;
private String password;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TbUser tbUser = (TbUser) o;
return Objects.equals(id, tbUser.id) &&
Objects.equals(name, tbUser.name) &&
Objects.equals(level, tbUser.level) &&
Objects.equals(password, tbUser.password);
}

@Override
public int hashCode() {
return Objects.hash(id, name, level, password);
}

public Long getId() {
return id;
}

public String getName() {
return name;
}

@Override
public String toString() {
final StringBuffer sb = new StringBuffer("TbUser{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append(", level='").append(level).append('\'');
sb.append(", password='").append(password).append('\'');
sb.append('}');
return sb.toString();
}

public void setId(Long id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public void setLevel(String level) {
this.level = level;
}

public void setPassword(String password) {
this.password = password;
}

public String getLevel() {
return level;
}

public String getPassword() {
return password;
}
}
  1. UserMapper文件
import com.ytsky.mybatisdemo1.entity.TbUser;
import com.ytsky.mybatisdemo1.mapper.UserMapper;
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.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserMapperTest {

private SqlSessionFactory sqlSessionFactory;

@Before
public void init() throws IOException {
// 使用MyBatis自带的Resources对象,从类路径上打开配置文件mybatis-config.xml输入流。
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

// 获得SqlSessionFactory对象。
// 通过使用对mybatis-config.xml的输入流的调用,来初始化SqlSessionFactory。
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void selectByIdTest() {
SqlSession sqlSession = sqlSessionFactory.openSession();
TbUser user = sqlSession.getMapper(UserMapper.class).selectUserById(1L);
//使用JUnit的断言类,对查询结果进行断言检测,若检测结果为失败回抛出异常,但不影响测试类其他方法的运行
Assert.assertNotNull(user);
Assert.assertEquals(user.getId(), new Long(1L));
sqlSession.close();
}

@Test
public void selectAllTest() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<TbUser> users = sqlSession.getMapper(UserMapper.class).selectAll();
Assert.assertNotNull(users);
Assert.assertNotEquals(users.size(), 0);
sqlSession.close();
}

@Test
public void insertTest() {
TbUser tbUser = new TbUser();
tbUser.setId(null);
tbUser.setName("张三");
tbUser.setLevel("客户");
tbUser.setPassword("123456");
SqlSession sqlSession = sqlSessionFactory.openSession();
int i = sqlSession.getMapper(UserMapper.class).insert(tbUser);
//手动提交插入的数据到数据库
sqlSession.commit();
sqlSession.close();
Assert.assertNotEquals(i, 0);
}

@Test
public void updateTest(){
//创建一个对象,该对象中存有需要改变的数据,以及条件数据
//条件数据都是id,需要更新的数据是name
TbUser tbUser = new TbUser();
tbUser.setId(5L);
tbUser.setName("李四");
tbUser.setPassword("123456");
SqlSession sqlSession = sqlSessionFactory.openSession();
int i = sqlSession.getMapper(UserMapper.class).updateById(tbUser);
sqlSession.commit();
sqlSession.close();
Assert.assertNotEquals(i,0);
}

@Test
public void deleteByIdTest(){
SqlSession sqlSession = sqlSessionFactory.openSession();
int i = sqlSession.getMapper(UserMapper.class).deleteById(5L);
sqlSession.commit();
sqlSession.close();
}
}