超详细讲解mybatis入门

mybatis 入门

学习目标

【应用】Mybatis 的快速入门

【应用】MyBatis 的增删改查操作

【掌握】MyBatis 核心配置文件概述

1、Mybatis 简介

1.1 原始 jdbc 操作（查询数据）

1.2 原始 jdbc 操作（插入数据）

1.3 原始 jdbc 操作的分析

原始 jdbc 开发存在的问题如下：

①数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
②sql 语句在代码中硬编码，造成代码不易维护，实际应用 sql 变化的可能较大，sql 变动需要改变 java 代码。
③查询操作时，需要手动将结果集中的数据手动封装到实体中。插入操作时，需要手动将实体的数据设置到 sql 语
句的占位符位置

应对上述问题给出的解决方案：

①使用数据库连接池初始化连接资源
②将 sql 语句抽取到 xml 配置文件中
③使用反射、内省等底层技术，自动将实体与表进行属性与字段的自动映射

1.4 什么是 Mybatis

mybatis 是一个优秀的基于 java 的持久层框架，它内部封装了 jdbc，使开发者只需要关注 sql 语句本身，而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来，并通过 java 对象和 statement 中 sql 的动态参
数进行映射生成最终执行的 sql 语句。

最后 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题，对 jdbc 进行了封装，屏蔽了 jdbc api 底层访问细节，使我们不用与 jdbc api 打交道，就可以完成对数据库的持久化操作。

1.5 Mybatis 架构

2、Mybatis 的快速入门

2.1 MyBatis 开发步骤

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

MyBatis 开发步骤：

①添加 MyBatis 的坐标

②创建 user 数据表

③编写 User 实体类

④编写映射文件 UserMapper.xml

⑤编写核心文件 SqlMapConfig.xml

⑥编写测试类

2.2 环境搭建

1. 导入 MyBatis 的坐标和其他相关坐标

Copy
<!‐‐mybatis坐标‐‐>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!‐‐ mysql驱动 ‐‐>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql‐connector‐java</artifactId>
<version>5.1.39</version>
</dependency>
<!‐‐单元测试坐标‐‐>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!‐‐日志坐标‐‐>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>

2. 创建 user 数据表

Copy
drop table if EXISTS user;
##用户
CREATE TABLE `user` (
`uid` INT AUTO_INCREMENT ,
`username` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`uid`)
);
INSERT INTO `user` VALUES (NULL,'wc001','888888'),
(NULL,'xq001','888888'),
(NULL,'xb001','888888');

3. 编写 User 实体

Copy
public class User {
private int id;
private String username;
private String password;
//省略get个set方法
}

4. 编写 UserMapper 映射文件

Copy
<
?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="userMapper">

select * from User

</mapper>

5. 编写 MyBatis 核心文件

Copy
<!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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!‐‐加载映射文件‐‐>
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>

2.3 编写测试代码

Copy
@Test
public void test1() throws IOException {
//加载 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session = sqlSessionFactory.openSession();
//执行操作
List<User> users = session.selectList("userMapper.findAll");
//释放资源
session.close();
System.out.println(users);
}

为了查看 sql 语句的执行信息 配置在 resources 下添加 日志文件 log4j.properties

Copy
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.com.summer.test=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] ‐ %m%n

2.4 知识小结

MyBatis 开发步骤：

①添加 MyBatis 的坐标

②创建 user 数据表

③编写 User 实体类

④编写映射文件 UserMapper.xml

⑤编写核心文件 SqlMapConfig.xml

⑥编写测试类

3、MyBatis 的映射文件概述

4.MyBatis 的增删改查操作

4.1 MyBatis 的插入数据操作

1. 编写 UserMapper 映射文件

Copy
<insert id="save" parameterType="com.summer.domain.User" >
insert into user values (null,#{username},#{password});
</insert>

2. 编写插入实体 User 的代码

Copy
//添加
@Test
public void test2() throws IOException {
User user = new User();
user.setUsername("如花");
user.setPassword("888");
//加载 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session = sqlSessionFactory.openSession();
//执行操作
int i = session.insert("userMapper.save",user);
//释放资源
session.commit();
session.close();
System.out.println(i);
}

3. 插入操作注意问题

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

4.2 MyBatis 的修改数据操作

1. 编写 UserMapper 映射文件

Copy
<update id="update" parameterType="com.summer.domain.User" >
update user set username = #{username} , password = #{password} where uid =#{uid}
</update>

2. 编写修改实体 User 的代码

Copy
//修改
@Test
public void test3() throws IOException {
User user = new User();
user.setUid(1);
user.setUsername("如花2222");
user.setPassword("888");
//加载 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session = sqlSessionFactory.openSession();
//执行操作
int i = session.update("userMapper.update",user);
//提交事务
session.commit();
//释放资源
session.close();
System.out.println(i);
}

3. 修改操作注意问题

・修改语句使用 update 标签

・修改操作使用的 API 是 sqlSession.update (“命名空间.id”, 实体对象);

4.3 MyBatis 的删除数据操作

1. 编写 UserMapper 映射文件

Copy
<delete id="delete" parameterType="java.lang.Integer" >
delete from user where uid = #{uid}
</delete>

2. 编写删除数据的代码

Copy
//删除
@Test
public void test4() throws IOException {
//加载 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建session
SqlSession session = sqlSessionFactory.openSession();
//执行操作
int i = session.delete("userMapper.delete",1);
//提交事务
session.commit();
//释放资源
session.close();
System.out.println(i);
}

3. 删除操作注意问题
・删除语句使用 delete 标签

・Sql 语句中使用 #{任意字符串} 方式引用传递的单个参数

・删除操作使用的 API 是 sqlSession.delete (“命名空间.id”,Object);

5. MyBatis 核心配置文件概述

5.1 MyBatis 核心配置文件层级关系

5.2 MyBatis 常用配置解析

1.environments 标签

数据库环境的配置，支持多环境配置

2.mapper 标签

该标签的作用是加载映射的，加载方式有如下几种：

・使用相对于类路径的资源引用，例如：

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

・使用完全限定资源定位符（URL），例如：

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

・使用 mapper 接口的全限定类名 注解 mapper 接口，例如：

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

・注册指定包下的所有 mapper 接口，例如：

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

3.Properties 标签

4.typeAliases 标签

类型别名是为 java 类型设置的一个短的名字。原来的配置如下

Copy

select * from user


配置 typeAliases, 为 com.summer.pojo.User 定义别名为 User

Copy
<typeAliases>
<typeAlias type="com.summer.pojo.User" alias="user"></typeAlias>
</typeAliases>

后面的 mapper.xml 就可以使用别名

Copy

select * from user


上面我们是自定义的别名，mybatis 框架已经为我们设置好的一些常用的类型的别名

5.3 知识小结

核心配置文件常用配置：

properties 标签：该标签可以加载外部的 properties 文件

Copy
<properties resource="jdbc.properties"></properties>

typeAliases 标签：设置类型别名

Copy
<typeAlias type="com.summer.domain.User" alias="user"></typeAlias>

mappers 标签：加载映射配置

Copy
<mapper resource="com/summer/mapper/UserMapping.xml"></mapper>