假如我们使用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();
}
}