1. JDBC操作的缺陷
JDBC查询数据代码
JDBC添加数据代码
JDBC操作的问题
- 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
- sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql变动需要改变java代码。
- 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置(jdbcTemplate)
解决方案
- 使用数据库连接池初始化连接资源(c3p0、druid、hikari)
- 将sql语句抽取到xml配置文件中
- 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射。(内省:Java语言对JavaBean类属性、事件的处理方法,例如类User中有属性name,那么必定有 getName,setName方法,我们可以通过他们来获取或者设置值,这是常规操作。)
解决方案实现框架
- JdbcTemplate
- Dbutils
- Hibernate
- Mybatis
2. Mybatis框架介绍
什么是框架?
上图我们称之为汽车框架,汽车工人可以在汽车框架的基础上组装发动机、轮胎、方向盘、座椅、仪表盘等组件,最终生产出一辆汽车,我们可以认为汽车框架其实就是个半成品,汽车工人在半成品的基础上进行开发,最终生产出一个成品的汽车。
框架就是是完成了一定基础的、有难度的、通用的功能的半成品软件,程序员在框架的基础上实现自己项目系统的功能,最终完成一个完整的项目系统。
Mybatis框架介绍
- mybatis 是一个优秀的基于libatis的Java持久层框架,它内部封装了Jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
- mybatis通过xml或注解的方式将要执行的各种 statement(SQL语句)配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
- 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
ORM介绍
ORM:Object relation Mapping (对象关系映射)
让JavaBean实体类对象和数据库表之间产生映射关系,使我们可以通过操作实体类对象,操作数 据库表中的数据,称之为ORM思想
3. Mybatis快速入门-查询
1.创建项目,引入依赖
<dependencies>
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</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>
<!--lombok 注解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
2.创建数据库表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(50) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;
INSERT INTO `user` VALUES ('1', 'lucy', '123');
INSERT INTO `user` VALUES ('2', 'haohao', '123');
3.创建实体类
public class User {
private Integer id;
private String userName;
private String password;
public User() {
}
public User(Integer id, String userName, String password) {
this.id = id;
this.userName = userName;
this.password = password;
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
4.编写Mybatis核心配置文件
核心配置文件主要用来配置Mybatis的配置,比如:数据源配置、别名设置、映射文件引入、分 页、外部文件引入等等。
映射文件和核心文件不知道如何编写约束信息,可以通过此地址参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html
jdbc.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/yan8?
useUnicode=true&characterEncoding=UTF8&userSSL=false&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=root
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>
<!--核心配置操作-->
<!--引入外部配置文件-->
<properties resource="jdbc.properties"></properties>
<!--mybatis配置-->
<settings>
<!--开启数据库表字段下划线和pojo类中的驼峰命名的属性名称的映射对应关系
user_name:userName -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--mybatis的pojo实体类别名设置
以前寻找实体类的时候,需要寻找的是全限定名的实体类,com.test.pojo.User
使用user别名之后,可以直接用别名user代表com.test.pojo.User
相当于在使用user别名的时候,就是在使用com.test.pojo.User
-->
<typeAliases>
<!--给一个实体类设置别名-->
<!--<typeAlias type="com.test.enity.User" alias="user">-->
<!--</typeAlias>–>-->
<!--如果com.test.pojo包下有很多实体类,该怎么去别名呢?-->
<!--给对应包下的所有pojo实体类设置别名,别名就是类名(大小不区分)-->
<package name="com.test.enity"/>
</typeAliases>
<!--数据库连接配置-->
<!--default:默认使用哪个数据库连接,值为environment的id-->
<environments default="default">
<!--数据库连接-->
<environment id="default">
<!--事务管理器-->
<transactionManager type="jdbc"></transactionManager>
<!--数据源配置 type:设置是否使用数据库连接池-->
<dataSource type="POOLED">
<!--数据源驱动配置-->
<!--<property name="driver"
value="com.mysql.cj.jdbc.Driver"/>-->
<property name="driver" value="${jdbc.driverClassName}"/>
<!--数据库连接-->
<property name="url" value="${jdbc.url}"/>
<!--用户名-->
<property name="username" value="${jdbc.username}"/>
<!--密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件设置-->
<mappers>
<!-- 路径引入:通过映射文件路径引入映射文件 -->
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
5.编写Mybatis映射配置文件
映射配置文件主要用来编写对应的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">
<!-- namespace:值为mapper(dao)接口的全类名,表示和mapper接口绑定-->
<mapper namespace="com.test.mapper.UserMapper">
<!-- 查询全部用户 -->
<!-- select表示查询sql语句 -->
<!-- id:sql语句的statement id标识 -->
<!-- resultType:sql语句执行之后的返回类型,会自动进行ORM对象关系映射 -->
<select id="findAllUser" resultType="com.test.enity.User">
select * from user
</select>
</mapper>
6.编写Mapper(dao)接口
Mybatis中将原来的Dao统一称作为Mapper。
public interface UserMapper {
public List<User> findAllUser();
}
注意:Mapper接口是没有实现类的,Mybatis可以通过代理的方式自动设置Mapper接口的实现 类,通过自动映射的方式找到映射文件中的sql语句,那为了映射成功,映射文件编写需要遵守以下规则:
-
namespace必须为接口全类名
-
statement id标识比须和接口中的方法名一致 service -> dao -> 操作数据库
-
resultType返回值类型必须和接口方法的返回值类型一致
-
parameterType参数类型必须和接口方法的参数类型一致
不遵守,则会报错
7.编写单元测试代码
public class UserTest {
@Test
public void test1() throws IOException {
//加载Mybatis核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
//根据核心配置文件获取SqlSession工厂
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession = build.openSession();
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//执行对应的方法,会通过映射查找对应的sql语句执行
List<User> allUser = mapper.findAllUser();
System.out.println(allUser);
}
}
4. Mybatis快速入门-Mapper映射文件引入方式
1.Mybatis核心配置文件中引入映射配置文件除了之前的方式,还可以使用Mapper映射的方式引 入。
<!--加载映射文件设置-->
<mappers>
<!--直接加载映射文件-->
<!--<mapper resource="mapper/UserMapper.xml"></mapper>-->
<!--直接加载硬盘上的映射文件-->
<!--<mapper url="file:///D:\Lesson\WorkSpace\LanOuWorkSpace\ZZJ230201WorkSpace\IDEA\Mybatis\Mybatis-Day01\src\main\resources\mapper\UserMapper.xml"></mapper>-->
<!--根据mapper接口加载对应的映射文件
遵守规则:
1.mapper接口的类名必须和mapper.xml的名称一致
2.mapper接口的包名必须和mapper.xml的包名一致
-->
<!--<mapper class="com.test.mapper.UserMapper"></mapper>-->
<!--通过包扫描加载映射配置文件
遵守规则:
1.mapper接口的类名必须和mapper.xml的名称一致
2.mapper接口的包名必须和mapper.xml的包名一致
-->
<package name="com.test.mapper"/>
</mappers>
注意:Mapper映射的方式要求Mapper接口和映射文件的包名、文件名一致,不一致会报错。
如上图所示,如果不一致,执行会报如下错误:
改为一致,则可以成功
通过查看编译之后的代码可以知道,当Mapper接口和映射文件包名、类名一致时,编译之后, Mapper接口和映射文件是在一个包下的。
5. Mybatis快速入门-添加
2.映射文件中编写添加sql语句
<!-- insert表示添加 -->
<!-- parameterType:sql语句所需参数的实体类类型,会自动进行ORM对象关系映射 -->
<insert id="insert" parameterType="user">
insert into user values (#{id},#{userName},#{password})
</insert>
3.Mapper接口中编写对应的方法
public interface UserMapper {
public List<User> findAllUser();
public void insert(User user);
}
4.单元测试编写对应的代码
@Test
public void test2() throws IOException {
//加载Mybatis核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
//根据核心配置文件获取SqlSession工厂
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession = build.openSession();
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(3,"zhangsan","123456");
mapper.insert(user);
}
执行之后发现数据库中没有增加数据
这是因为mybatis在执行操作的时候,会开启事务,默认事务不自动提交,必须手动提交,所以可以改为
@Test
public void test2() throws IOException {
//加载Mybatis核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
//根据核心配置文件获取SqlSession工厂
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession = build.openSession();
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(3,"zhangsan","123456");
mapper.insert(user);
sqlSession.commit();//提交事务
//sqlSession.rollback();//回滚事务
}
当然如果不想手动提交事务,可以在获取sqlSession的时候,进行自动事务提交开启配置。
@Test
public void test2() throws IOException {
//加载Mybatis核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
//根据核心配置文件获取SqlSession工厂
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession = build.openSession(true);//true:自动提交事务
false:不自动提交事务,默认
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(3,"zhangsan","123456");
mapper.insert(user);
//sqlSession.commit();//提交事务
//sqlSession.rollback();//回滚事务
}
6. 深入了解Mybatis的API
6.1 SqlSessionFactory
一个SqlSessionFactory表示一个连接会话工厂
一个SqlSessionFactory只能连接一个数据库实例,如果需要连接多个数据库,需要构建多个 SqlSessionFactory对象。
在构建SqlSesssionFactory时可以指定environment的id,表示使用指定的数据源来构建factory 对象
//参数2:数据源名称
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(in, "default");
SqlSessionFactory是线程安全。
6.2 SqlSession
一个SqlSession对象代表一次到数据库的会话 ,该对象有以下功能:
- 获取Mapper实现类
- 处理事务操作
注意: SqlSession对象是非线程安全的,在多线程环境下,建议不要作为类的全局属性来用。
6.3 Mapper
-
Mapper接口类(dao接口类)
定义了增删改查的方法。注意,必须是Interface类型,而且方法只需要定义就可以了。
-
Mapper配置文件(映射配置文件)
Mapper配置文件中就是负责实现接口中的方法,它定义了具体要执行什么SQL语句,如何映射结果集。
- 配置文件中select、delete、update、insert标签的id必须是对应接口中的方法名。
- mapper文件的namespace属性需要对应Mapper接口的完全类型限定名。
7. 深入Mybatis核心配置文件
7.1. 核心配置文件的作用
核心配置文件是Mybatis的入口,它里面可以配置mybatis的具体参数、数据源、类型别名、关联映射文件等。
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构 如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseldProvider(数据库厂商标识)
- mappers(映射器)
注意:上面的顺序就是实际配置顺序,顺序不对会报错的。
详细的参数配置说明参见:Mybatis3核心配置文件官方说明
7.2. Properties属性配置
属性配置可以直接在properties内部配置,也可以引入外部配置文件,如果两个都使用了,外 部配置文件会覆盖properties内部的配置。
<!--加载外部配置文件-->
<!--
url="file:///D:\Lesson\WorkSpace\LanOuWorkSpace\ZZJ220603WorkSpace\Mybatis\
Mybatis-QuickStart\src\main\resources\jdbc.properties" -->
<!--外部文件配置 resource和url不能同时使用-->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root"/>
</properties>
<!-- 使用外部properties文件中定义的属性 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
7.3. Settings设置参数
Mybatis支持的设置参数非常多, 其中绝大多数我们都无需关注。
比较有用的参数:
<settings>
<!--
是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性
名aColumn(默认关闭)
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
7.4. TypeAliases类型别名
类型别名可为 Java 类设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写 。
配置了别名的类型在映射文件中就可以使用类的别名,而不用写全名称了。
使用示例:
<!--定义别名,在映射文件中使用的时候可以不用再使用全类名,直接使用别名即可-->
<typeAliases>
<!-- 单独类设置 -->
<typeAlias type="com.test.quickstart.pojo.User" alias="user">
</typeAlias>
</typeAliases>
也支持将整个包下所有类批量指定别名,这也是我们最经常的做法
<typeAliases>
<package name="com.test.quickstart.pojo"/>
</typeAliases>
使用的时候(在映射文件中)
<select id="selectUser" resultType="user">
select * from user;
</select>
Mybatis针对一些常见的Java类型内建了类型别名,具体如下:
7.5. Plugins配置插件
Mybatis插件的作用是在执行语句的过程中进行拦截,插入用户自定义的操作 。
通过 MyBatis 提供的强大机制,我们可以很方便的扩展Mybatis的功能,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。
在实际的开发中,通常不需要自己去定义插件, 而是使用别人已经写好的插件,后面我们会学习Mybatis分页插件的使用。
7.6. Environments配置数据源和事务
在Mybatis中数据源和事务都是放在一个叫做 environments (环境)的标签中来配置的。
一个 environments 标签可以包含若干个 environment 标签,每个 environment 标签对应一个 数据源和一套事务配置。
配置示例:
<!--数据库连接-->
<!--default:默认使用的数据库环境表示-->
<environments default="default">
<!-- 数据库环境配置 id:数据库环境标识-->
<environment id="default">
<!-- 使用的事务管理类型 -->
<transactionManager type="jdbc"></transactionManager>
<!-- 数据源配置 type:使用的数据库连接池类型 -->
<dataSource type="POOLED">
<!-- 可以直接写 -->
<!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- 也可以通过${}获取外部配置文件内容 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
7.6.1. 事务管理器
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚,而是让容器来管理事务的整个生命周期(比如 J2EE 应用服务器的上下文)。
如果使用了Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
后面我们会使用Spring来管理事务,Mybatis中的事务很弱,可以不做了解。
7.6.2. 数据源
Mybatis支持三种数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实 例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:
- poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
- poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
- poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
- poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
- poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置,作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超 过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)
- poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
- poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
- poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部 配置数据源,然后放置一个 JNDI 上下文的数据源引用。(用的比较少,这里不做过多介绍)
在实际的开发中,数据源往往是交给Spring来管理, 这里只做了解即可。
7.7. Mappers管理映射配置文件
mybatis支持四种方式配置
1. 添加类路径下XML映射文件
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
2. 添加物理绝对路径映射文件
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///D:/Lesson/WorkSpace/Test/Mybatis/MybatisQuickStart/src/main/resources/mapper/UserMapper.xml"></mapper>
</mappers>
3. 以映射器实现类的完全限定名类名配置
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.test.quickstart.mapper.UserMapper"/>
</mappers>
4. 将某个包下所有的映射器添加进来
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="com.test.quickstart.mapper"/>
</mappers>
注意事项(针对第3种和第4种)
-
映射文件必须和Mapper接口包名一致
-
映射文件必须和Mapper接口文件名一致
-
映射文件中的namespace必须为接口全类名
-
sql语句的statement id必须和接口中的方法名一致
-
映射文件中的resultType返回值类型必须和接口方法中的返回值类型一致
-
映射文件中的parameterType参数类型必须和接口方法的参数类型一致
8. SqlSessionFactory工具类
在单元测试的时候,我们每写一个单元测试,就需要写一次构建SqlSessionFacotry的代码,太麻烦了,我们可以将构建SqlSessionoFactory的代码封装成一个工具类。
创建MybatisUtil.java工具类
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory(String xml) {
return createSqlSessionFactory(xml, null);
}
public static SqlSessionFactory getSqlSessionFactory(String xml, String env) {
return createSqlSessionFactory(xml, env);
}
private static SqlSessionFactory createSqlSessionFactory(String xml, String env) {
if (sqlSessionFactory == null) {
synchronized (MybatisUtil.class) {
if (sqlSessionFactory == null) {
try {
InputStream resourceAsStream = Resources.getResourceAsStream(xml);
if (env == null) {
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream);
} else {
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream, env);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("加载核心配置文件失败");
}
}
}
}
return sqlSessionFactory;
}
}
在单元测试中使用工具类
@Test
public void test3() throws IOException {
SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory("Map-Config.xml");
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);//true:自动提交事务 false:不自动提交事务,默认
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//执行对应的方法,会通过映射查找对应的sql语句执行
List<User> allUser = mapper.findAllUser();
System.out.println(allUser);
}
@Test
public void test4() throws IOException {
SqlSessionFactory sqlSessionFactory =
MybatisUtil.getSqlSessionFactory("Map-Config.xml", "default");
//通过SqlSession工厂获取SqlSession
SqlSession sqlSession =sqlSessionFactory.openSession(true);//true:自动提交事务 false:不自动提交事务,默认
//通过SqlSession获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(4,"lisi","123456");
mapper.insert(user);
}
标签:02,Mapper,映射,配置文件,SqlSession,Mybatis,public,MyBatis01
From: https://www.cnblogs.com/jiabaolatiao/p/17519642.html