MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决
表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这种情况下的如何解决字段名与实体类属性名不相同的冲突。如下所示:
一、准备演示需要使用的表和数据
CREATE TABLE my_user(
user_id INT PRIMARY KEY AUTO_INCREMENT,
user_no VARCHAR(20),
user_age int
);
INSERT INTO my_user(user_no , user_age ) VALUES('myl', 15);
INSERT INTO my_user(user_no , user_age ) VALUES('test', 11);
二、定义实体类
package com.myl.entity; import java.util.Date; /**
* @author myl
* @date 2018年4月27日 上午6:35:17
*/ public class User {
//U实体类中属性名和my_user表中的字段名是不一样的
private int id; //id 对应 user_id
private String no; //no 对应 user_no
private int age; //age 对应 user_age public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", no=" + no + ", age=" + age + "]";
} }
三、编写测试代码
3.1、编写SQL的xml映射文件
1、创建一个orderMapper.xml文件,orderMapper.xml的内容如下:
<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="com.myl.mapping.userMapper"就是com.myl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
--> <mapper namespace="com.myl.entity.userMapper"> <!--
在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="com.myl.entity.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
--> <!--不能得到正常结果,因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录-->
<select id="getUserByB" parameterType="int" resultType="com.myl.entity.User">
select * from my_user where user_id=#{id}
</select> <!-- 不能得到正常结果,因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录 -->
<select id="getAllUserByB" resultType="com.myl.entity.User">
select * from my_user
</select> <!--得到正常结果,根据id查询得到一个user对象-->
<select id="getUser" parameterType="int" resultType="com.myl.entity.User">
select user_id id,user_no no,user_age age from my_user where user_id=#{id}
</select> <!-- 得到正常结果,查找所有数据 -->
<select id="getAllUser" resultType="com.myl.entity.User">
select user_id id,user_no no,user_age age from my_user
</select> <!--得到正常结果, 通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<select id="getUserByResultMap" parameterType="int" resultMap="UserResultMap">
select * from my_user where user_id=#{id}
</select> <!-- 得到正常结果,通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<select id="getAllUserByResultMap" resultMap="UserResultMap">
select * from my_user
</select> <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMap type="com.myl.entity.User" id="UserResultMap">
<!-- 用id属性来映射主键字段 -->
<id property="id" column="user_id"></id>
<!-- 用result属性来映射非主键字段 -->
<result property="no" column="user_no"/>
<result property="age" column="user_age"/>
</resultMap> </mapper>
2、在mybatisConf.xml文件中注册userMapper.xml映射文件
<mappers>
<!--
注册userMapper.xml文件,
userMapper.xml位于me.myl.mapping这个包下,所以resource写成me/myl/mapping/userMapper.xml
-->
<mapper resource="com/myl/mapping/userMapper.xml"/> </mappers>
3.2、编写单元测试代码
package com.myl; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import com.myl.entity.User;
import com.myl.util.MybatisUtil;
/**
* 测试 CRUD
* @author myl
* @date 2018年4月27日 上午6:29:42
*/
public class TestCRUD { @Test
public void getUserByIdByB() {
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行操作,getUser 为select的id属性值
*/
User user = sqlSession.selectOne("getUserByB", 1);
System.out.println(user);
//使用sqlSession执行完sql之后,关闭sqlSession
sqlSession.close(); //打印结果:null,也就是没有查询出相应的记录
} @Test
public void getAllUserByB(){
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行查询操作,将查询结果自动封装成List<User>返回
* getAllUserByB 为select标签的id属性值
*/
List<User> userList = sqlSession.selectList("getAllUserByB"); for(User user : userList){
System.out.println(user);
}
sqlSession.close(); //打印结果:null null null 也就是没有查询出相应的记录
} @Test
public void getUserById() {
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行操作,getUser 为select的id属性值
*/
User user = sqlSession.selectOne("getUser", 1);
System.out.println(user); //打印结果:User [id=1, no=myl, age=22]
//使用sqlSession执行完sql之后,关闭sqlSession
sqlSession.close();
} @Test
public void getAllUser(){
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行查询操作,将查询结果自动封装成List<User>返回
* getAllUser 为select标签的id属性值
*/
List<User> userList = sqlSession.selectList("getAllUser"); for(User user : userList){
System.out.println(user); //打印结果:User [id=1, no=myl, age=22] 多个
}
sqlSession.close();
} @Test
public void getUserByIdByResultMap() {
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行操作,getUser 为select的id属性值
*/
User user = sqlSession.selectOne("getUserByResultMap", 1);
System.out.println(user); //打印结果:User [id=1, no=myl, age=22]
//使用sqlSession执行完sql之后,关闭sqlSession
sqlSession.close();
} @Test
public void getAllUserResultMap(){
SqlSession sqlSession = MybatisUtil.getSession();
/**
* 执行查询操作,将查询结果自动封装成List<User>返回
* getAllUser 为select标签的id属性值
*/
List<User> userList = sqlSession.selectList("getAllUserByResultMap"); for(User user : userList){
System.out.println(user); //打印结果:User [id=1, no=myl, age=22] 多个
}
sqlSession.close();
} }
测试结果:
getUserByIdByB null (错误)
getAllUserByB 多个 null (错误)
getUserById User [id=1, no=myl, age=22] (正确)
getAllUser User [id=1, no=myl, age=22] 多个 (正确)
getUserByIdByResultMap User [id=1, no=myl, age=22] (正确)
getAllUserResultMap User [id=1, no=myl, age=22] 多个 (正确)
四、总结
测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:
方法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
方法二: 通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。
MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决的更多相关文章
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...
- 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
- MyBatis解决字段名与实体类属性名不相同的冲突(四)
一.创建表和表数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no ), order_price FLOA ...
- mabatis学习(四)----解决字段名与实体类属性名不同的冲突
在项目开发中,数据库中的字段名不一定和实体类的类名完全相同(当然大小写忽略),那么就可以在sql映射文件中解决此问题 一.创建需要的数据库和表 编写sql脚本,在navicat for mysql中执 ...
随机推荐
- Nacos 自动更新配置不生效问题
版本 Nacos 1.4.1 SpringCloud 2020.0.3 解决方案 bootstrap.properties 增加应用名配置即可 spring.application.name=serv ...
- CS229 斯坦福大学机器学习复习材料(数学基础) - 线性代数
CS229 斯坦福大学机器学习复习材料(数学基础) - 线性代数 线性代数回顾与参考 1 基本概念和符号 1.1 基本符号 2 矩阵乘法 2.1 向量-向量乘法 2.2 矩阵-向量乘法 2.3 矩阵- ...
- linux之frp服务部署(内网穿透)
frp服务部署(内网穿透) 目的 更快的进行内网穿透调试以及云端开发测试 服务器为CentOS 7,客户端为win11 frp介绍 frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 ...
- python中map()和reduce()的使用
map() 会根据提供的函数对指定序列做映射.map(function, iterable, ...)Python 3.x 返回迭代器.print(map()) 返回迭代器地址一般和list一起用 才 ...
- Mantis安装过程笔记
安装平台:Windows Server 2003 R2 Enterprise x64 Edition 软件: EasyPHP-5.3.6.1 mantisbt-1.2.6 安装过程: 首先安装Easy ...
- 温故知新,微软官方推荐的Visual Studio源代码管理之Git Ignore清单,开启新项目必备宝书
什么是Git Ignore清单 https://git-scm.com/docs/gitignore 简单来说,在Git进行源代码管理中,我们可以通过建立.gitignore来实现一个忽略的黑名单管理 ...
- 流动的观察者模式 | Flutter 设计模式
观察者模式,又称发布订阅模式,是一种行为设计模式--你可以定义一种订阅机制,可在对象事件发生时通知多个 观察 该对象的其他对象. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主 ...
- 常见web中间件漏洞(二)Apache漏洞
Apache(总联想到武直那个)是最常见,使用人数最多的一款web服务器软件.跨平台,多扩展,开源,用过的人都说好 Apache的漏洞主要集中在解析漏洞这一块 1.未知扩展名解析漏洞 Apache的一 ...
- 六种方式,教你在SpringBoot初始化时搞点事情!
前言 在实际工作中总是需要在项目启动时做一些初始化的操作,比如初始化线程池.提前加载好加密证书....... 那么经典问题来了,这也是面试官经常会问到的一个问题:有哪些手段在Spring Boot 项 ...
- 【TS】学习总结
[TS]学习总结 01-TypeScript编译环境 TypeScript全局安装 npm install typescript -g tsc --version //查看版本,安装成功 TypeSc ...