1. 映射
1.1. select
select语句有以下几种情况:
(1)查找单条记录。
(2)查找多条记录。
如果直接使用SqlSession接口来获取查询结果,则应使用selectOne()方法来查询单条记录,使用selectList()方法来查询多条记录。
本文采用没有采用这种方式,而是使用Mapper接口的方式来获取查询结果。为了节省篇幅和直奔主题,本文没有定义Service接口及其实现类,而是在单元测试代码中使用Mapper接口调用相应方法。
1.1.1. 查找单条记录
(1)PersonMapper.xml文件的配置:
<!-- findPersonById:根据id查找单个记录。 id: findPersonById,SQL语句的ID,应该与PersonMapper接口的findPersonById方法一一对应。 parameterType:参数的Java类型。 resultType:结果的Java类型。 --> <select id="findPersonById" parameterType="java.lang.String" resultType="com.test.mybatis3.pojo.Person"> select * from t_person where id=#{id} </select>
#{id}表示SQL语句在此处有一个占位符,整个SQL语句类似如下效果:
select * from t_person where id=?
MyBatis会自动将合适的参数绑定到此占位符,原理上类似于下面的代码片段:
String sql = "select * from t_person where id=?"; PreparedStatement ps = connection.prepareStatement(sql); String id = "zhangsan"; ps.setString(1, id);
MyBatis会自动将SQL语句执行后得到的记录中的字段值按照字段名称去匹配parameterType属性指定的Java类型的对象的同名属性中。
class Person private String id; private String name; private int status; //此处将get,set方法省略了。 }
t_person表的查询结果记录中,id字段的值赋值到Person对象的id属性,name字段赋值到name属性,status字段赋值到status属性。
(2)PersonMapper.java文件:
public interface PersonMapper { /** * 根据ID查找单个记录。 * *@param id */ Person findPersonById(String id) throws Exception; }
(3)测试代码:
为了节省篇幅,省略了一些跟本部分主体关系不大的代码。
//打开Session。 session = sessionBuilder.openSession(); //找到MyBatis自动实现的PersonMapper接口的代理对象。 PersonMapper personMapper = session.getMapper(PersonMapper.class); //根据id进行查找。 Person person = personMapper.findPersonById("zhangsan"); System.out.println(person);
(4)运行结果:
查询到1条记录。
by Mapper
0 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findPersonById - ==> Preparing: select * from t_person where id=?
46 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findPersonById - ==> Parameters: zhangsan(String)
68 [main] TRACE com.test.mybatis3.mapper.PersonMapper.findPersonById - <== Columns: id, name, status
68 [main] TRACE com.test.mybatis3.mapper.PersonMapper.findPersonById - <== Row: zhangsan, zhang san, 0
71 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findPersonById - <== Total: 1
Person [id=zhangsan, name=zhang san, status=0]
1.1.2. 查找多条记录
当select语句的查询结果为多条记录时,Mapper接口相应方法的返回值应该是集合类型。
(1)PersonMapper.xml文件:
定义Select语句如下:
<!-- findAllPersons:查询所有记录。 resultType:结果是集合类型时表示集合中元素的Java类型: 本例中Mapper接口方法的返回值为List<Person>。 --> <select id="findAllPersons" resultType="com.test.mybatis3.pojo.Person"> select * from t_person order by id asc </select>
(2)PersonMapper.java文件:
定义PersonMapper接口方法如下:
/** * 查询所有记录。 * 对应于PersonMapper.xml文件中的id为findAllPersons的select语句。 * @return * @throws Exception */ List<Person> findAllPersons() throws Exception;
(3)测试代码:
//打开Session。 session = sessionBuilder.openSession(); //找到MyBatis自动实现的PersonMapper接口的代理对象。 PersonMapper personMapper = session.getMapper(PersonMapper.class); //调用PersonService接口的findAllPersons()方法, //内部会执行PersonMapper的findAllPersons()方法。 List<Person> persons = personMapper.findAllPersons(); //输出查询结果。 for(Person person : persons){ System.out.println(person); }
(4)运行结果:
找到2条记录。
by Mapper
0 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findAllPersons - ==> Preparing: select * from t_person order by id asc
47 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findAllPersons - ==> Parameters:
149 [main] TRACE com.test.mybatis3.mapper.PersonMapper.findAllPersons - <== Columns: id, name, status
149 [main] TRACE com.test.mybatis3.mapper.PersonMapper.findAllPersons - <== Row: lisi, li si, 0
151 [main] TRACE com.test.mybatis3.mapper.PersonMapper.findAllPersons - <== Row: zhangsan, zhang san, 0
151 [main] DEBUG com.test.mybatis3.mapper.PersonMapper.findAllPersons - <== Total: 2
Person [id=lisi, name=li si, status=0]
Person [id=zhangsan, name=zhang san, status=0]