zoukankan      html  css  js  c++  java
  • Mybatis学习笔记5

    1、单个参数:mybatis不会做特殊处理,#{参数名}:取出参数值。

    2、多个参数:mybatis会做特殊处理。

    多个参数会被封装成 一个map,
    key:param1...paramN,或者参数的索引也可以
    value:传入的参数值
    #{}就是从map中获取指定的key的值;

    错误示例:

    接口定义如下:
    package com.mybatis.dao;
    
    import com.mybatis.bean.Employee;
    
    public interface EmployeeMapper {
        public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);
    }
    
    mapper定义如下:
    <?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">
    <mapper namespace="com.mybatis.dao.EmployeeMapper">
        <!--public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);-->
        <select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
            select * from tbl_employee where id=#{id} and last_name=#{lastName} and email=#{email}
        </select>
    </mapper>
    
    测试代码如下:
    package com.mybatis.demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import com.mybatis.bean.Employee;
    import com.mybatis.dao.EmployeeMapper;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class MyTest {
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void testSelect() throws IOException {
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            SqlSession openSession = sqlSessionFactory.openSession(true);
            try {
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
                Employee employee = mapper.getEmpByIdAndLastName(4, "jetty", "jetty@126.com");
                System.out.println(employee);
            } finally {
                openSession.close();
            }
        }
    }
    

     上述错误示例抛出异常:

    org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, 2, param3, param1, param2]

    应该将mapper修改为:

    <select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
      select * from tbl_employee where id=#{param1} and last_name=#{param2} and email=#{param3}
    </select>

    3、命名参数

    上面编写mapper时使用id=#{param1} and last_name=#{param2} and email=#{param3}获取参数的方式不方便。使用命名参数更好。

    只要在接口定义中使用@Param注解。

    public interface EmployeeMapper {
      public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName, @Param("email") String email);
    }

    完整示例如下:

    接口定义:
    package com.mybatis.dao;
    
    import com.mybatis.bean.Employee;
    import org.apache.ibatis.annotations.Param;
    
    public interface EmployeeMapper {
        public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName, @Param("email") String email);
    }
    
    mapper定义:
    <?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">
    <mapper namespace="com.mybatis.dao.EmployeeMapper">
        <!--public Employee getEmpByIdAndLastName(Integer id, String lastName, String email);-->
        <select id="getEmpByIdAndLastName" resultType="com.mybatis.bean.Employee">
            select * from tbl_employee where id=#{id} and last_name=#{lastName} and email=#{email}
        </select>
    </mapper>
    
    测试代码:
    package com.mybatis.demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import com.mybatis.bean.Employee;
    import com.mybatis.dao.EmployeeMapper;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class MyTest {
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void testSelect() throws IOException {
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            SqlSession openSession = sqlSessionFactory.openSession(true);
            try {
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
                Employee employee = mapper.getEmpByIdAndLastName(4, "jetty", "jetty@126.com");
                System.out.println(employee);
            } finally {
                openSession.close();
            }
        }
    }
    

    命名参数:明确指定封装参数时map的key;@Param("id")
          多个参数会被封装成 一个map,
          key:使用@Param注解指定的值
          value:参数值
          #{指定的key}取出对应的参数值

    4、POJO:如果多个参数正好是业务逻辑的数据模型,就可以直接传入pojo;#{属性名}:取出传入的pojo的属性值

    示例如下:

    接口定义:
    package com.mybatis.dao;
    
    import com.mybatis.bean.Employee;
    
    public interface EmployeeMapper {
        public Employee getEmpByIdAndLastName(Employee employee);
    }
    
    mapper定义:
    <?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">
    <mapper namespace="com.mybatis.dao.EmployeeMapper">
        <select id="getEmpByIdAndLastName" parameterType="com.mybatis.bean.Employee" resultType="com.mybatis.bean.Employee">
            select * from tbl_employee where id=#{id} and last_name=#{lastName}
        </select>
    </mapper>
    
    测试代码:
    package com.mybatis.demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import com.mybatis.bean.Employee;
    import com.mybatis.dao.EmployeeMapper;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class MyTest {
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void testSelect() throws IOException {
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            SqlSession openSession = sqlSessionFactory.openSession(true);
            try {
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
                Employee employee = mapper.getEmpByIdAndLastName(new Employee(4,"jetty", "jetty@126.com", 1));
                System.out.println(employee);
            } finally {
                openSession.close();
            }
        }
    }
    

    5、Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,也可以传入map,#{key}:取出map中对应的值

    使用示例:

    接口定义:
    package com.mybatis.dao;
    
    import com.mybatis.bean.Employee;
    
    import java.util.Map;
    
    public interface EmployeeMapper {
        public Employee getEmpByIdAndLastName(Map<String, Object> map);
    }
    
    mapper定义:
    <?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">
    <mapper namespace="com.mybatis.dao.EmployeeMapper">
        <select id="getEmpByIdAndLastName" parameterType="java.util.Map" resultType="com.mybatis.bean.Employee">
            select * from tbl_employee where id=#{id} and last_name=#{lastName}
        </select>
    </mapper>
    
    测试代码:
    package com.mybatis.demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.mybatis.bean.Employee;
    import com.mybatis.dao.EmployeeMapper;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class MyTest {
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void testSelect() throws IOException {
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            SqlSession openSession = sqlSessionFactory.openSession(true);
            try {
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("id", 5);
                map.put("lastName", "jetty");
                Employee employee = mapper.getEmpByIdAndLastName(map);
                System.out.println(employee);
            } finally {
                openSession.close();
            }
        }
    }
    

    6、DTO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个DTO(Data Transfer Object)数据传输对象。

    7、关于参数处理的思考:

    (1)、public Employee getEmp(@Param("id")Integer id,String lastName);
        取值:id==>#{id/param1}    lastName==>#{param2}

    (2)、public Employee getEmp(Integer id,@Param("e")Employee emp);
        取值:id==>#{param1}       lastName===>#{param2.lastName/e.lastName}

    (3)、特别注意:如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。
        key:Collection(collection),如果是List还可以使用list这个key,如果是数组则使用array这个key。
        public Employee getEmpById(List<Integer> ids);
        取值:取出第一个id的值: #{list[0]}

  • 相关阅读:
    查看Linux主机CPU及内存信息
    linux配置java环境变量(详细)
    Linux安装Redis
    Linux关闭防火墙
    使用Unison同步服务器目录
    Nginx详细配置
    CentOS命令行无线上网
    SQL Server查询所有的表名/空间占用量/行数
    CentOS安装Nginx安装详解
    基于 Django 2.0.4 的 djcelery 配置
  • 原文地址:https://www.cnblogs.com/xidian2014/p/10349448.html
Copyright © 2011-2022 走看看