简介:从0使用注解配置MyBatis。
目录
1. 基本环境搭建
1.1 创建maven工程
这里选择是就是默认的选项:
简单的取名和确定文件夹位置即可。
1.2 配置maven仓库(可选)
可以使用默认的仓库。如果觉得下载依赖的速度太慢,也可以配置一下远程仓库。
1.3 导入依赖
pom.xml文件如下,这里的依赖主要有四个,详情见注释:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式-->
<packaging>jar</packaging>
<!--导入依赖-->
<dependencies>
<!-- mabatis相关包,必选-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mysql依赖,必选-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 单元测试,可选-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 日志输出,可选-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
2. 建表和实体类
这里简单起见,就先只创一个人类表(human),里面只有两个字段,id和name。id为主键,自增长。
实体类如下(包结构如下图):
3. 创建dao接口
创建dao接口,来对human表进行基本操作。我们先只声明一个查询所有方法:
到此,基本的配置就准备好了,下面开始进行MyBatis框架的相关配置
4. 框架主配置文件
一般命名为:SqlMapConfig.xml
,该文件在IDEA中一般是放在resource资源目录下的:
<?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="jdbcConfig.properties"></properties>
<typeAliases>
<package name="com.hello.domain"/>
</typeAliases>
<!-- 配置properties-->
<!--配置环境-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务 -->
<transactionManager type="JDBC"/>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<!--指定要扫描的接口-->
<package name="com.hello.dao"/>
</mappers>
</configuration>
上述配置文件中,有这样几个重要的标签:
typeAliases
标签,给实体类取别名,以后在需要写实体类的地方,不需要写全限名➕类名,而是只要写类名就行,并且不区分大小写。properties
标签,我们把连接数据库所需要的数据源放到了外部文件jdbcConfig.properties
中,该文件内容如下:
引入过后,在下面的dataSource
标签中,就可以去使用该配置文件中的值:
mappers
用来指定xml配置文件和接口的映射,不过这里使用的是注解的方式,所以我们在此指定了需要扫描的接口,这里填的是包名,表示该包下所有接口都可使用注解:
5. 使用注解进行查询所有
仅仅需要在接口的方法上,写上@Select注解,就可以完成对该方法的实现。返回的结果,会被自动封装到相应的对象中。不过由于没有resultMap的映射,所以属性名和表字段不同的话,要取别名。
编写测试类进行测试
public class MyBatisAnnoTest {
private InputStream in;
private SqlSession sqlSession;
private HumanDao dao;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
sqlSession = factory.openSession();
dao = sqlSession.getMapper(HumanDao.class);
}
@After
public void close() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
}
@Test
public void findAll() throws IOException {
List<Human> humans = dao.findAll();
for (Human h :
humans) {
System.out.println(h);
}
}
}
现在,注解的一个入门使用,就已经完成了,下面用来展示注解的更多使用场景
6. 注解进行CRUD的实现
刚才我们仅仅实现了“查询所有”这一功能。现在我们把接口的功能扩展一下:
👆上面分别展示了增删改和查询所有即查询单个👆
下面展示的是模糊查询。
接口方法和注解实现:
测试方法和结果
该方法也可以用${value}的形式去写:
这样在传值的时候,就不用写百分号了:
7. 进行resultMap映射
xml的配置中,是可以进行resultMap映射,从而解决名称不一致以及多表查询的问题。在注解开发中,我们使用该功能的方式如下:
7.1 属性和列进行映射
在方法的下方写上Results注解,该注解有一个id属性用来表示此注解,在标签中可以写很多的Result注解,每个Result注解就是用来指定列和属性的对应关系,如果该列是主键,那么就把id属性设为true。
在其它的查询方法中,如果想要使用一样的映射,就可以用ResultMap注解,并填入那个Map的id值。
7.2 一多一和一对多的关联查询
例子如图:
- 对一
@Results(id = "id",value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "col1", property = "c1"),
@Result(column = "col2", property = "c2"),
@Result(column = "col3", property = "c3"),
@Result(column = "col4", property = "c4",
one = @One(select = "关联表dao接口的全限名的某方法",fetchType = FetchType.EAGER)
)
})
- 对多
@Results(id = "id",value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "col1", property = "c1"),
@Result(column = "col2", property = "c2"),
@Result(column = "col3", property = "c3"),
@Result(column = "col4", property = "c4",
many = @Many(select = "关联表dao接口的全限名的某方法",fetchType = FetchType.LAZY)
)
})
这其中增加的东西,就在于关联属性和列名的映射,如果是对一关系,就用one,对多就用many,格式如上。里面还有一个fetchType属性,是用来指定查询是否是延迟加载的,LAZY为延迟加载,EAGER为立即加载。
8. 二级缓存
在配置文件开启(默认就开启):
<settings>
<setting name="cacheEnabled" value="true">
</settings>
然后在dao接口上,写上@CacheNamespace(blocking = true)
即可。