【Mybatis框架】输入映射-pojo包装类型
下面说说关于mapper.xml文件中的输入映射
我们看一下之前为User配置的mapper文件UserMapper.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
- 注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
- <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
- <!-- 在映射文件中配置很多sql语句 -->
- <!-- 需求:通过id查询用户表的记录 -->
- <!-- 通过select执行数据库查询,
- id:标示映射文件中的sql,成为Statement的id
- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id,
- parameterType:指定输入参数的类型,
- #{}标示一个占位符,
- #{id}其中id表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意(如value)。
- resultType:指定sql输出结果的映射的java对象类型,
- select指定resultType表示将单条记录映射成java对象-->
- <select id="findUserById" parameterType="int" resultType="cn.edu.hpu.mybatis.PO.User">
- SELECT * FROM USER WHERE id=#{id}
- </select>
- <!-- ${}:表示拼接sql串,将接收到的参数内容不加任何修饰拼接在sql中。
- 使用${}拼接sql,引起sql注入。
- ${}中只能使用value-->
- <select id="findUserByUserName" parameterType="java.lang.String"
- resultType="cn.edu.hpu.mybatis.PO.User">
- select * from user where username like '%${value}%'
- </select>
- <!-- 添加用户
- parameterType:指定输入参数类型是pojo(包括用户信息)
- #{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性
- -->
- <insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
- <!-- 将插入数据的主键返回,返回到user对象中。
- SELECT_INSERT_ID():得到刚insert进去的主键值,只适用于自增主键
- KeyProperty:将查询到主键值设置到parameterType指定对象的哪个属性。
- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
- -->
- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
- SELECT LAST_INSERT_ID()
- </selectKey>
- <!-- 使用MySql的UUID来生成主键
- 执行过程:
- 首先通过uuid()得到主键,将主键设置到user对象的id属性中
- 其次在insert执行时,从user对象中取出id属性值
- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
- SELECT uuid()
- </selectKey>
- insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})-->
- insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
- </insert>
- <!-- 删除用户 -->
- <delete id="deleteUser" parameterType="java.lang.Integer">
- delete from user where id=#{id}
- </delete>
- <!-- 更新用户
- 分析:
- 需要传入用户的id,需要传入用户的更新信息.
- parameterType指定user对象,包括id和更新信息(注意:id必须存在)
- #{id}:从输入user对象中获取id属性值-->
- <update id="updateUser" parameterType="cn.edu.hpu.mybatis.PO.User">
- update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address}
- where id=#{id}
- </update>
- </mapper>
在mapper.xml中我们通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
上面的查询语句输入的都是一个查询参数,当我们输入多个查询参数时应当怎么操作呢?这就要用到POJO的包装对象把大量的查询参数包装在对象中传递给只能接收单个参数的Mapper操作方法了,看看如何来定义POJO包装对象
1传递pojo的包装对象
1.1需求
完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)
1.2定义包装类型pojo
针对上边需求,建议使用自定义的包装类型的pojo。
在包装类型的pojo中将复杂的查询条件包装进去。
写一个例子
首先我们前面定义了一个User类对象,如果对象中的值要发生拓展,在源代码上改是不合适的(因为我们后期要使用工具自动生成User类,里面的东西建议不要改动),这里我们创建一个User的拓展类UserCustom,继承自User类,我们下面包装查询条件时使用的是UserCustom,特此说明。
查询包装类UserQueryVo:
- package cn.edu.hpu.mybatis.PO;
- public class UserQueryVo {
- //在这里包装需要的查询条件
- //用户查询条件
- private UserCustom userCustom;
- public UserCustom getUserCustom() {
- return userCustom;
- }
- public void setUserCustom(UserCustom userCustom) {
- this.userCustom = userCustom;
- }
- //包装其他的查询条件,订单、商品
- //......
- }
1.3mapper.xml
在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。
- <!-- 用户信息综合查询
- #{UserCustom.sex}取出包装对象中性别值
- ${UserCustom.username}取得pojo包装对象中用户名称
- -->
- <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
- resultType="cn.edu.hpu.mybatis.PO.UserCustom">
- select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
- </select>
在UserMapper类中定义综合查询方法:
//用户管理的Dao接口
- public interface UserMapper {
- //用户信息综合查询
- public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
- ......
- }
之后进行测试:
- //用户信息综合查询
- @Test
- public void testFindUserList() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- //创建UserMapper代理对象
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo=new UserQueryVo();
- UserCustom userCustom=new UserCustom();
- userCustom.setSex("男");
- userCustom.setUsername("张三");
- userQueryVo.setUserCustom(userCustom);
- //调用userMapper的方法
- List<UserCustom> users=userMapper.findUserList(userQueryVo);
- for (int i = 0; i < users.size(); i++) {
- UserCustom user=(UserCustom)users.get(i);
- System.out.println(user.getId()+":"+user.getUsername());
- }
- }
测试结果:
1:张三
4:张三丰
输出日志:
- DEBUG [main] - Opening JDBC Connection
- DEBUG [main] - Created connection 13994297.
- DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@d58939]
- DEBUG [main] - ==> Preparing: select * from user where user.sex=? and user.username like '%张三%'
- DEBUG [main] - ==> Parameters: 男(String)
- DEBUG [main] - <== Total: 2
传递HashMap与此类似,就不再赘述
【Mybatis框架】输入映射-pojo包装类型相关推荐
- MyBatis框架parameterType为哈希类型的别名映射和resultMap映射
数据库中表记录: Client.java package client; import java.io.*; import java.util.HashMap; import java.util.Li ...
- MyBatis之输入与输出(resultType、resultMap)映射
2019独角兽企业重金招聘Python工程师标准>>> 在MyBatis中,我们通过parameterType完成输入映射(指将值映射到sql语句的占位符中,值的类型与dao层响应方 ...
- MyBatis之输入(parameterType)与输出(resultType、resultMap)映射
MyBatis之输入(parameterType)与输出(resultType.resultMap)映射 2017/9/30 在MyBatis中,我们通过parameterType完成输入映射(指将值 ...
- 【MyBatis教程】mybatis框架超全面详解总结
目录 一.什么是MyBatis 二.Mybatis相对JDBC有哪些优势 三.Mybatis框架的原理介绍 四.Mybatis全局配置文件 1.全局配置文件的类容和顺序 五.映射文件 1.输入映射pa ...
- MyBatis Review——输入输出映射
一,输入映射 mybatis的输入映射通过parameterType指定,可以为简单类型,包装类型,hashmap类型. 1,简单类型 <select id="findUserByNa ...
- Mybatis中输入输出映射和动态Sql
一.输入映射 我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型.POJO.HashMap等数据类型 1.简单类型 2.POJO包装类型 ①这是单表查询的时候传 ...
- SSM之Mybatis框架初步
1. SSH:Spring 中间层(容器框架,整合框架) Struct(控制层,Servlet) Hibernate(DAO,持久层框架) Structs2 Hibernate 两个重量级框架,入门 ...
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...
- mybatis入门(四)----输入映射和输出映射
阅读目录 一:输入映射 二:输出映射 回到顶部 一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 ...
最新文章
- java开源springboot项目_springBoot 搭建web项目(前后端分离,附项目源代码地址)...
- c 实现 php 数组,C语言实现数组功能
- OpenCASCADE:使用扩展数据交换 XDE之几何尺寸和公差 (GDT)
- kafka 主动消费_Kafka核心API——Consumer消费者
- java输入一行_用java编写从标准输入读入一行字符串,打印出其中所有的数字
- 最不靠谱CEO,一句话让公司损失上千亿元
- 结构体中操作c语言,C语言中结构体的操作
- 关于Vue.js去掉#号路由
- js 中 ! + - ~ 符号和匿名函数
- Java反射机制的简单应用
- 使用Docker镜像部署Coupons淘宝客项目
- Fragstats软件使用及其景观生态学意义
- C#实现的基于SMTP协议的E-MAIL电子邮件发送客户端软件
- 网站服务器后缀名,服务器域名,域名后缀
- 蚂蚁金服Java后台实习生春招面试总结
- 蚂蚁金服刘伟光:我们为什么要科技开放
- 【三 HLS】HLS实现肤检测
- 手写jQuery轮播图插件,即拿即用,更多接口,更少代码实现你想要的轮播图~~
- kubeadm升级k8s
- 洛谷 1144 最短路计数 bfs
热门文章
- win7系统怎么拷贝到u盘_win7/10系统复制文件到u盘提示文件过大怎么办
- selenium3 + java 日志
- Condition 接口
- Python 爬虫实例(7)—— 爬取 新浪军事新闻
- 第13-17章阅读后的思考
- Linux 时间同步问题_qingshanli1988-ChinaUnix博客
- Android4.4 及以下TextView,Button等控件使用矢量图报错
- ux.form.field.Year 只能选年的时间扩展
- Android Lint 实践 —— 简介及常见问题分析
- 我最喜欢的模板jade(pug)学习和使用