(十一)mybatis之映射器(select)
映射器
映射器的主要元素有八种:
|
元素名称 |
描述 |
|
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
(十一)mybatis之映射器(select)的更多相关文章
- 深入浅出mybatis之映射器
目录 概述 XML映射器 定义xml映射器 配置xml映射器 使用xml映射器 接口映射器 定义接口映射器 配置接口映射器 使用接口映射器 总结与对比 概述 映射器是MyBatis中最核心的组件之一, ...
- MyBatis中映射器Mapper概述
MyBatis真正强大之处在于它的映射器.因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量 XML中顶级元素汇总 cache: 给定命名空间的缓存配置 ca ...
- (八)mybatis之映射器
映射器 映射器是由Java接口和XML文件(或注解)共同组成的,作用如下: ① 定义参数类型. ② 描述缓存. ③ 描述SQL语句. ④ 定义查询结果和POJO的映射关系. 以下用两种 ...
- Mybatis中映射器实现方式总结
一种是通过XML文件方式(由一个java接口和一个XML文件构成) RoleMapper rm = session.getMapper(RoleMapper.class); List<Role& ...
- 第六章 mybatis注入映射器
为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:Map ...
- mybatis学习——映射器(mappers)
在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...
- Mybatis结果映射器resultMap的基本用法
<mapper namespace="全局唯一的名称空间"> <resultMap id="本namespace下唯一" type=" ...
- mybatis映射器配置细则
前面三篇博客我们已经多次涉及到映射器的使用了,增删查基本上都用过一遍了,但是之前我们只是介绍了基本用法,实际上mybatis中映射器可以配置的地方还是非常多,今天我们就先来看看映射器还有哪些需要配置的 ...
- 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL
1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...
随机推荐
- Qt教程
https://blog.csdn.net/louis_815/article/details/54286544 软件下载:http://download.qt.io/ https://blog.cs ...
- Excel的poi缓存问题
Excel的poi缓存问题 背景: 最近工作需要,需要完成生成新的Excel,然后从Excel中读取包含公式的文本内容. 问题: 当程序中修改公式对应的单元格数据变化时,公式获取的值仍然还是原来的值, ...
- 1.15-1.16 sqoop action
一.sqoop action1 http://oozie.apache.org/docs/4.0.0/DG_SqoopActionExtension.html 1.准备文件 ## [root@hado ...
- TypeScript完全解读(26课时)_8.ES6精讲-ES6中的类(进阶)
8.TypeScript完全解读-ES6精讲-类(进阶) 在index.ts内引入 Food创建的实例赋值给Vegetabled这个原型对象,这样使用Vegetables创建实例的时候,就能继承到Fo ...
- SQL Server之null
数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示unknown“不知道”,而不是表示没有.因此select null+1结果是null,因为“不知道”加1的结果还是“不知道” ...
- pre 自动换行
pre { white-space:pre-wrap; word-wrap:break-word; } 增加那么一句即可!
- 51nod 1449 砝码称重【天平/进制】
题意: 给你w,n,问你在w^0,w^1,w^2...各种一个,问你能不能用这些砝码和重量为m的东西放在天平上使得天平平衡: 思路: 这个很容易联想到进制: 如果把m放在是一边的话,其实对于砝码就是纯 ...
- NDK环境搭建(Native Code的编译,不需要Cygwin)
分类: android2013-06-21 15:49 475人阅读 评论(0) 收藏 举报 Android NDK 目录(?)[-] System and Software Requirements ...
- MySQL索引的学习
MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...
- linux 系统运行级别(转)
Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多 ...