【黑马程序员】极简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 SELECT * FROM user; 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 SELECT * FROM user ORDER BY ${id}; '#'和'$' 从"代码清单-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 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