Mybatis的使用(一)

Mybatis简介

对于Mybatis官方的定义我不在这里记录了,百度百科有很详细的说明。我理解的是它作为一个三方操作数据库的工具,提供了对数据库连接,操作的功能,能够实现原生SQL所能实现的绝大部分功能,与Hibernate不同的是,它是一个半ORM框架,只提供了对数据库表进行对象映射,但是并没有封装SQL,需要我们自己去写SQL语句来进行操作。Python中的Sqlalchemy是同时具有Hibernate和Mybatis的功能的,通过程序员自己配置来选择是使用ORM还是非ORM,我以往都是使用Sqlalchemy来进行原生SQL来进行数据处理,很少用ORM。

需要的jar包和配置文件

需要用到两个jar包,我这里就直接使用Maven来导入jar包:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>

需要两种类型的配置文件,一种是核心配置文件,一种是与dao(mapper)接口相映射的XML文件。还有一种可选的配置文件,用于存储数据库连接信息:

  • 核心配置文件mybatis-config.xml:用于配置加载哪个数据源,是否开启延迟加载,是否使用二级缓存,实体类别名,mapper文件扫描等
  • mapper映射文件mapper.xml:用于编写SQL语句
  • 数据库配置信息文件db.properties:存放数据库连接信息

db.properties的内容为:

1
2
3
4
5
6
7
8
# jdbc驱动
jdbc.driver=com.mysql.jdbc.Driver
# 数据库统一资源定位符
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC
# 用户名
jdbc.username=root
# 密码
jdbc.password=root

mybatis-config.xml中配置较多,根据业务需求来进行选择性配置,我这里就简单的配置一下,主要记录一下大体结构和约束信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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="db.properties" />

<!--延迟加载,默认为false-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>

<!--为实体配置别名-->
<typeAliases>
<package name="com.example.entity"/>
</typeAliases>

<!--配置dataSource-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<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>
</environment>
</environments>

<!--扫描mapper-->
<mappers>
<package name="com.example.mapper"/>
</mappers>

</configuration>

mapper.xml中主要是根据业务来编写SQL语句,所以这里我就记录一下大概结构和约束信息:

1
2
3
4
5
6
7
8
9
<?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的作用是表明该xml关联到哪个mapper类-->
<mapper namespace="com.example.mapper.HusbandMapper">


</mapper>

编写SQL的两种方式

Mybatis提供了两种编写SQL方式,一种是通过mapper.xml来进行SQL的编写,还有一种是使用注解的方式在mapper接口里进行SQL的编写。根据高内聚低耦合的思想,使用注解的方式应该是不太提倡的,通过XML的方式是可以实现解耦的,如果是工具开发的话,就没那么多要求了,怎么快怎么来就行。

XML的方式配置文件我就不再记录了,上面是有的。使用这种方式需要注意两点:1.在不使用spring整合的情况下,要将mapper和mapper.xml放在同一个文件夹下,且名字相同 2.使用Maven的情况下,Maven默认是不会将非resources文件夹下的xml文件构建进target中的,需要在pom.xml中配置来让Maven将xml文件一起构建进target:

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>

通过注解的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface HusbandMapper {

// 一对多查询
@Select("SELECT * FROM husband WHERE hid = #{hid}")
@Results({
//需要映射的字段
// @Result(id = true, column = "hid", property = "hid"),
@Result(column = "hid", property = "hid"),
// 如果是一对一,则把many=@Many改成one=@One
@Result(column = "hid", property = "wifes", many=@Many(select = "findWifeById"))
})
public Husband findById(int hid);

@Select("SELECT * FROM wife WHERE hid = #{hid}")
public List<Wife> findWifeById(int hid);
}