映射器
映射器的主要元素有八种:
元素名称 |
描述 |
select |
查询语句,可自定义参数 |
insert |
插入语句,执行后返回插入的条数 |
update |
更新语句,执行后返回更新的条数 |
delete |
删除语句,执行后返回删除的条数 |
sql |
定义一部分的sql,被各处引用 |
resultMap |
描述从数据库中得到的结果,提供映射规则 |
cache |
给定命名空间的缓存配置 |
cache-ref |
其他命名空间缓存配置的引用 |
select元素
① 简单地应用查询的select元素:
<select id =”selectPerson” parameterType=”int” resultType=”hashmap”> SELECT * FROM PERSON WHERE ID=”#{id}” </select>
在<select>标签中定义了,这个操作的标识id为”selectPerson”,而这个操作的接受的是int(Integer)类型的参数,并返回一个HashMap类型的对象。
其中的参数符号:
#{id}
就跟JDBC里面的SQL语句中的一个预处理语句参数“?”是一样的效果。
String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
而<select>标签中的标识属性id,需要与映射的Mapper类中的方法名一致。
public HashMap selectperson(int id);
这样就可以使用Mybatis调用SQL了。
② 自动映射
在Mybatis的配置文件(mybatis-config.xml)中的settings下的参数autoMappingBehavior,当它不设置为NONE的时候,Mybatis就会提供自动映射的功能------只要返回的SQL列名和POJO的属性一致,Mybatis就会回填这些字段而不需要任何设置。
在实际中,大部分的数据库规范都是要求每个单词用下划线分隔,而Java则是用驼峰命名法来命名,于是使用列的别名就可以使Mybatis自动映射,或者直接在配置文件中开启驼峰命名的方式。
a) 使用列的别名。
package com.entity public class User{ private int id; private String userName; public int getId(){ return id; } public void setId(int id){ this.id = id; } public String getUserName(){ return userName; } public void setUserName(String userName){ this.userName = userName; } }
而数据库表(user_info)的字段(简略)如下:
字段 |
类型 |
说明 |
id |
int(20) |
角色编号,主键,递增 |
user_name |
varchar(60) |
角色名称 |
此时Mapper的映射语句是:
<select parameterType=”int” id=”getUser” resultType=”com.entity.User”> select id,user_name as username from user_info where id=#{id} </select>
对于UserDao接口,提供的方法是:
public User getUser(int id);
b) 在配置文件中启用驼峰命名法:
设置settings属性下的mapUnderscoreToCamelCase参数为true,这样就可以实现从数据库到POJO的自动映射了。
自动映射可以在settings元素中配置autoMappingBehavior属性值来设定。
值 |
说明 |
NONE |
取消自动映射 |
PARTIAL |
只会自动映射,没有定义嵌套结果集映射的结果集(默认值) |
FULL |
会自动映射任意复杂的结果集 |
③ 传递多个参数:
a) 使用Map传递参数。
我们可以使用Mybatis提供的Map接口作为参数来实现:
<select id=”findUserByMap” parameterType=”map” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},‘%‘) </select>
对于UserDao接口:
public List<User> findUserByMap(Map<int, String> params);
传递参数:
Map<int, String> paramsMap = new HashMap<int, String>(); paramsMap.put(“id”,1); paramsMap.put(“username”,”tom”); userMapper.findUserByMap(paramsMap);
使用Map传递参数。因为Map导致业务可读性丧失,从而导致后续扩展和维护的困难,所以这个方法废弃掉。
b) 使用注解方式传递参数。
UserDao接口如下:
public List<User> findUserByAnnotation(@Param(“id”) int id, @Param(“userName”)String userName);
把映射器的XML修改为无需定义参数类型:
<select id=”findUserByAnnotation” parameterType=”map” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’) </select>
使用@Param注解传递多个参数,这种方式的使用受到参数个数(n)的影响。当n<=5时,它是最佳的传参方式;当n>5的时候,多个参数将给调用带来困难。
c) 使用JavaBean传递参数。
首先先定义一个UserParams的JavaBean:
package com.params; public class UserParam{ private String userName; public String getUserName(){ return userName; } public void setUserName(String userName){ this.userName = userName; } }
JavaBean传递参数:
<select id=”findUserByParams” parameterType=”com.params.UserParam” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’) </select>
同样在RoleDao接口提供一个方法:
public List<User> findUserByParams(UserParam params);
当参数个数多于5个时,建议使用JavaBean方式。
参考文章:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
原文地址:https://www.cnblogs.com/NYfor2018/p/9110278.html