Mybatis框架学习总结-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的。
1.准备演示需要使用的表和数据
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('aaaa', 23); INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33); INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);
查看数据表:
2.定义实体类
package com.fpc.Entity; public class Order { //Order实体类中属性名和orders表中的字段名是不一样的。 private int id; //id==>order_id private String orderNo; //orderNo==>order_no private float price; //price==>order_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; } }
3.编写SQL的映射接口
创建一个映射接口orderMapperI.java:
package com.fpc.Mapping; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.fpc.Entity.Order; import com.fpc.Entity.User; public interface OrderMapperI { //使用Select注解指明getOrderById @Select("select * from orders where order_id=#{id}") public Order getOrderById(int id); }
在conf.xml文件中注册orderMapperI映射接口:
<mappers> <!-- 注册userMapper.xml文件, userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml--> <mapper resource="com/fpc/Mapping/userMapper.xml"/> <!-- 注册UserMapper映射接口--> <!-- --> <mapper class="com.fpc.Mapping.UserMapperI"/> <mapper class="com.fpc.Mapping.orderMapperI"/> </mappers>
编写单元测试代码:
OrderMapperI orderMapper = session.getMapper(OrderMapperI.class); Order order = orderMapper.getOrderById(2); System.out.println(order);
执行的结果是:
产生这种现象的原因是实体类中的属性名和表中字段名不一致时,使用mybatis进行查询操作时无法查询出相应的结果的问题。
解决办法:
更改OrderMapperI映射接口:
//使用Select注解指明getOrderById @Select("select order_id id , order_no orderNo,order_price price from orders where order_id=#{id}") public Order getOrderById(int id);
通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一直,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
运行结果:
总结
解决实体类和表中字段名不一致问题:
解决办法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
解决办法二:通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用Mybatis提供的解决方式来解决字段名和属性名的映射关系的。
<!-- 根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的, 这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 --> <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap"> select * from orders where order_id=#{id} </select> <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 --> <resultMap type="com.fpc.Entity.Order" id="orderResultMap"> <!-- 用id属性来映射主键字段 --> <id property="id" column="order_id"/> <!-- 用result属性来映射非主键字段 --> <result property="orderNo" column="order_no"/> <result property="price" column="order_price"/> </resultMap>