栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Mybatis从入门到实战教程】第四章 Mybatis 输入映射、输出映射和动态SQL详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Mybatis从入门到实战教程】第四章 Mybatis 输入映射、输出映射和动态SQL详解

四、Mybatis Mapper配置文件

mapper.xml映射文件中定义了操作数据库的Sql,每个Sql是一个statement,映射文件是MyBatis的核心。

4.1 parameterType输入映射

    parameterType配置输入参数的类型。

4.1.1 表结构
CREATE TABLE `users`  (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `username` varchar(20),
  `password` varchar(50),
  `realname` varchar(20)
);

INSERT INTO `users` VALUES (1, 'admin', '123456', '管理员');
INSERT INTO `users` VALUES (2, 'tom', '123', '汤姆');
INSERT INTO `users` VALUES (3, 'jerry', '456', '杰瑞');
INSERT INTO `users` VALUES (4, 'zhangsan', '111', '张三');
INSERT INTO `users` VALUES (5, 'lisi', '222', '李四');
4.1.2 实体类
package com.newcapec.entity;

public class Users {

    private Integer id;
    private String username;
    private String password;
    private String realname;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRealname() {
        return realname;
    }

    public void setRealname(String realname) {
        this.realname = realname;
    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                ", realname='" + realname + ''' +
                '}';
    }
}
4.1.3 简单类型

    Java基本数据类型以及包装类,String字符串类型。

mapper接口:

package com.newcapec.mapper;

import com.newcapec.entity.Users;

import java.util.List;

public interface UsersMapper {
    List selectByRealname(String realname);
}

mapper文件:





    
    select id,username,password,realname from users order by id limit #{offset}, #{pageSize}



    select id,username,password,realname from users
    where realname like concat('%',#{name},'%')
    order by id limit #{begin}, #{size}

测试:

@Test
public void testMapParam() {
    SqlSession sqlSession = MybatisUtil.getSession();
    UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
    Map map = new HashMap<>();
    map.put("name", "李");
    map.put("size", 5);
    map.put("begin", 0);

    List list = usersMapper.selectUseMap(map);
    for (Users u : list) {
        System.out.println(u);
    }
    sqlSession.close();
}
4.1.6 多输入参数

    MyBatis中允许有多个输入参数,可使用@Param注解。

    这种做法类似与Map类型的输入参数,其中@Param注解的value属性值为Map的key,在映射文件中通过ognl可获取对应的value,并且parameterType可以不指定类型。

mapper接口:

Users login(@Param("uname") String username, @Param("pwd") String password);

mapper文件:


        select count(1) from person
    

测试:

public class ResultTypeTest {

    @Test
    public void testSimpleResult() {
        SqlSession sqlSession = MybatisUtil.getSession();
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

        int total = personMapper.selectCount();
        System.out.println("总记录数:" + total);
        sqlSession.close();
    }
}
4.2.4 实体类对象和列表

    不管是输出的实体类是单个对象还是一个列表(list中包括实体类对象),在mapper.xml中resultType指定的类型是一样的
在原始Dao的方式中,通过selectOne和selectList方法来区分返回值为单个对象或集合列表,而在mapper代理中,则通过接口中定义的方法返回值来区分。

mapper接口:

Person selectById(Integer id);

List selectAll();

mapper文件:


    select id,person_name personName,person_age personAge,person_address personAddress from person

测试:

@Test
public void testResultType1() {
    SqlSession sqlSession = MybatisUtil.getSession();
    PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

    Person person = personMapper.selectById(1);
    System.out.println(person);
    sqlSession.close();
}

@Test
public void testResultType2() {
    SqlSession sqlSession = MybatisUtil.getSession();
    PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

    List list = personMapper.selectAll();
    for (Person person : list) {
        System.out.println(person);
    }
    sqlSession.close();
}
4.2.5 resultMap
  • resultType可以指定将查询结果映射为实体类,但需要实体类的属性名和SQL查询的列名一致方可映射成功,当然如果开启下划线转驼峰 或 Sql设置列别名,也可以自动映射。

  • 如果SQL查询字段名和实体类的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还会将查询结果映射到实体类对象中。

  • resultMap可以实现将查询结果映射为复合型的实体类,比如在查询结果映射对象中包括实体类和list实现一对一查询和一对多查询。

mapper接口:

List select();

mapper文件:

    使用resultMap作为statement的输出映射类型。


    
    
    
    


    select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
    where
    
    
        ename like concat('%',#{ename},'%')
    
    
        and sal=#{sal}
    
    
        and deptno=#{deptno}
    

测试:

public class DynamicSqlTest {

    @Test
    public void testIf() {
        SqlSession sqlSession = MybatisUtil.getSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

        Emp emp = new Emp();
        emp.setEname("S");
        emp.setSal(1300.0);
        emp.setDeptno(20);

        List list = empMapper.selectUseIf(emp);
        for (Emp e : list) {
            System.out.println(e);
        }
        sqlSession.close();
    }
}
4.3.3 where标签

    where标签,替代where关键字。
        1、当where标签内所有的条件都不成立,不会拼接where关键字,只要有一个条件成立就会在SQL语句中拼接where关键字。
        2、where标签会自动剔除条件头部的and或者or关键字。

mapper接口:

List selectUseWhere(Emp emp);

mapper文件:


    select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
    
        
            ename like concat('%',#{ename},'%')
        
        
            and sal=#{sal}
        
        
            and deptno=#{deptno}
        
    

代替set标签:


    update emp
    
        
            ename=#{ename},
        
        
            job=#{job},
        
        
            mgr=#{mgr},
        
        
            hiredate=#{hiredate},
        
        
            sal=#{sal},
        
        
            comm=#{comm},
        
        
            deptno=#{deptno},
        
    
    where empno=#{empno}
4.3.6 foreach标签

    向SQL传递数组或list,MyBatis使用foreach解析。

属性解析:

  • collection: 遍历的数组或集合对象名称。

    • SQL只接收一个数组参数,这时SQL解析参数的名称MyBatis固定为array。

    • SQL只接收一个List参数,这时SQL解析参数的名称MyBatis固定为list。

    • 如果是通过一个实体类或自定义类型的属性传递到SQL的数组或List集合,则参数的名称为实体类或自定义类型中的属性名。

  • index: 为数组的下标。

  • item: 每个遍历生成对象中。

  • open: 开始遍历时拼接的串。

  • close: 结束遍历时拼接的串。

  • separator: 遍历的两个对象中需要拼接的串。

mapper接口:

void deleteUseForeach(Integer[] ids);

void insertUseForeach(List empList);

mapper文件:


    
    delete from emp where empno in
    
        #{id}
    



    insert into emp(ename,job,mgr,hiredate,sal,comm,deptno) values
    
        (#{emp.ename},#{emp.job},#{emp.mgr},#{emp.hiredate},#{emp.sal},#{emp.comm},#{emp.deptno})
    

测试:

@Test
public void testForeach() {
    SqlSession sqlSession = MybatisUtil.getSession();
    EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

    empMapper.deleteUseForeach(new Integer[]{1, 2, 3, 4});
    sqlSession.commit();
    sqlSession.close();
}

@Test
public void testForeach2() {
    SqlSession sqlSession = MybatisUtil.getSession();
    EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

    List empList = new ArrayList<>();
    for (int i = 1; i <= 3; i++) {
        Emp emp = new Emp();
        emp.setEname("TOM" + i);
        emp.setJob("CLERK" + i);
        emp.setMgr(1);
        emp.setSal(4567.0);
        emp.setComm(123.0);
        emp.setHiredate(new Date());
        emp.setDeptno(10);
        empList.add(emp);
    }
    empMapper.insertUseForeach(empList);
    //sqlSession.commit();
    sqlSession.close();
}
4.3.7 choose标签

    choose标签、when标签、otherwise标签的组合,类似于if-else-if判断。

4.3.8 SQL片段

    将实现的动态SQL判断代码块抽取出来,组成一个SQL片段,其它的statement中就可以引用SQL片段,方便程序员进行开发。

    注意:在SQL片段中不要包括where标签。


    empno,ename,job,mgr,hiredate,sal,comm,deptno



    
        ename like concat('%',#{ename},'%')
    
    
        and sal=#{sal}
    
    
        and deptno=#{deptno}
    


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821065.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号