Mybatis 坑路3 -> 基于 XML 配置映射器

基于 XML 配置映射器

映射器配置文件和映射器接口

INSERT 语句

UPDATE 语句

DELETE 语句

SELECT 语句

结果集映射 ResultMap

拓展 ResultMap

一对一映射

一对多映射

基于 XML 配置映射器

  关系型数据库和 SQL 是经受时间考研和验证的数据存储机制。和其他的 ORM 框架如 Hibernate 不同,MyBatis 鼓励开发者考研直接使用数据库,而不是将其对开发者隐蔽,因为这样考研充分发挥数据库服务器所提供的 SQL 语句的巨大威力。与此同时,MyBatis 消除了书写大量冗余代码的痛苦,它让使用 SQL 更容易。
  在代码里直接嵌套 SQL 语句是很差的编码实践,并且维护起来困难。MyBatis 使用了映射器配置文件或注解来配置 SQL 语句。在以下的学习中,我们会看到具体怎样使用映射器配置文件来配置映射器 SQL 语句。

映射器配置文件和映射器接口

  在 xx.mybatis3.mappers 包中的 StudentMapper.xml 配置文件内,配置 id 为 “findStudentById” 的 SQL 语句:




	

通过下列代码调用 findStudentById 映射的 SQL 语句:

public Student findStudentById(Integer studId){
	SqlSession sqlSession = MyBatisUtil.getSqlSession();
	try{
		Student student = sqlSession.selectOne("xx.mybatis3.mappers.StudentMapper.findStudentById",studId);
		return student;
	} finally {
		sqlSession.close();
	}
}

INSERT 语句

  MyBatis 提供了多种元素来配置不同类型的语句,如 SELECT,INSERT,UPDATE,DELETE。接下来让我们看看如何具体配置映射语句:

INSERT 语句:


	INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,PHONE) VALUES(#{studId},#{name},#{email},#{phone})

  在上述的 INSERT 语句中,我们为可以自动生成(auto-generated)主键的列 STUD_ID 插入值。我们可以使用 useGeneratedKeys 和 keyProperty 属性让数据库生成 auto_increment 列的值,并将生成的值设置到其中一个输入对象属性内,如下所示:


	INSERT INTO STUDENTS(NAME,EMAIL,PHONE) VALUES (#{name},#{email},#{phone})

  这里 STUD_ID 列值将会被 MySQL 数据库自动生成,并且生成的值会被设置到 student 对象的 studId 属性上。
  有些数据库如 Oracle 并不支持 AUTO_INCREMENT 列,其使用序列(SEQUENCE)来生成主键值。
  假设我们有一个名为 STUD_ID_SEQ 的序列来生成 SUTD_ID 主键值。使用如下代码来生成主键:


	
		SELECT ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL
	
	INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,PHONE) VALUES (#{studId},#{name},#{email},#{phone})

  这里我们使用了 子元素来生成主键值,并将值保存到 Student 对象的 studId 属性上。属性 order=“before” 表示 Mybatis 将取得序列的下一个值作为主键值,并且在执行 INSERT SQL 语句之前将值设置到 studId 属性上。

UPDATE 语句


	UPDATE STUDENTS SET NAME=#{name},EMAIL=#{email},PHONE=#{phone} WHERE STUD_ID = #{studId}

DELETE 语句


	DELETE FROM STUDENTS WHERE STUD_ID = #{studId}

SELECT 语句

  MyBatis 真正强大的功能,在于映射 SELECT 查询结果 JavaBeans 方面的极大灵活性。


  如果检查 Student 对象的属性值,你会发现 studId 属性值并没有被 stud_id 列值填充。这是因为 MyBatis 自动对 JavaBean 中属性名匹配的别名:

SELECT STUD_ID AS STUDID

SQL 语句

  通过 SQL 标签定义的语句可以被其他语句通过 include 进行引用。在不同引用情况下可以传递不同的参数,例如:

${alias}.id,${alias}.username,${alias}.password

Sql 标签也可以被嵌套使用,如:

SQL语句


	${prefix} Table


	from 


结果集映射 ResultMap

  ResultMap 被用来将 SQL SELECT 语句的结果集映射到 JavaBeans 的属性中。我们可以定义结果集映射 ResultMap 并且在一些 SELECT 语句上引用 resultMap。MyBatis 的结果集映射 ResultMap 特性非常强大,可以使用它降简单的 SELECT 语句映射到复杂的一对一和一对多关系的 SELECT 语句上。
一个简单的 ResultMap:


	
	
	
	



resultType 和 resultMap 二者只能用其一,不能同时使用。

将结果集映射到 Map

1、sqlMapper.xml 文件的配置


	SELECT STUD_ID,NAME,EMAIL,A.ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY FROM STUDENTS S LEFT OUTER JOIN ADDRESSES A ON S.ADDR_ID=A.ADDR_ID WHERE STUD_ID=#{studId}

  我们可以使用圆点记法为内嵌的对象的属性赋值。在上述的 resultMap 中,Student 的 address 属性使用了圆点记法被赋上了 address 对应列的值。同样地,我们可以访问任意深度的内嵌对象的属性。
  使用一个嵌套结果 ResultMap 方式来获取 Student 及其 Address 信息:


	
	
	
	
	
	


	
	
	
	

  元素被用来导入"有一个"(has-one)类型的关联。在上述的例子中,我们使用了元素引用了另外一个在同一个 XML 文件中定义的 。我们也可以使用定义内嵌的 resultMap:


	
	
	
	
		
		
		
		
		
		
	

  可以通过使用嵌套 select 查询来获取 Student 及其 Address 信息:


	
	
	
	
	
	




	
	
	
	


  在此方式中,元素的 select 属性被设置成了 id 为 findAddressById 的语句。这里,两个分开的 SQL 语句将会在数据库中执行,第一个调用 findStudentById 加载 student 信息,而第二个调用 findAddressById 来加载 address 信息。

一对多映射

  使用元素将一对多类型的结果映射到一个对象集合上。
  和一对一映射一样,我们可以使用嵌套结果 ResultMap 和嵌套 Select 语句两种方式映射实现一对多映射。
嵌套结果 ResultMap:


嵌套 Select 语句:


你可能感兴趣的:(Java,javaee,mybatis,mysql)