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", "[email protected]");
            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", "[email protected]");
            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", "[email protected]", 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]}

猜你喜欢

转载自www.cnblogs.com/xidian2014/p/10349448.html