三、MyBatis系列:Mapper 映射 之 通过mapper映射文件来读取数据库记录
在使用Mybatis从数据库中获取记录时,仅编写一个映射xml文件即可。这便是mybatis的强大之处,据说可以比普通jdbc要节省95%的代码。
先来看看如何获取记录,工程配置请参考《一、MyBatis系列:第一个MyBatis工程》:
1、Mapper配置文件内容
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace="test"> 5 <select id="getUserById" parameterType="int" resultType="map"> 6 SELECT * FROM user where id = #{value} 7 </select> 8 <select id="getUsers" resultType="map"> 9 SELECT * FROM user 10 </select> 11 </mapper>
理解一下节点元素:
- mapper : 该映射文件的根节点,所有配置均填写在内;
- namespace :该映射所属的命名空间;
- select :表示用于读取记录的节;
- id :命名空间下的唯一标识;
- parameterType : 传入该SQL语句的参数类型,可接收的类型有简单类型,pojo类型,map 类型等;
- resultType : 该语句的返回类型,可以为简单类型,pojo类型,map 类型等;
- SELECT * FROM user : 用户编写的标准SQL语句,用于查询想要的结果;
- #{value} : 如果传入的参数类型是一个简单类型,那么 value 可以用任何字母书写;
注意 parameterType 是不接受多个参数的,如果存在多个参数,需要封装为一个 POJO 类型。
2、写一个单元测试读取数据记录
1 @Test 2 public void getUsersTest() throws IOException { 3 InputStream stream = Resources.getResourceAsStream("MybatisConfig.xml"); 4 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream); 5 SqlSession sqlSession = factory.openSession(); 6 try { 7 // 读取一条记录,返回 Map 结果类型. 8 Map<Object, Object> user = sqlSession.selectOne("test.getUserById", 1); 9 System.out.println(user); 10 11 // 读取多条记录,返回 List<Map> 结果类型. 12 List<Map<Object, Object>> users = sqlSession.selectList("test.getUsers"); 13 System.out.println(users); 14 } finally { 15 sqlSession.close(); 16 } 17 }
查看日志输出:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 603650290.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23faf8f2]
DEBUG [main] - ==> Preparing: SELECT * FROM user where id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
{birthday=2014-07-10, address=北京市, sex=2, id=1, username=王五, attrs={"参数1":"参数值1"}}
DEBUG [main] - ==> Preparing: SELECT * FROM user
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 6
[{birthday=2014-07-10, address=北京市, sex=2, id=1, username=王五, attrs={"参数1":"参数值1"}}, {birthday=2014-07-10, address=北京市, sex=1, id=10, username=张三, attrs={"参数1":"参数值1"}}, ..... }]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23faf8f2]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@23faf8f2]
DEBUG [main] - Returned connection 603650290 to pool.