MyBatis官网地址:http://www.mybatis.org/mybatis-3/

1、 环境搭建

1. 添加依赖

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--mybatis坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--mysql驱动坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
            <scope>runtime</scope>
        </dependency>
        <!--单元测试坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--⽇志坐标-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>

2. 添加数据表和实体

数据表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

实体

public class User {
    private Integer id;
    private String username;

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

3. 编写UserMapper映射文件

<?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.example.mapper.UserMapper">
    <insert id="insert" parameterType="com.example.pojo.User">
        insert into user values (#{id}, #{username})
    </insert>
    <select id="findAll" resultType="com.example.pojo.User">
        select * from user
    </select>
</mapper>

4. 编写MyBatis核心文件

<?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>
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <typeAlias type="com.example.pojo.User" alias="user"></typeAlias>
    </typeAliases>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.example.mapper"/>
    </mappers>
</configuration>

5. 测试代码

public class MybatisTest {

    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> all = mapper.findAll();
        all.forEach(user -> {
            System.out.println(user);
        });
    }

}

2、 mybatis增删改查操作

1. 添加

①. UserMapper.xml中添加

<insert id="insert" parameterType="com.example.pojo.User">
	insert into user values (#{id}, #{username})
</insert>

②. 编写测试代码

public class MybatisTest {

    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(5);
        user.setUsername("555");

        userMapper.insert(user);
    }

}
③. 注意事项
    • 插入语句使用insert标签
    • 在映射文件中使用parameterType属性指定要插入的数据类型
    •Sql语句中使用#{实体属性名}方式引用实体中的属性值
    •插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);
    •插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()

2. 修改

①. UserMapper.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">
<mapper namespace="com.example.mapper.UserMapper">
    <update id="update" parameterType="com.example.pojo.User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>

</mapper>

②. 测试代码

public class MybatisTest {

    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(5);
        user.setUsername("555");

        userMapper.update(user);
    }

}
③. 注意事项
    • 修改语句使用update标签
    • 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);

3. 删除

①. UserMapper.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">
<mapper namespace="com.example.mapper.UserMapper">
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id=#{id}
     </delete>
</mapper>

②. 测试代码

public class MybatisTest {

    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(5);

        userMapper.delete(user);
    }

}
③. 注意事项
    • 删除语句使用delete标签
    •Sql语句中使用#{任意字符串}方式引用传递的单个参数
    •删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);

3、 核心配置文件分析

configuration配置
	properties属性
	settings设置
	typeAliases类型别名
	typeHandlers类型处理器
	objectFactory 对象工厂
	plugins 插件
	environments 环境
		environment 环境变量
			transactionManager 事务管理器
			dataSource 数据源
	databaseIdProvider 数据库厂商标识
	mappers 映射器

1. environments标签 :数据库环境的配置,支持多环境配置

<?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>
    <properties resource="jdbc.properties"/>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>
其中,事务管理器(transactionManager)类型有两种:
    ①. JDBC:直接使用jdbc的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
    ②. MANAGED : 这个配置几乎什么都不做。从来不提交或者回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样做,因此需要将closeConnection设置为false来阻止它默认的关闭行为。
其中,数据源(DataSource)类型有三种
    ①. UNPOOLED: 每次请求时打开和关闭连接
    ②. POOLED: 利用‘池’的概念,讲jdbc连接对象组织起来
    ③. JNDI: 为了能在如EJB或应用服务器这类容器中使用,容器可以集中或者在外部配置数据源,然后放置一个JNDI上下文的引用。

2. mapper标签: 该标签的作用是加载影射的

•使用相对于类路径的资源引用,例如:

<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

•使用完全限定资源定位符(URL),例如:

<mapper url="file:///var/mappers/AuthorMapper.xml"/>

•使用映射器接口实现类的完全限定类名,例如:

<mapper class="org.mybatis.builder.AuthorMapper"/>

•将包内的映射器接口实现全部注册为映射器,例如:

<package name="org.mybatis.builder"/>

3. properties标签:加载额外配置

例如,将数据源配置信息单独抽取成一个properties文件
<?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>
    <properties resource="jdbc.properties"/>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/zdy_mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root

4. typeAliases标签: 为java类型设置一个短的名字,别名不区分大小写

	原配置:
		<insert id="insert" parameterType="com.example.pojo.User">
			insert into user values (#{id}, #{username})
		</insert>
	配置typeAliases
		<typeAliases>
			<typeAlias type="com.example.pojo.User" alias="user"></typeAlias>
		</typeAliases>
	配置之后的mapper.xml
		<insert id="insert" parameterType="user">
			insert into user values (#{id}, #{username})
		</insert>

常用类型的别名:

别名数据类型
stringString
intInteger
longLong
doubleDouble
booleanBoolean
......

4、 动态sql

1.

<select id="findByCondition" parameterType="user" resultType="user">
        select * from User
        <where>
            <if test="id!=0">
                and id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
        </where>
    </select>

测试代码:

@Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User condition = new User();
        condition.setId(1);
        condition.setUsername("lucy");
        User user = userMapper.findByCondition(condition);
    }

2.

<select id="findByIds" parameterType="list" resultType="user">
	select * from user
	<where>
		<foreach collection="list" open="id in(" close=")" item="id" separator=",">
			#{id}
		</foreach>
	</where>
</select>

测试代码:

@Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int[] ids = new int[]{2, 5};
        List<User> userList = userMapper.findByIds(ids);
        System.out.println(userList);

    }
foreach标签的属性含义如下:
	标签用于遍历集合,它的属性:
	•collection:代表要遍历的集合元素,注意编写时不要写#{}
	•open:代表语句的开始部分
	•close:代表结束部分
	•item:代表遍历集合的每个元素,生成的变量名
	•sperator:代表分隔符

3. 抽取sql片段,使用时用include引用,达到sql重用的目的

<?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.example.mapper.UserMapper">
    <sql id="selectUser">
        select * from user
    </sql>
    <select id="findAll" resultType="com.example.pojo.User">
        <include refid="selectUser"></include>
    </select>
</mapper>