MyBatis基础——实体类属性名与数据库表列名不一致时怎么查询数据

当MyBatis中实体类属性名与数据库表列名不一致时,可以通过在映射文件中添加resultMap标签进行配置解决。首先在resultMap中指定唯一标识和实体类类型,然后在查询标签中将resultType改为resultMap的id,以实现正确映射。通过这样的方式,即使属性名和列名不同,也能确保所有数据正确匹配。

假如我们使用Dao+映射文件的方式操作数据表时,实体类的属性名与数据库列名不一致时我们该怎么查询数据。


实体类的属性名与数据库列名不一致时查询全部数据:

执行结果为:
在这里插入图片描述
我们发现只有money一个属性有值,其余属性均为默认值

这种情况下,如果想要查询数据,则需要修改映射文件
第一步,在映射文件下面加入resultMap标签:

<!-- 实体类属性与数据库的列的对应关系 -->
	<resultMap type="com.xyj.entity.Emp" id="empmap">
		<!--column代表数据库中的列名  property代表实体类的属性   javaType代表在java中的数据类型  jdbcType代表在数据库中的数据类型 -->
		<id column="eid" property="id"/>
		<result column="ename" property="name"/>
		<result column="epwd" property="pwd"/>
		<result column="money" property="money"/>
	</resultMap>

第二步,修改查询标签的resultType属性为resultMap,resultMap的值为定义的resultMap标签的id值

<select id="select" resultMap="empmap">

再次查询全部数据时我们发现数据已经全部匹配啦。
在这里插入图片描述




全部代码

配置文件

<?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">
<!-- MyBatis配置文件 -->
<configuration>
	<!-- 配置log4j日志文件 -->
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING"/>
	</settings>
	<!-- 配置mybatis的多套运行环境  development为开发者模式  -->
	<environments default="development">
		<environment id="development">
			<!--事务管理器  使用JDBC事务管理-->
			<transactionManager type="JDBC"></transactionManager>
			<!--dataSource 数据源配置 POOLED:MyBatis自带数据源  JNDI:基于tomcat的数据源 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql:///jdbcdemo20190804"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 将Dao加入到配置文件中 -->
	<mappers>
		<mapper resource="mapper/EmpMapper.xml"/>
	</mappers>
	
</configuration>

映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- mapper 映射  namespace 命名空间 -->
 <mapper namespace="com.xyj.dao.EmpDao">
 	<!--select 查询操作 id是唯一的(类似于类中的方法名) 不存在重载 -->
 	<!--resultType 确定返回的类型 -->
 	<select id="select" resultMap="empmap">
 		select * from emp
 	</select>
 	
 	<select id="selectById" resultMap="empmap">
 		select * from emp where eid=#{eid}
 	</select>
 	
 	<insert id="insert" >
 		insert into emp values(default,#{ename},#{epwd},#{money})
 	</insert>
 	
 	<update id="update">
 		update emp set ename=#{ename} where eid=#{eid}
 	</update>
 	
 	<delete id="delete" >
 		delete from emp where eid=#{eid}
 	</delete>
	
	<!-- 实体类属性与数据库的列的对应关系 -->
	<resultMap type="com.xyj.entity.Emp" id="empmap">
		<!--column代表数据库中的列名  property代表实体类的属性   javaType代表在java中的数据类型  jdbcType代表在数据库中的数据类型 -->
		<id column="eid" property="id"/>
		<result column="ename" property="name"/>
		<result column="epwd" property="pwd"/>
		<result column="money" property="money"/>
	</resultMap>
	
 </mapper>

resultMap的基本配置项:
1、属性
id: resultMap的唯一标识
type: 表示该resultMap的映射结果类型(通常是Java实体类)
2、子节点
id: 一般对应数据库中该行的主键id,设置此项可以提升MyBatis性能。
result: 映射到JavaBean的单个“简单类型”属性,如基础数据类型,包装类等。
子节点id和result均可实现最基本的结果集映射,将列映射到简单数据类型的属性。这两者唯一不同的是:在比较对象实例时id将作为结果集的标识属性。这有助于提高总体性能,特别是应用缓存和嵌套结果映射的时候。


工具类

package com.xyj.utils;

import java.io.IOException;
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;

/**
 * MyBatis工具类
 */
public class MyBatisUtils {
	
	private static InputStream is;
	private static SqlSessionFactory sessionFactory;
	
	static {
		try {
			//加载MyBatis配置文件
			is=Resources.getResourceAsStream("mybatis-config.xml");
			//创建SqlSessionFactory对象来加工SqlSession(Sql语句执行对象)
			sessionFactory=new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取Sql语句执行对象SqlSession
	 * @return
	 */
	public static SqlSession getSqlSession() {
		return sessionFactory.openSession();
	}
	
}

Dao接口

package com.xyj.dao;

import java.util.List;

import com.xyj.entity.Emp;

public interface EmpDao {
	
	List<Emp> select();
	
	Emp selectById(int id);
	
	int selectValue();//查询总记录数
	
	int insert(Emp emp);
	
	int update(Emp emp);
	
	int delete(int id);
	
}

实体类

package com.xyj.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
	
	private int id;
	private String name;
	private String pwd;
	private double money;
	
	public Emp(String name, String pwd, double money) {
		super();
		this.name = name;
		this.pwd = pwd;
		this.money = money;
	}
	
}

测试类

package com.xyj.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.xyj.dao.EmpDao;
import com.xyj.entity.Emp;
import com.xyj.utils.MyBatisUtils;

/**
 * 测试类
 */
public class TestMyBatis {
	
	@org.junit.Test
	public void test01() {
		//创建SqlSession  Sql语句执行对象
		SqlSession session=MyBatisUtils.getSqlSession();
		//执行操作
		EmpDao ed = session.getMapper(EmpDao.class);
		
		List<Emp> list = ed.select();
		for (Emp emp2 : list) {
			System.out.println(emp2);
		}
		
		
		//关闭SqlSession
		session.close();
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值