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中执 ...
随机推荐
- Go语言基础知识总结(持续中)
Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...
- 90%的开发者都不知道的UI本质原理和优化方式
前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...
- Nacos 笔记
Nacos 笔记 目录 Nacos 笔记 1. Nacos简介 1.1 主流配置中心对比 1.2 主流注册中心对比 1.3 Nacos特性 2. 安装启动 支持外部 MySQL 3. 配置管理 3.1 ...
- .jsp文件的使用和理解以及一些小练习和Listener监听器
什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...
- Semi-automation Script Based on Sleep
The following script auto login to server 49, send 2 commands and exit from the server. Create a aut ...
- Create Shortcut for SSH Hosts
You frequently visit host 10.0.7.141 for example. It's a waste to type "ssh gcp@10.0.7.141" ...
- Linux的磁盘管理和文件系统
一.磁盘结构 1.1.硬盘的物理结构 盘头:硬盘有多个盘片,每盘片2面 磁头:每面一个磁头 1.2.硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇区存放512字节的数据,硬盘的最小存储单位 磁道 ...
- 阿里云NAS文件迁移项目实践
阿里云文件存储NAS是阿里云推出的用于传统文件共享的,使用NFS协议挂载的共享文件夹. 产品背景 下图是NAS和阿里云另一明星产品OSS以及块存储EBS的区别 NAS核心优势:无需修改程序,挂载之后, ...
- 安鸾CTF Writeup PHP代码审计01
PHP代码审计 01 题目URL:http://www.whalwl.xyz:8017 提示:源代码有泄露 既然提示有源代码泄露,我们就先扫描一遍. 精选CTF专用字典: https://github ...
- Visio2013安装报错 1935 问题解决
最近安装Visio2013,奈何一直报错,出现1935的错误并且回滚 试了试网上的方法,无论是安装.netframework4.0也好,下载.net修复工具也好,都不行 最后尝试删除一个注册表路径 H ...