MyBatis - 输入和输出参数
基础知识
mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType
1、 返回值是一个对象的集合,@resultType中只能写该对象的类型,而不是写List<T>
2、 输入参数可以用#{}和${}两种取值方法,两者区别与联系:
① 当传入类型为JDBC基本类型(8种java基本类型+String)时,#{}里面可以写成任意值,${}里面必须写value
② 当传入类型为对象时,两种方式里面都应该写成类中属性名
③ #{}方式传值会将传入的值当做一个字符串处理,会自动将其加入"",而${}方式则不会
④ #{}方式能够有效防止SQL注入,而${}不会,因此能够用#{}就不要用${}
⑤ ${}的适用场景是利用数据库中的字段动态排序等例如想要根据id排序
如果用#{}传入id,SQL语句会变成order by "id"这样的SQL语句不能排序,
因此只能用${},对应的SQL语句是order by id符合要求
输入映射 - parameterType、parameterMap(已废弃)
parameterType:
① 基本类型 - 当输入参数为JDBC基本类型,则可以直接用#{xxx}或者${value}取值
<select id="selectUserById" parameterType="int" resultType="com.sikiedu.beans.User">
SELECT * FROM user WHERE id = #{id}
</select>
② 自定义对象 - 当输入参数为对象时,MyBatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo的属性名称
<insert id="insertUser" parameterType="com.sikiedu.beans.User">
INSERT INTO user VALUES(null,#{username},#{userpassword},#{balance},#{grgisterdate})
</insert> <update id="updateUser" parameterType="com.sikiedu.beans.User">
UPDATE user SET username = #{username} WHERE id = #{id}
</update>
③ 自定义包装类 - 开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件,这时可以使用包装对象传递输入参数。即一个pojo类的属性是另一个pojo类对象。
Vo包装类:
package com.sikiedu.beans; import java.util.List; public class UserVo extends User {
// 维护一个Role集合
private List<Role> roleList; public List<Role> getRole() {
return roleList;
} public void setRole(List<Role> roleList) {
this.roleList = roleList;
} @Override
public String toString() {
return "UserVo [ID=" + getId() + "\t username=" + getUsername() + "\t Grgisterdate=" + getGrgisterdate()
+ "\t role=" + roleList + "]";
} }
UserVo.java
UserMapper接口中定义方法:
// 通过包装类UserVo查询用户
public User selectUserByUserVoId(UserVo vo);
UserMapper.xml - sql语句
<select id="selectUserByUserVoId" parameterType="com.sikiedu.beans.UserVo" resultType="user">
SELECT * FROM user WHERE id = #{id}
</select>
④ 键值对 / HashMap - 则#{key}即可取得该key对应的value
<select id="queryStudentBystuageOrstuNameWithHashMap" parameterType="HashMap" resultType="student" >
SELECT stuno,stuname,stuage FROM student
WHERE stuage= #{stuAge} OR stuname LIKE '%${stuName}%'
<select/>
输出映射 - resultType、resultMap
resultType:
resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。
如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中
① 基本类型 - 输出基本类型必须查询出来的结果集只有一条记录,最终将第一个字段的值转换为输出类型
<select id="selectUserCount" resultType="int">
SELECT COUNT(*) FROM user
</select>
② 自定义对象 - selectOne根据mapper接口的返回值类型选择
<select id="selectUserById" parameterType="Integer" resultType="com.sikiedu.beans.User">
SELECT * FROM user WHERE id = #{id}
</select>
③ 集合 - selectList根据mapper接口的返回值类型选择
<select id="selectAllUser" resultType="user">
SELECT * FROM user
</select>
resultMap:
ResultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
◆ resultMap
- id:设置ResultMap的id
- type:指resultMap要映射成的数据类型(返回结果映射的pojo,可以使用别名)。
● id:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个< id />(复合主键时多个)。
● result:普通列使用result标签映射。
- property:表示POJO类的属性。
- column:表示sql查询出来的字段名(列名)。
● association:实体类中将另一个类作为属性association,一对一关系
● collection:实体类中将另一个类的list作为属性,一对多关系
column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
① bean对象字段与数据表字段不匹配
例如数据库role表中属性为 idrole int(11),name varchar(45)。
对应的实体类属性为 Integer id,String name,若直接查询select * from role会报错。
这时就可以使用resultMap属性
<!-- 配置resultMap标签,映射不同的字段和属性名 -->
<resultMap type="Role" id="roleRM">
<id property="id" column="idrole" />
</resultMap>
<select id="selectAllRole" resultMap="roleRM">
SELECT * FROM role
</select>
② 自定义包装类:
RoleVo包装类:在RoleVo包装类中添加User属性。(一个角色每个用户只能拥有一个)
User是一个引用类型,用于存储关联查询的用户信息,因为关联关系是一对一,所以只需要添加单个属性即可
package com.sikiedu.beans; import java.util.List; public class RoleVo extends Role { private User user;
private List<Integer> idList; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public List<Integer> getList() {
return idList;
} public void setList(List<Integer> idList) {
this.idList = idList;
} @Override
public String toString() {
return "RoleVo [ID=" + getId() + "\t name=" + getName() + "\t roletype=" + getRoletype() + "\t user=" + user
+ "]";
} }
RoleVo.java
配置Mapper.xml配置文件:先使用id和result属性,映射role类的结果集,然后在使用association映射关联对象User的结果集
<resultMap type="RoleVo" id="roleVo">
<id property="id" column="idrole" />
<result property="name" column="name" />
<result property="level" column="level" />
<result property="roletype" column="roletype" />
<!-- 一对一关系 -->
<association property="user" javaType="User">
<id property="id" column="id" />
<result property="username" column="username" />
</association>
</resultMap>
<!-- 一对一关联查询 -->
<select id="selectAllRoleVo" resultMap="roleVo">
SELECT
r.idrole,
r.name,
r.level,
r.roletype,
u.id,
u.username
FROM role r
LEFT JOIN user u
ON r.idrole = u.id
</select>
③ 关联查询:
UserVo包装类:在Vo类添加角色集合属性
package com.sikiedu.beans; import java.util.List; public class UserVo extends User {
// 维护一个Role集合
private List<Role> roleList; public List<Role> getRole() {
return roleList;
} public void setRole(List<Role> roleList) {
this.roleList = roleList;
} @Override
public String toString() {
return "UserVo [ID=" + getId() + "\t username=" + getUsername() + "\t Grgisterdate=" + getGrgisterdate()
+ "\t role=" + roleList + "]";
} }
UserVo.java
配置Mapper.xml配置文件:先使用id和result配置映射User类的结果,然后使用一对多关系的collection标签配置Role结果
<resultMap type="UserVo" id="userVo">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="grgisterdate" column="grgisterdate" />
<!-- 一对多关系 -->
<collection property="roleList" ofType="Role">
<id property="id" column="idrole" />
<result property="name" column="name" />
<result property="roletype" column="roletype" />
</collection>
</resultMap>
<!-- 一对多关联查询 -->
<select id="selectAllUserVo" resultMap="userVo">
SELECT
u.id,
u.username,
u.grgisterdate,
r.idrole,
r.name,
r.roletype
FROM user u
LEFT JOIN role r
ON u.id = r.userid
</select>
MyBatis - 输入和输出参数的更多相关文章
- mybatis入门系列二之输入与输出参数
mybatis入门系列二之详解输入与输出参数 基础知识 mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...
- JavaWeb_(Mybatis框架)输入和输出参数_五
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- BackgroundWorker 的输入、输出参数、进度条与文字刷新、取消机制、返回事件
1. 定义全局变量 BackgroundWorker backgroundwoker; 2. 点击开始按钮或其它时机初始化 backgroundwoker = new BackgroundWorker ...
- mybatis 输入、输出映射
一.输入映射 mapper.xml的参数只有一个.可以传参数,基本简单类型,hashmap和javabean (一).Javabean的方法. 需求:通过小说名和作者模糊找书. 1.定义Javabea ...
- Mybatis输入和输出映射(#{}和${}的区别)
#{}占位符 ...
- Mybatis输入和输出映射(parameterType和resultType的区别)
parameterType resultType ...
- asp.net 存储过程 输出参数 取不到值
这是MSDN上的明确解释:当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure.当 CommandType 为 ...
- Mybatis框架四:输入参数、输出参数
输入参数可以有三种:简单类型,POJO,包装类 关于前两种: http://www.cnblogs.com/xuyiqing/p/8600888.html 这里写一下传递包装类参数: 一个POJO:U ...
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...
随机推荐
- Django ORM 之F、Q查询与事务
返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...
- ctx.beginPath()开始新路径
beginPath() 方法开始一条路径,或重置当前的路径. 提示:请使用这些方法来创建路径 moveTo().lineTo().quadricCurveTo().bezierCurveTo().ar ...
- java6大原则之单一职责原则,里式替换原则
单一职责原则:一个接口,一个类,一个方法,最好只做一类事,当然,在真实的项目中,一系列因素下,很难做到单一职责原则,但是针对接口是可以做到的,方法和类要尽量做到 里式替换原则:父类出现的地方,换成子类 ...
- [转]MySQL InnoDB引擎索引长度受限怎么办
mysql> CREATE TABLE `tb` (-> `a` varchar(255) DEFAULT NULL,-> `b` varchar(255) DEFAULT NULL ...
- linux下phpstudy安装
linux下phpstudy安装 一.总结 一句话总结: 就是下载然后一步步用指令安装即可 二.linux下phpstudy安装 参考:linux下phpstudy安装https://www.cnbl ...
- TStringList常用操作
TStringList常用操作 //TStringList 常用方法与属性: var List: TStringList; i: Integer; begin List := TStringList. ...
- JS程序的基本语法
JS程序的基本语法 JS是区分大小写的.如:Name和name是两个变量 JS中每一条语句,一般以英文下的分号(;)结束.这个分号不是必须的.为了向PHP兼容,最好加上分号. 运算符和变量,以及操作之 ...
- Java代码启动/关闭进程
ProcessBuilder builder = new ProcessBuilder(命令,参数,参数...); Process process = builder.start(); br = ne ...
- HYNB Round 15: PKU Campus 2019
HYNB Round 15: PKU Campus 2019 C. Parade 题意 将平面上n*2个点安排在长度为n的两行上. 做法 首先可以忽略每个点之间的影响,只用考虑匹配即可 然后把所以点归 ...
- 激活office2016的心路历程
先转换成VOL版本 32位的office2016用如下代码 @echo off :ADMIN openfiles >nul >nul ||( echo Set UAC = CreateOb ...