MyBatis应用开发(8)映射之select语句

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]

时间: 2024-10-05 23:22:33

MyBatis应用开发(8)映射之select语句的相关文章

MyBatis应用开发(10)映射之结果映射resultType

1.1. resultType 1.1.1. 结果为单条记录 查询结果为单条记录时,resultType应该为一个Java Bean类型. select语句的查询结果字段列表可以和resultType指定的Java Bean类型的属性列表不同,字段可以没有对应的属性,属性也可以没有对应的字段,即允许存在多余的字段,或者多余的属性. <!-- findPersonById:根据id查找单个记录. id:SQL语句的ID,应该与PersonMapper接口的findPersonById方法一一对应.

MyBatis应用开发(11)映射之结果映射字段别名和HashMap

1.1.1. 字段别名的特殊功能 通过SQL语句的字段别名功能,可以将记录映射到resultType指定的Java Bean类型的属性的属性上. <!-- 通过定义select语句的字段别名为XXX.YYY的形式,可以将字段值赋值给PersonWrapper类的属性person的属性 --> <select id="findPersonWrapper" parameterType="java.lang.String" resultType=&quo

MyBatis应用开发(14)映射之嵌套查询

1.1.1. 嵌套查询 使用association结点的select属性可以建立嵌套查询.前文介绍的不使用select的方法在主表结果记录集包含N条记录,每个记录对应1条子表记录的情况下,总共执行一条SQL语句就可以满足整个查询操作的要求,而本文介绍的select属性建立嵌套查询的方法,则 需要执行1+N条SQL语句(单向关联),或者1+N*2条语句(双向关联). Mapper配置: <!-- 主表resultMap:Person和IdCard的一对一关联:双向关联,嵌套查询 --> <

MyBatis应用开发(15)映射之一对多关联

1.1.1. 一对多关联 一个Person可以拥有一个或多个Address,而每个Address对应于唯一一个Person,因此Person和Address之间存在一对多的关系.本文介绍使用MyBatis如何进行基于List的一对多映射. Person类: /** * @Title: Person.java * @Package com.test.mybatis3.pojo * @Description: * @author http://www.cnblogs.com/coe2coe/ * @

MyBatis应用开发(12)映射之结果映射resultMap

1.1.1. 使用resultMap映射字段和属性 MyBatis的resultMap可以方便的定义字段和属性之间的映射关系,字段和属性的名称可以相同,也可以不相同. <!-- personResultMap:将t_person的记录的字段映射到SomeBean的属性上 --> <resultMap type="com.test.mybatis3.pojo.SomeBean" id="personResultMap"> <id prop

MyBatis应用开发(13)映射之一对一关联

1.1.1. 一对一单向关联 resultMap可以定义实体之间的一对一关联关系.本文将介绍如何实现Person和IdCard之间的一对一单向关联关系.假定在业务逻辑上存在这样的约束:IdCard的personid属性应该等于Person的id属性,一个Person唯一对应于一个IdCard. 目标:Person可以通过idCard属性导航到IdCard,而IdCard不能通过person属性导航到Person. Person类: /** * @Title: Person.java * @Pac

MyBatis应用开发(9)映射之参数绑定parameterType

1.1. parameterType parameterType表示SQL语句中存在占位符,对应于Mapper接口中对应方法的参数. 当SQL语句中只有一个占位符时,parameterType可以是Java基本类型,也可以是Java Bean类型.当存在多个占位符时,parameterType只能是Java Bean类型. 当为Java基本类型时,可以写类型的全限定名,也可以是MyBatis提供的简化的别名. 别名int表示java.lang.Integer. 别名string表示java.la

MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String" resultMap="studentResultMap"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX

MyBatis XML 映射器 select、insert update 和 delete、参数

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在. 如果跟JDBC 代码进行对比,省掉了将近 95% 的代码. 1 selectCREATE TABLE person (id int(11) NOT NULL AUTO_INCREMENT,username varchar(100) DEFAULT NULL,password varchar(100) DEFAULT NULL,full_name varchar(100) DEFAULT NULL,first_name varchar