文档章节

【Mybatis框架】输入映射-pojo包装类型

M
 Mysoft
发布于 2015/09/18 10:52
字数 1292
阅读 504
收藏 1

下面说说关于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:张三丰




本文转载自:http://blog.csdn.net/acmman/article/details/46509307

M
粉丝 4
博文 58
码字总数 24535
作品 0
广州
高级程序员
私信 提问
mybatis学习笔记(2)-mybatis概述

mybatis学习笔记(2)-mybatis概述 标签: mybatis [TOC] 本文对mybatis做一个简单介绍,包括框架原理,执行过程,开发方法,输入输出映射以及动态sql,我会在后续的系列文章中一一详细说明 my...

brianway
2016/02/27
334
0
Mybatis应用学习——简单使用示例

传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: 2. 上面代码造成的问题: 频繁的创建和释放数据库连接对象,极大消耗数据库性能,解决:可以通过数据库连接池技术(c3p0、DBCP、dru...

江左煤郎
2018/11/22
0
0
JavaEE Mybatis使用

1. Mybatis官网 下载地址 解压之后的内容: Mybatis框架结构: 简要概述: 2. 导入数据库表 1). 使用Navicat工具,在root上右键选择新建数据库 2). 新建数据库->确定 -- -------------------...

凌浩雨
2018/04/12
0
0
mybatis学习笔记(6)-输入映射

mybatis学习笔记(6)-输入映射 标签: mybatis [TOC] 本文主要讲解mybatis的输入映射。 通过parameterType指定输入参数的类型,类型可以是 简单类型 hashmap pojo的包装类型 传递pojo的包装对...

brianway
2016/02/28
105
0
MyBatis之输入与输出(resultType、resultMap)映射

在MyBatis中,我们通过parameterType完成输入映射(指将值映射到sql语句的占位符中,值的类型与dao层响应方法的参数类型一致),通过resultType完成输出映射(从数据库中输出,通过dao层的方法查...

瑟青豆
2018/06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

跨域的理解,以及解决方案!

/*什么是跨域? * 跨域的主要原因是浏览器的同源策略。 * =>>所谓的同源策略就是A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。 * 什么是同源? * =>>同源就是协议相同、域名相同...

流年那么伤
6分钟前
1
0
Nginx配置try_fiels,php无法获取$_GET参数

平时开发都是用LNMP,新安装的虚拟机在配置nginx的rewrite的时候使用try_files命令。但是在写的时候配置成“try_files $uri $uri/ /index.php?q=args;”, 在PHP的web程序中,打印$_GET为空。...

叫我哀木涕
6分钟前
0
0
【原创】Microsoft Edge可以用localhost访问但无法用IP访问

Microsoft Edge可以用localhost和127.0.0.1访问但无法用本机IP访问, chrome ie都可以推测是edge的问题,网络是专用网络,防火墙也关了: 在edge里 按F12 以在控制台里看到这句 CONSOLE21301...

shzwork
7分钟前
0
0
Python利用数学方程式画4种不一样的心型图案

前言 下面这四个心型图案,是通过科学地计算,根据数学方程式生成的,虽然做的不是特别完美,但是基本的还是能实现的 第一个心型 结果图 第二心型 结果图 学习从来不是一个人的事情,要有个相互监...

A_裙232550246
7分钟前
0
0
微信带场景参数的二维码生成与使用?

微信公众号推广时,用户通过扫二维码关注公众号,需要统计用户是通过谁的二维码进行关注。 在用户扫码关注公众号时,二维码带上推广者的参数,在关注公众号后,获取到该推广者的参数。 目前有...

wxgzhgncj
7分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部