Mapper映射器的使用

来源:互联网 发布:函数式编程语言 编辑:程序博客网 时间:2024/06/06 01:40

Mapper映射器

Mapper映射器是什么?

是符合映射文件要求的接口。
注:myBatis会依据该接口的要求生成一个相应的实例。

具体要求:

a. 方法的名称必须与sql的id一样。
b. 方法的返回值类型必须与sql的resultType一样。
c. 方法的参数类型必须怀sql的parameterType一样。
d. 映射文件的namespace必须等于该接口的完整的名称。

如何使用?

step1. 先按照映射文件要求写好相应的接口,比如EmployeDAO。

step2. 调用SqlSession的方法获得符合映射器要求的对象。

代码如下:

两个实现类:

package entity;/** * mybatis框架中的实体类属性名必须跟表的字段名一样(大小写不区分) */public class Emp {private Integer id;private String name;private Double age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getAge() {return age;}public void setAge(Double age) {this.age = age;}@Overridepublic String toString() {return "Emp [id=" + id + ", name=" + name + ", age=" + age + "]";}}
package entity;public class Emp2 {private Integer empNo;private String ename;private Double age;public Integer getEmpNo() {return empNo;}public void setEmpNo(Integer empNo) {this.empNo = empNo;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public Double getAge() {return age;}public void setAge(Double age) {this.age = age;}@Overridepublic String toString() {return "Emp2 [empNo=" + empNo + ", ename=" + ename + ", age=" + age + "]";}}

映射文件:

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"       "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"><!-- 命名空间为一个字符串,加以区分xml中各个元素 --><mapper namespace="dao.EmpDAO"><!-- id:要求唯一 resultType:返回的数据类型parameterType:参数类型    #{name}表示读取Emp类中的name属性注意:此处的name和age是对象里面的属性,所以要求一致--><insert id="save" parameterType="entity.Emp" >INSERT INTO wq VALUES (wq_seq.nextval,#{name},#{age})</insert><!-- 查询所有记录 有返回结果()--><select id="findAll" resultType="entity.Emp">SELECT * FROM wq ORDER BY id</select><!-- 根据id查询记录 此处的id名称可以任意(id1)--><select id="findById" parameterType="int" resultType="entity.Emp">SELECT * FROM wq WHERE id = #{id1}</select><!-- 修改某条记录 属性来自于实体类,故要一致--><update id="modify" parameterType="entity.Emp">UPDATE wq SET name = #{name},age = #{age} WHERE id = #{id}</update><!-- 删除某条记录 --><delete id="delete" parameterType="int">DELETE FROM wq WHERE id = #{id2}</delete><!-- 返回Map类型的结果  map是java.util.Map的简写--><select id="findById2" parameterType="int" resultType="map">SELECT id,name,age FROM wq WHERE id = #{id3}</select><!-- 使用ResultMap解决表的字段名与实体类的属性名不一致情况,也可以使用别名来解决 --><!-- 使用别名  SELECT id empNo,name ename,age FROM wq WHERE id = #{id4} --><select id="findById3" parameterType="int" resultMap="emp2Map">SELECT * FROM wq WHERE id = #{id4}</select><!-- 处理表的字段名与实体类属性名的对应关系 把不相同的列出来即可--><resultMap type="entity.Emp2" id="emp2Map"><result property="empNo" column="id" /><result property="ename" column="name" /></resultMap></mapper>

映射器(符合映射文件要求的接口):

package dao;import java.util.List;import java.util.Map;import entity.Emp;import entity.Emp2;/** * Mapper映射器(实质就是符合映射文件的接口) */public interface EmpDAO {public void save(Emp emp);//插入一条记录public List<Emp> findAll();//查询所有记录public Emp findById(int id);//根据id查询public void modify(Emp emp);//修改记录public void delete(int id);//删除某条记录public Map findById2(int id);//sql中resultType="map"public Emp2 findById3(int id);//sql中使用了resultMap}

通过调用SqlSession的getMapper方法获得映射器的一个实例

测试代码:

package test;import java.io.InputStream;import java.util.List;import java.util.Map;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import dao.EmpDAO;import entity.Emp;import entity.Emp2;public class TestCase {private SqlSession session;@Beforepublic void init(){SqlSessionFactoryBuilder bu = new SqlSessionFactoryBuilder();InputStream in = TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");SqlSessionFactory fa = bu.build(in);session = fa.openSession();}@Test//插入一条记录public void test1(){//class对象就是字节码文件//getMapper方法返回一个符合Mapper映射器(EmpDAO)要求的对象EmpDAO dao = session.getMapper(EmpDAO.class);Emp emp = new Emp();emp.setName("Johnson");emp.setAge(new Double(33));dao.save(emp);//DML任然需要提交事务session.commit();session.close();}@Test//查询所有记录public void test2(){EmpDAO dao = session.getMapper(EmpDAO.class);List<Emp> list = dao.findAll();for(Emp emp : list){System.out.println(emp);}session.close();}@Test//根据id查询记录public void test3(){EmpDAO dao = session.getMapper(EmpDAO.class);Emp emp = dao.findById(61);System.out.println(emp);session.close();}@Test//修改记录public void test4(){//将id为62的记录姓名和年龄修改EmpDAO dao = session.getMapper(EmpDAO.class);Emp emp = dao.findById(62);emp.setName("LI QING");emp.setAge(new Double(10));dao.modify(emp);session.commit();session.close();}@Test//根据id删除某条记录public void test5(){EmpDAO dao = session.getMapper(EmpDAO.class);dao.delete(41);session.commit();session.close();}@Test//sql中resultType="map"public void test6(){EmpDAO dao = session.getMapper(EmpDAO.class);Map map = dao.findById2(62);System.out.println(map);session.close();}@Test//sql中使用了resultMappublic void test7(){EmpDAO dao = session.getMapper(EmpDAO.class);Emp2 emp = dao.findById3(62);System.out.println(emp);session.close();}}