第一个Mybatis程序
使用Mybatis连接Mysql数据库
开发环境:
- JDK 17
- Maven 3.8.4
- MySQL 5.7
- IDEA 2020.3
一、创建新项目
首先配置好我们项目,新建一个项目mybatis_Test
,作为所有mybatis
项目的根项目。这样做的好处是整合了所有项目,并且在根项目pom.xml
中添加的依赖会自动的添加到其子项目中,避免了后续新建项目的重复工作。
其次要添加依赖,用到的依赖一共有三个:mysql
mybatis
junit
,在pom.xml
中添加以下代码
1 | <dependencies> |
随后在主项目中创建一个新项目test1
作为此次实验项目,点击IDEA右侧Maven
侧边栏查看项目中的依赖项,确认所有依赖已经导入。
二、编写mybatisUtil.java
在新项目test1/src/java
中添加新软件包top.hellogjs.utils
,在包中添加java类mybatisUtil.java
。
引用官方文档
从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
1
2
3 String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
1
2
3 try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}诚然,这种方式能够正常工作,对使用旧版本 MyBatis 的用户来说也比较熟悉。但现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
例如:
1
2
3
4 try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
简单解释一下,SqlSession
对象像其他数据库框架中的会话
或指针
作用一样,用于对数据库进行操作。获取SqlSession
需要从SqlSessionFactory
“工厂”中制造,而工厂又需要使用SqlSessionFactoryBuilder
进行”建造”。所以开启SqlSession
步骤一共有三步:
- 首先加载配置文件
mybatis-config.xml
- 将加载的输入流
InputStream
传入SqlSessionFactoryBuilder
中的build
方法进行工厂的建造 - 使用建造好的
SqlSessionFactory
的openSession
方法开启SqlSession
这就是创建mybatisUtil.java
的全部流程,我们一步一步来:smiley:
1. 创建mybatis-config.xml
并加载
在java
文件夹同级目录下的resources
文件夹下建立mybatis-config.xml
文件,复制以下代码
1 |
|
XML文件的头部我们忽略,从<environments>
标签开始,其后default
属性表示使用的是哪一个环境,因为在程序中可能配置多种环境,每一种环境都在<environments>
标签下的<environment>
标签中配置,default
属性的值就是使用的<environment>
标签的ID,此处为development
因为我们只有一个id为development
的环境。
在环境中可以配置参数,用于连接数据库,示例如下
1 | <environment id="development"> |
注意url
中的参数,useSSL
为使用安全连接,useUnicode
为使用Unicode编码,characterEncoding
为设置字符集,serverTimezone
为设置时区,其中参数和参数之间使用&
分隔,但是在XML中,符号&
需要使用&
进行转义才能正常使用
最后的mappers
标签,为程序中所有映射文件的位置,稍后进行介绍
创建好配置的XML文件后,在mybatisUtil.java
中编写代码加载到InputStream
输入流
1 | String Resource = "mybatis-config.xml"; |
在resouces
文件夹下的配置文件我们可以输入文件名,通过Resouces
类就可以索引到并转换成输入流
2. 创建SqlSessionFactory
并创建SqlSession
将上一步生成的文件输入流传入SqlSessionFactoryBuilder
的build
方法中就可以生成SqlSessionFactory
工厂类
1 | SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); |
在使用SqlSessionFactory
工厂类的openSession
方法就可以开启SqlSession
了
1 | SqlSession sqlSession = sqlSessionFactory.openSession(); |
所以完整的mybatisUtil.java
代码如下
1 | package top.hellogjs.utils; |
三、编写数据库表的实体类
实验数据:
在MySQL中建立
mybatis
数据库,数据库中建立user
表,user表中有三列:id
name
psw
建立一个新包top.hellogjs.pojo
在其中建立实体类user.java
(pojo
是Plant Old Java Object
),代码如下
1 | package top.hellogjs.pojo; |
根据上文引用的官方文档可以知道,如果想获得查询的实体实例,首先要获得表的映射,从调用映射的方法获得实体实例,而获得表的映射需要传入该表的映射接口以及知道接口是怎么映射数据库的,这就分别对应了下面要编写的Mapper
接口以及Mapper
配置文件。
再明确一下:Mapper
接口文件是用于创建Mapper
的“模板”,Mapper
配置文件是Mapper
执行方法时的过程。可以简单的理解成配置文件中就是接口中方法的代码,但是实际上,在配置文件中写的要比原本的代码简单清晰许多。
首先新建包top.hellogjs.mapping
用于存放所有mapper
接口和配置文件
创建接口文件UserMapper.java
编写以下代码
1 | package top.hellogjs.mapping; |
接口中getUserList
方法用于返回查询的结果集
其次再编写Mapper
映射器文件,如下所示
1 |
|
在mapper
标签中,namespace
属性是用来连接配置文件和接口文件的,所以其值需要指向接口文件。其中的select
标签中,id即引用下面语句的方法名,resultType
属性是确定返回结果的类型,此处我们传入的实体类就是应返回的类型。mapper
标签下就是执行的SQL语句
1 | ... |
此处的mappers
标签下的每一个mapper
标签,都是在项目中创建的mapper
配置文件,其resource
属性的值就是配置文件的路径,这是为了让mabatis
找到这些配置文件。
五、使用JUnit测试
JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:
1、用于测试期望结果的断言(Assertion)
2、用于共享共同测试数据的测试工具
3、用于方便的组织和运行测试的测试套件
4、图形和文本的测试运行器
取自百度百科
在项目src
文件夹下的test/java
中创建包,包的路径最好和在main中的路径相同,创建包top/hellogjs.mapping
,在包中创建UserMappingTest.java
类,编写以下代码
1 | package top.hellogjs.mapping; |
首先通过第二步编写的mybatisUtil
中获取数据库的sqlSession
,使用其getMapper
方法并传入第四步编写的Mapper
接口类生成映射器Mapper
,生成的映射器可以当作实现了UserMapper
接口的一个类,只不过这个类我们没有编写代码,是通过接口和配置文件生成的。在调用映射器的getUserList
就可以获得之前编写sql语句的查询结果了,最后要关闭对话sqlSession
六、添加资源路径
当你好不容易按照步骤编写好了第一个Mabatis程序,可是当右键点击运行的时候,突然发现他居然报错了
1 | java.lang.ExceptionInInitializerError |
没关系,(这是故意让你出错的)我来帮你解决
阅读一下这个错误,Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource top/hellogjs/mapping/UserMapper.xml
很明显,是Mapper配置文件出了问题,程序提示说没有找到UserMapper.xml,这个错误是很常见的,我们需要在test1项目中的pom.xml添加资源文件路径,这样在构建时才可以找到,如下所示
1 | <build> |
添加至pom.xml
中,很明显,它的作用是指出路径,让程序在这些路径下寻找后辍为.properties
和.xml
的文件并且关闭最后的过滤器。注意要点击右上角加载maven变更
此时再运行程序就应该可以看到查询的结果了,这样,第一个MyBatis程序就编写完成了。大致的流程以及各个类和配置文件的关系可以总结成图表
1 | graph TD; |
七、下一步
Mybatis程序大致流程已经介绍,下一步请移步至官方文档,下面将简单介绍一些其他事项
1、增删改查传参
直接传参
直接在接口函数中传入参数,在SQL语句中直接调用
1
2
3public interface UserMapper {
user getUser(int i)
}1
select * from user where id = #{id};
这样写的好处是传参和使用参数都很方便,但是当传入参数大于一个的时候,在SQL语句中调用要使用
param1``param2
…否则会提示变量名未找到。因为实际上这样传入的参数是匿名参数,在接口中定义的参数名并没有在mybatis
中命名,只有一个参数时没有二义性,但两个参数及以上时就无法辨别是哪个参数。使用
@Param
注解在接口函数中参数前使用
@Param
注解,如下所示1
void setUserName(int id, String name) ;
这样在SQL中就可以用
@Param
中参数名去引用使用Map传参
在实际生产中经常使用,使用HashMap传入参数,在SQL可以直接用变量名获取
1
void setUserName(Map params);
1
2
3<update id="setUserName" parameterType="map">
update user set name = #{name} where id = #{id};
</update>在调用时传入参数
1
2
3
4Map params = new HashMap<>();
params.put("id",6);
params.put("name","gjss");
mapper.setUserName(params);