笔记要点
出错分析与总结
/**MyBatis_映射文件_参数处理_单个参数&多个参数&命名参数 * _POJO&Map&TO 三种方式及举例 _ * 单个参数 : #{参数名} ,取出参数值; [mybatis 不会做特殊处理] * 多个参数 : 注册接口:public Employee getEmpByIdAndLaseName(Integer id,String lastName); * 多个参数会被封装成一个map,key :param1...paramN 或者参数索引从0开始 * 命名参数: 明确指定封装参数时mapper接口的key:@Param("id") @Param("lastName") * 多个参数会被封装成一个map; * key: 使用@param注解指定的值; * value:参数值; * #{指定的key} 取出对应的参数 * -------------------------------------------------------- * POJO * 1.如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo * #{属性名}: 取出传入的pojo的属性值 * * Map: * 如果多个参数不是业务逻辑模型中的数据 ,没有对应的pojo,为了方便,我们也可以传入map * #{指定的key} 取出Map中对应的参数 * TO: * 如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个TO(transfer object) * 数据传输对象: * Page{ * int index; * int size; * } * ===================思考==================== * public Employee getEmp(@Param("id")Integer id,String lastName); * 取值: id==>#{id/param1} lastName ==>#{param2} * * public Employee getEmp(Integer id,@Param("e")Employee emp); * 取值: id==>#{param1} lastName ==>#{param2.lastName /e.lastName} * * ###特别注意: 如果是Collection(List /Set)类型或者数组,也会特殊处理, * 也是把传入的list或者数组封装在map中; * key: Collection(collection),如果是List还可以使用这个key(list),数组(array) * public Employee getEmpById(List<Integer> ids); * 取值,取出第一个id的值: #{ids[0]} *==================结合源码来看,mybatis如何处理==================== * debug +Stepinto 即可查看!
工程组织
<mapper namespace="com.dao.EmployeeMapper"> <!--namespace: 名称空间;id: 唯一标识; resultType:返回值类型; --> <!--public Employee getEmpByMap(Map<String,Object> map);--> <select id="getEmpByMap" resultType="com.bean.Employee" databaseId="mysql"> select * from tbl_employee where id = #{id} and last_name =#{lastName} </select> <!-- 多个参数查询 public Employee getEmpByIdAndLaseName(Integer id,String lastName);--> <select id="getEmpByIdAndLaseName" resultType="com.bean.Employee" databaseId="mysql"> select * from tbl_employee where id = #{id} and last_name =#{lastName} </select>
//接口式编程! namespace: 名称空间,指定为接口名字; public interface EmployeeMapper { //传入map public Employee getEmpByMap(Map<String,Object> map); //多个参数处理 public Employee getEmpByIdAndLaseName( @Param("id") Integer id,@Param("lastName") String lastName); public Employee getEmpById(Integer id); //添加返回值类型,表示mybatis的执行SQL语句结果是true或者false public boolean addEmp(Employee employee); public boolean updateEmp(Employee employee); public boolean deleteEmpById(Integer id); }
测试类 class test_tp20 public class test_tp20 {
public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test04() throws IOException { //默认是不自动提交数据的,需要我们自己手动提交 SqlSession openSession = getSqlSessionFactory().openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); //测试注释方法提交元素
Employee jerry = mapper.getEmpByIdAndLaseName(1, "jerry"); // System.out.println(jerry);
//测试map方法提交
HashMap<String, Object> map = new HashMap<>(); map.put("id", 4); map.put("lastName", "葫芦娃"); Employee empByMap = mapper.getEmpByMap(map); System.out.println(empByMap); /结果:/Employee{id=4, lastname='葫芦娃', email='葫芦娃@163.com', gender='0'} //最后手动提交 openSession.commit(); }finally { openSession.close(); } } }