MyBatis HelloWorld

1. 环境搭建

1.1. pom.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- log4j 用于输出mybatis日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
</dependencies>

<build>
<!-- resources标签 指定Maven构建项目时,要包含哪些资源文件
1、默认情况下,Maven构建时只包含src/main/resources下的资源文件,其它目录,如src/main/java下的资源文件会被Maven忽略
2、因为本项目Mapper配置文件放在src/main/java中,所以要指定包含这样资源文本
3、设定了<resources>,那么默认的src/main/resources就会失效,所以src/main/resources还要额外指定
-->
<resources>
<!-- 包含自定义位置的资源文件 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- 包含默认位置的资源文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>

1.2. 实体类

1
2
3
4
5
6
@Data
public class Person {
private Long personId;
private String name;
private Date birthday;
}

1.3. Mapper

1
2
3
4
5
6
public interface PersonMapper {
Person findById(Long personId);
int deleteById(Long personId);
int updateById(Person person);
int insert(Person perosn);
}

1.4. SQL映射配置

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
<?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的全类名 -->
<mapper namespace="demo.mybatis.mapper.PersonMapper">
<select id="findById" resultType="demo.mybatis.entity.Person">
SELECT * FROM person WHERE person_id = #{personId}
</select>
<delete id="deleteById">
DELETE FROM person WHERE person_id = #{personId}
</delete>
<insert id="updateById">
UPDATE person
SET name = #{name}, birthday = #{birthday}
WHERE person_id = #{personId}
</insert>
<insert id="insert">
INSERT INTO person
(name, birthday)
VALUES
(#{name}, #{birthday})
</insert>
</mapper>

1.5. log4j配置文件

添加log4j.properties。Mybatis默认使用log4j输出日志信息,所以如果要将执行的SQL语句输出到控制台,需要在CLASSPATH(src目录)下添加log4j.properties,内容如下:

1
2
3
4
5
6
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

1.6. MyBatis全局配置文件

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
<?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>
<settings>
<!-- 支持属性使用驼峰的命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/test?useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<mappers>
<!-- 声明SQL映射文件所在位置 -->
<mapper resource="demo/mybatis/mapper/Person.xml"/>
</mappers>
</configuration>

1.7. 测试方法

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class MabatisTest {
SqlSessionFactory sqlSessionFactory = null;

@Before
public void setup() throws IOException {
// 根据全局配置文件创建SqlSessionFactory,SqlSessionFactory负责创建SqlSession
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}

@Test
public void findById() throws IOException {
// 创建SqlSession。SqlSession代表与数据库之间的一次会话,底层就是封装了JDBC的Connection
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 获取Mapper,执行相应的操作
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Person person = mapper.findById(1L);
System.out.println(person);
} finally {
sqlSession.close();
}
}

@Test
public void insert() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
for (int i = 0; i < 10; i++) {
Person person = new Person(null, "name" + i, new Date());
int result = mapper.insert(person);
System.out.println("result = " + result);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}

@Test
public void deleteById() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
int result = mapper.deleteById(1L);
System.out.println("result = " + result);
// 增删改必须commit
sqlSession.commit();
} finally {
sqlSession.close();
}
}

@Test
public void updateById() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Person person = new Person(5L, "Jack", new Date());
mapper.updateById(person);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}

2. 全局配置文件和SQL映射文件

全局配置文件:MyBatis的全局配置
SQL映射文件:Mapper接口的实现描述

3. 查看Mapper接口的实现类

查看Mapper接口的实现类,可以看到是动态代理

1
2
3
4
5
6
7
8
9
10
@Test
public void test() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
System.out.println(mapper.getClass()); // com.sun.proxy.$Proxy
} finally {
sqlSession.close();
}
}
panchaoxin wechat
关注我的公众号
支持一下