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中执 ...
随机推荐
- Dubbo 实现一个Route Factory(用于灰度发布)
Dubbo 可以实现的扩展很多, 官方文档在这: https://dubbo.apache.org/zh/docs/v2.7/dev/impls/ (太简单了....) 下面我们实现一个Route F ...
- .NET5控制台程序使用EF连接MYSQL
.NET5控制台程序使用EF连接MYSQL 1.使用nuget下载: Microsoft.Extensions.Configuration.Json Pomelo.EntityFrameworkCor ...
- noip模拟33[进阶啦啦啦]
noip模拟33 solutions 不知道该咋说,这场考试其实是我这三四场以来最最最最最顺心的一场了 为啥呢?因为我这回思考有很多结果,得到了脑袋的回复 就是你想了半个小时就有了一点点头绪,那感觉就 ...
- ArrayList 源码底层实现解析 基于1.8
ArrayList 介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,是动态数组.与Java中的数组相比,它的容量能动态增长.源代码里有解释.当创建一个数组的时候,就必须确定它的大小 ...
- Bugku-web-秋名山老司机
计算式子的值然后使用post方法传值.直接脚本跑. import requestsimport reurl = "http://123.206.87.240:8002/qiumingshan ...
- Windows协议 NTLM篇
NTLM 基础 介绍 LM Hash & NTLM Hash Windows本身是不会存储明文密码的,只保存密码的hash 其中本机用户的密码hash是放在本地的SAM文件里面,域内用户的密码 ...
- nohup 启动命令
start.sh #!/bin/bash nohup $PWD/node_exporter > /dev/null 2>&1 &
- 尝试通过 JDBC 将 UTF-8 插入 MySQL 时出现“乱码”
这是我的连接设置方式: Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true& ...
- wpf 中的矩形的歪斜
<Grid> <Rectangle x:Name="rect12" Width="100" Opacity="1" Hei ...
- Nacos集群部署:
Nacos集群部署: 官网: https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 1: 下载 Nacos1.2.0 链接:http ...