一、创建表和表数据
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提供的解决方式来解决字段名和属性名的映射关系的。