一、解决实体类和数据库字段命名冲突问题
问题抛出:通常我们设计数据表字段的时候会使用下划线来拼接,而在javaBean中通常使用驼峰形式表示属性。例如tb_user表(user_email)->User类(userEmail),如何解决这种冲突呢?
案例说明:
- 数据表
CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
- JavaBean类
public class Order {
private int id; //id===>order_id
private String orderNo; //orderNo===>order_no
private float price; //price===>order_price
...省略其他
1.错误的方法
<!--
根据id查询得到一个,使用这个查询是查询不到我们想要的结果的,
这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
-->
<select id="getOrderById" parameterType="int"
resultType="com.qiu.entity.Order">
select * from orders where order_id=#{id}
</select>
2.正确解法
(1)方法一
- 使用别名的形式
<!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,
这样实体类的属性名和查询结果中的字段名就可以一一对应上
-->
<select id="selectOrder" parameterType="int"
resultType="com.qiu.entity.Order">
select order_id id, order_no orderNo,order_price price from orders
where order_id=#{id}
</select>
(2)方法二
- 使用resultMap映射实体类属性名和表的字段名一一对应关系
<!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMap type="com.qiu.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>
(3)方法三
- 在核心配置文件中启用下划线与驼峰式命名规则的映射
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
二、有关mybatis接口方法中传入参数问题
mybatis参数传递主要分为以下的五种情况
1.单个参数
- 可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
2.多个参数
- 任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
3.命名参数(推荐使用)
- 为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
4.POJO
- 当这些参数属于我们业务POJO时,我们直接传递POJO
5.Map
- 我们也可以封装多个参数为map,直接传递
总结:
(1)当参数小于5时候通常使用@Param形式
(2)参数大于5时候使用JavaBean形式