mybatis:结果映射resultMap

在mybatis中方法注入,属性名称必须一致:

package com.rl.test;

import static org.junit.Assert.*;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.rl.model.Person;

public class MyBatisTest {

	SqlSessionFactory sessionFactory;
	
	//执行初始化,每一次执行方法前都会先执行此方法
	@Before
	public void setUp() throws Exception {
		
		InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
		sessionFactory = new SqlSessionFactoryBuilder().build(in);
	}

	@Test
	public void test() {
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//通过session进行查询
		try {
			//selectOne:第一个参数:要执行的SQL语句。命名空间.sql的ID
			//selectOne:第二个参数:要传递给SQL的实际参数
			Person person = session.selectOne("com.rl.mapper.PersonTestMapper.selectPersonById", 1);
			System.out.println(person);
		} finally{
			session.close();
		}
		
		
	}

}

对应Person字段:

package com.rl.model;

import java.util.Date;

public class Person {
	
	private Integer id;
	
	private String name;
	
	private Integer gender;
	
	private String address;
	
	private Date birthday;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getGender() {
		return gender;
	}

	public void setGender(Integer gender) {
		this.gender = gender;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", gender=" + gender
				+ ", address=" + address + ", birthday=" + birthday + "]";
	}
	

}

查看测试结果:

如果修改其中的一个字段:将无法注入(修改name字段为name1,从新提供get/set方法):

另外,如果不提供set/get方法,mybatis会根据所给的字段直接匹配赋值:

删除Person中的get/set方法:

package com.rl.model;

import java.util.Date;

public class Person {
	
	private Integer id;
	
	private String name1;
	
	private Integer gender;
	
	private String address;
	
	private Date birthday;


	@Override
	public String toString() {
		return "Person [id=" + id + ", name1=" + name1 + ", gender=" + gender
				+ ", address=" + address + ", birthday=" + birthday + "]";
	}

	

}

测试:

思考,为什么是private属性还可以被获得?

因为反射机制将private去除了,所以能拿到。

对于name字段,在实际开发中,很难避免出现对应错误的情况,这就需要寻找一个可以解决的方案,在实际开发时,字段对应的名称多使用组合单词:

生成脚本:

/*==============================================================*/
/* DBMS name:      MySQL 5.0                                    */
/* Created on:     2019/7/23 11:47:09                           */
/*==============================================================*/


drop table if exists PERSON;

/*==============================================================*/
/* Table: PERSON                                                */
/*==============================================================*/
create table PERSON
(
   PERSON_ID            int(10) not null auto_increment,
   NAME                 varchar(10),
   GENDER               int(1),
   PERSON_ADDR          varchar(50),
   BIRTHDAY             date,
   primary key (PERSON_ID)
);

在数据库中执行:

创建映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper文件命名规范:驼峰模式——数据库表名首字母大写+Mapper(例如:PersonTestMapper) --> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 
	namespace:当前表(映射文件)的命名空间(命名规范:映射文件的包的全路径)
 -->
<mapper namespace="com.rl.mapper.PersonMapper">
	<!-- 
		查询标签(
		id:sql唯一标识、
		parameterType:传递给SQL的参数的数据类型、
		resultType:返回的数据的结果类型、
		要查询的SQL语句,#{id}:用于接收参数的语法{}中的内容,如果是接收一个参数,内容任意
		Preparing: select * from person_test where id = ? (#{ }使用预编译的方式生成SQL语句)
		) 
	-->
	<select id="selectPersonById" parameterType="java.lang.Integer" resultType="com.rl.model1.Person">
		select * from person where person_id = #{id}
	</select>
</mapper>

创建对应实体:

package com.rl.model1;

import java.util.Date;

public class Person {
	
	private Integer personId;
	
	private String name;
	
	private Integer gender;
	
	private String personAddr;
	
	private Date birthday;

	public Integer getPersonId() {
		return personId;
	}

	public void setPersonId(Integer personId) {
		this.personId = personId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getGender() {
		return gender;
	}

	public void setGender(Integer gender) {
		this.gender = gender;
	}

	public String getPersonAddr() {
		return personAddr;
	}

	public void setPersonAddr(String personAddr) {
		this.personAddr = personAddr;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	@Override
	public String toString() {
		return "Person [personId=" + personId + ", name=" + name + ", gender="
				+ gender + ", personAddr=" + personAddr + ", birthday="
				+ birthday + "]";
	}


}

配置映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration  
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根节点 -->
<configuration>
	<!-- 环境配置(连接数据库类型配置),可以配置多个数据库环境,但是使用时只能使用一个,由default决定使用哪个数据库 -->
	<environments default="development">
		<!-- id:唯一标识 -->
		<environment id="development">
			<!-- 事务管理器(后期和spring整合以后,就不需要单独配置事务了,由springMVC统一管理) -->
			<transactionManager type="JDBC" />
			<!-- 数据源(连接池和非连接池) -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 
		映射文件配置(管理每一张表的映射文件)
		resource:引入映射文件
		注意:包之间用/,不能使用.
	 -->
	<mappers>
		<mapper resource="com/rl/mapper/PersonTestMapper.xml" />
		<mapper resource="com/rl/mapper/PersonMapper.xml" />
	</mappers>
</configuration>

如果不添加映射文件,将无法找到对应的SQL语句

测试:

测试中组合单词在数据库中使用的下划线,程序中使用的驼峰,从设计规范上是没有问题的,要解决这个问题就要使用resultMap标签,修改PersonMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper文件命名规范:驼峰模式——数据库表名首字母大写+Mapper(例如:PersonTestMapper) --> 
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 
	namespace:当前表(映射文件)的命名空间(命名规范:映射文件的包的全路径)
 -->
<mapper namespace="com.rl.mapper.PersonMapper">
	<!-- 
		结果的映射:
		type:查询实体的数据类型
		id:赋值给引用处的唯一标识
	 -->
	<resultMap type="com.rl.model1.Person" id="BaseResultMap">
		<!-- 
			column:表中的字段
			property:实体类中的字段
		 -->
		<id column="person_id" property="personId"/>
		<!-- 全映射 -->
		<result column="name" property="name"/>
		<result column="gender" property="gender"/>
		<result column="person_addr" property="personAddr"/>
		<result column="birthday" property="birthday"/>
	</resultMap>
	<!-- 
		查询标签(
		id:sql唯一标识、
		parameterType:传递给SQL的参数的数据类型、
		resultType:返回的数据的结果类型、
		要查询的SQL语句,#{id}:用于接收参数的语法{}中的内容,如果是接收一个参数,内容任意
		Preparing: select * from person_test where id = ? (#{ }使用预编译的方式生成SQL语句)
		) 
	-->
	<select id="selectPersonById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
		select * from person where person_id = #{id}
	</select>
</mapper>

 

重新测试:

获得id和地址

 

                                      个人学习笔记,请勿转载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值