首页 技术 正文
技术 2022年11月19日
0 收藏 923 点赞 3,800 浏览 3293 个字

一、创建表和表数据

CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('a1', 23);
INSERT INTO orders(order_no, order_price) VALUES('a2', 33);
INSERT INTO orders(order_no, order_price) VALUES('a3', 22);

二、创建实体类Order.java

package codeRose.dao;public class Order {
//实体类的中属性名与表中字段名不一致
private int id;
private String orderNO;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrderNO() {
return orderNO;
}
public void setOrderNO(String orderNO) {
this.orderNO = orderNO;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Order [id=" + id + ", orderNO=" + orderNO + ", price=" + price + "]";
}}

三、编写sql映射文件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="codeRose.mapping.ordeMapper">
<!--
根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
-->
<select id="getOrderById" parameterType="int"
resultType="codeRose.dao.Order">
select * from orders where order_id=#{id}
</select> <!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
-->
<select id="selectOrder" parameterType="int"
resultType="codeRose.dao.Order">
select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
</select> <!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMap type="codeRose.dao.Order" id="orderResultMap">
<!-- 用id属性来映射主键字段 -->
<id property="id" column="order_id"/>
<!-- 用result属性来映射非主键字段 -->
<result property="orderNo" column="order_no"/>
<result property="price" column="order_price"/>
</resultMap>
</mapper>

四.在配置文件conf.xml中注册sql映射文件orderMapper.xml

<!-- 注册sql映射文件 -->
<mappers>
<!-- 包名/文件名 -->
<mapper resource="codeRose/mapping/userMapper.xml"/>
<mapper resource="codeRose/mapping/orderMapper.xml"/></mappers>

五、编写单元测试类(Junit)

import org.apache.ibatis.session.SqlSession;import codeRose.dao.Order;
import codeRose.util.MyBatisUtil;public class Test2 { public void testById(){ SqlSession sqlSession=MyBatisUtil.getSqlSession();
//映射sql标识的字符串
String statement="codeRose.mapping.orderMapper.getOrderById";
Order order=sqlSession.selectOne(statement,1);
sqlSession.close();
System.out.println(order);// }
public void testSelectOrder(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
String statement="codeRose.mapping.orderMapper.selectOrder";
Order order =sqlSession.selectOne(statement, 1);
sqlSession.close();
System.out.println(order); }
public void testSelectOrder2(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
String statement ="codeRose.mapping.orderMapper.orderResultMap";
Order order =sqlSession.selectOne(statement, 1);
sqlSession.close();
System.out.println(order); }}

执行单元测试的结果:

  1、testGetOrderById方法执行查询后返回一个null。

  2、testGetOrderById2方法和testGetOrderById3方法执行查询后可以正常得到想要的结果。

六、总结

  上面的测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:

  解决办法一通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。

  解决办法二通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,023
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,360
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,143
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,774
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,852