搜档网
当前位置:搜档网 › 【黑马程序员】极简Mybatis之旅(一):CRUD

【黑马程序员】极简Mybatis之旅(一):CRUD

【黑马程序员】极简Mybatis之旅(一):CRUD
【黑马程序员】极简Mybatis之旅(一):CRUD

【黑马程序员】极简Mybatis之旅(一):CRUD

mybatis的配置文件里,主要是config和mapper。config定义了全局参数:数据源类型(POOL, UNPOOLED, JNDI)、事务管理类型(默认为managed)、库url、账户信息和mapper文件路径。

config配置

[Java] 纯文本查看复制代码

?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17

value="com.mysql.jdbc.Driver" />

value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" />

value="yourusername" />

value="yourpassword" />

DBNAME='test',是mybatis默认分配的库:

mapper配置

首先我们要问自己以下三个问题:

为什么要配置mapper文件?

怎么配置mapper文件?

mybatis如何解析mapper文件?

mapper文件的作用

mapper文件提供一种持久化层与应用层的"通信协议",通过mysql关键字resultMap, parameterType等维护应用代码DO对象与持久化存储数据之间的

关联关系。

mapper文件里定义了select, insert, update, delete四种常用的DML语句,并定义statement={mapper namespace}.{operation}实现在应用代码层执行

调用DB操作。

配置mapper文件

这里先给出测试用例用到的mapper配置文件的关键部分:

[AppleScript] 纯文本查看复制代码

?

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

insert into user

(

user_id,

user_name,

password,

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

age)

values

(

#{userId},

#{userName},

#{password},

#{age}

)

select LAST_INSERT_ID() as id

UPDATE user

SET user_name = #{userName}

, password = #{password}

, age = #{age}

WHERE user_id = #{userId}

DELETE FROM user

WHERE user_id = #{userId}

mapper namespace定义了DML语句的作用范围,那如果两个不同的mapper 文件定义相同的namespace会发生什么?由于mysql保持namespace的全局唯一性,所以在解析mapper文件时mysql会抛异常提示开发者修改mapper 文件以保持namespace的全局唯一性。

resultMap

resultMap关键字将代码和持久化层的数据映射抽象出来,用户无需关心两者之

间如何映射。

我们可以使用HashMap完成代码和持久化层的数据映射关系,不但缺乏通用型且代码层需要将对象转换成map结构。resultMap接受HashMap结构和

JavaBean或者POJO对象,提供轻量级的参数映射方案。resultMap有"别名"的功能,你无需每个DML都写一大串的映射语句,秉着"

仅定义一次"的原则,我们可以这么做:

[AppleScript] 纯文本查看复制代码

?

01 02 03 04 05 06 07 08 09 10

'#'和'$'

从"代码清单-1"里可以看出,占位符#和分别实现了POJO和DB数据的映射关系以及非转义的串。用′分别实现了POJO和DB数据的映射关系以及非转义的串。用′'关键字接受用户输入的方式可能导致sql注入攻击,不可取!

mybatis如何解析mapper文件

To be continued...

测试用例

[AppleScript] 纯文本查看复制代码

?

0 1 0 2 0 3 0 4/**

* Created by fujianbo on 2018/4/22. *

* @author fujianbo

* @date 2018/04/22

*/

public class TestMybatis {

@Test

0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6

public void testQuery() {

SqlSession sqlSession = buildMySqlEnv("config.xml");

List userList =

sqlSession.selectList("https://www.sodocs.net/doc/3515126303.html,erMapper.query");

for (User p : userList) {

System.out.println(p);

}

}

@Test

public void testInsert() {

SqlSession sqlSession = buildMySqlEnv("config.xml");

User user = new User();

user.setUserId(124L);

user.setAge(26);

user.setPassword("test_123");

user.setUserName("芸Rey");

if

(sqlSession.insert("https://www.sodocs.net/doc/3515126303.html,erMapper.insert", user) > 0) {

https://www.sodocs.net/doc/3515126303.html,mit();

}

}

@Test

public void testUpdate() {

SqlSession sqlSession = buildMySqlEnv("config.xml");

User user = new User();

user.setUserId(124L);

user.setAge(26);

user.setUserName("芸Rey");

user.setPassword("test_modified");

if

(sqlSession.update("https://www.sodocs.net/doc/3515126303.html,erMapper.update", user) > 0) {

https://www.sodocs.net/doc/3515126303.html,mit();

}

}

@Test

public void testDelete() {

SqlSession sqlSession = buildMySqlEnv("config.xml");

User user = new User();

user.setUserId(123L);

2 7 2 8 2 9

3 0 3 1 3 2 3 3 3

4 3

5 3

6 3

7 3

8 3

9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8

if

(sqlSession.update("https://www.sodocs.net/doc/3515126303.html,erMapper.delete", user) > 0) {

https://www.sodocs.net/doc/3515126303.html,mit();

}

}

private static SqlSession buildMySqlEnv(String resource) {

try {

return new SqlSessionFactoryBuilder()

.build(org.apache.ibatis.io.Resourc es.getResourceAsStream(resource))

.openSession();

} catch (IOException e) {

System.out.printf("Failed to build mysql environment!");

return null;

}

}

}

4

9

5

5

1

5

2

5

3

5

4

5

5

5

6

5

7

5

8

5

9

6

6

1

6

2

6

3

ost_newreply

相关主题