这篇文章来自我的博客
正文之前
在使用 SSM 对之前所做的小项目重构了之后,发现需要写几篇文章来总结一下各个部件的用法,先写几篇关于 Mybatis 的文章,正好补缺补漏顺便总结一下
主要内容:
- Mybatis 简介
- 测试项目构建
- 配置文件
- 增删改查
正文
1. Mybatis 简介
引用官网的介绍:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
总而言之,是个框架就对了
2. 测试项目构建
要使用 Mybatis,我们需要先导入两个包:
mybatis-3.4.6
mysql-connector-java-5.1.46
我们先创建所要用到的包和类:
-
Product 是实体类,对应数据库中的表
-
db.properties 是外部配置数据库信息的文件
-
SqlMapConfig 是 Mybatis 的配置文件(文件名不固定)
-
ProductMapper.xml 是对应的映射文件
-
ProductTest 是测试类
lib 包中的其他文件是日志文件和单元测试文件
使用到的数据库中的表为 product 表:
创建实体类 Product :
3. 配置文件
关于 Mybatis 的信息都在 SqlMapConfig.xml
文件中
1. 配置环境
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>
<!-- 配置的环境,可以有多个环境来对应多种数据库,至少要有一个环境 id 与此对应 -->
<environments default="mysql">
<!-- 这里的环境 id,就是具体某个数据库的 id -->
<environment id="mysql">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
<!--
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
-->
</environments>
</configuration>
2. 事务管理和数据源
<transactionManager type="JDBC"/>
<dataSource type="POOLED"></dataSource>
事务管理有两种:JDBC 和 MANAGED,我们就关注 JDBC,它其实就是使用了 JDBC 的设置来进行管理、
数据源有三种:
-
UNPOOLED:在请求时打开和关闭连接,如果对数据库的使用较为频繁,则不适用此方式,太浪费时间
-
POOLED:连接池,最常用的方式,一开始创建一定数量的连接,即用即取,用完归还
-
JNDI:为了能在如 EJB 或应用服务器这类容器中使用
3. 数据库信息
有关数据库的信息可以直接写在配置文件里面:
不过,通常的做法是在外部创建一个 db.properties
文件:
然后用外部配置来替换这些属性的值,只是引用外部配置文件需要在配置数据源之前进行:
关于 Mybatis 的系统配置就先到这,接下来是实体类相关的一个映射文件 ProductMapper.xml 的配置
4. 映射文件
在实体类的映射文件中写明了你要进行什么操作:
接下来解释这个文件:
mapper 映射器:需要定义命名空间,因为后面调用的时候要用到
select 元素:对应 SQL 中的查询操作,id 指的是这个查询操作的名称,调用它的时候需要使用这个 id, resultType 指的是返回类型,我这里查询出的每一条记录都指定为 Product 类型,相类似的还有 update、insert 和 delete 元素,对应相关的的 SQL 操作
5. 加载映射文件
把映射文件写完了之后,我们需要告诉 Mybatis 去哪里找这些 SQL 语句,所以我们在 Mybatis 配置文件里写出路径:
<mappers>
<mapper resource="mapper/ProductMapper.xml"/>
</mappers>
4. 增删改查
首先我们先说一下 Mybatis 是怎么用的:
-
Mybatis 中有一个工具类叫 Resources,使用它来加载你的配置文件
-
SqlSessionFactoryBuilder 根据配置的 XML 文件(我们这里就是指 SqlMapConfig.xml)中的 <configuration> 元素来创建一个 SqlSessionFactory 实例
-
Mybatis 应用是以一个 SqlSessionFactory 的实例为中心来展开工作的
//配置文件的位置是基于我这个测试项目来写的
String resource = "config/SqlMapConfig";
//输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
然后得到 SqlSession 的实例,就可以用来执行 SQL 语句了:
SqlSession sqlSession = sqlSessionFactory.openSession();
1. 增加记录
我们先在映射文件中写一个增加记录的操作:
<insert id="insertProduct" parameterType="bean.Product">
INSERT INTO product VALUES
(#{id}, #{barcode}, #{name}, #{units}, #{purchasePrice}, #{salePrice}, #{inventory})
</insert>
这里的 #{} 是一个占位符,就相当于 SQL 中的 ? 符号,添加的参数类型是 Product 类型的
然后我们在测试类中进行添加操作:
这里的 insert 操作的第一个参数就是用来定位 SQL 语句的,它是命名方式是映射文件的命名空间.SQL语句的 ID,然后这第二个参数就是我添加进去的记录,在最后一定要进行提交,否则是无效的,进行测试:
这时候查看表中的所有记录就会发现刚才的操作是成功的:
2. 删除记录
<delete id="deleteProduct" parameterType="String">
DELETE FROM product
WHERE id = #{id}
</delete>
根据 ID 来删除商品,这里的参数类型是 String
@Test
public void test() throws IOException{
String resource = "config/SqlMapConfig";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("ProductMapper.deleteProduct", "123");
sqlSession.commit();
}
运行之后就能看到我们第一步添加进去的商品被删除了:
3. 修改记录
我们也是根据商品 ID 来修改记录,只不过参数类型是 Product:
<update id="updateProduct" parameterType="bean.Product">
UPDATE product SET
barcode = #{barcode},
name = #{name},
units = #{units},
purchasePrice = #{purchasePrice},
salePrice = #{salePrice},
inventory = #{inventory}
WHERE id = #{id}
</update>
在测试中,我们创建一个商品的实例,然后用这个实例来替换掉数据库中的相对应的记录:
Product product = new Product("1F01DC70F9A64B2CBB52B92C41FBCC9E", "123",
"T-shirt", "piece", "50", "100", "10");
sqlSession.update("ProductMapper.updateProduct", product);
sqlSession.commit();
然后就会发现表中的第一条记录已被更改:
4. 查询记录
我们用一个列表来存放表中的所有数据,这里没有用到参数,只要定义返回类型就可以了:
<select id="findAllProducts" resultType="bean.Product">
SELECT * FROM product
</select>
这里不需要 commit,我们并没有提交至数据库中,只是查询:
List<Product> list = sqlSession.selectList("ProductMapper.findAllProducts");
for (Product p :
list) {
System.out.println(p);
}
然后就能看到 5 条记录:
总结
若想要成功地使用 Mybatis,总共有三个要点:
1. SqlMapConfig.xml(Mybatis 配置文件)
这是 Mybatis 的核心,这里面配置了数据库的基本信息以及映射文件的加载信息等
2. 实体类、接口
也就是 POJO(Plain Old Java Objects,普通的 Java对象),我们这篇文章中的 Product 实体类,关于接口,我们这一篇文章中没有说明,接口是对应映射文件存在的,接口的命名和映射文件同名,这个在之后将 Mybatis 逆向工程的时候会说到
3. 映射文件
映射文件就是我们上面写到的 ProductMapper.xml,它的作用不仅仅是带有 SQL 语句,还能将 POJO 映射成为数据库中的记录,所以我们刚才才能够使用占位符进行增删改查操作或将查询结果映射为POJO
网友评论