mybatis 使用接口绑定
使用selectList,selectOne..的缺陷
刚开始学习mybatis的时候,使用selectList或者selectOne,传入要调用的mapper,如果又参数要传递的话,就需要将参数进行封装为对象,或者保存到map中,然后传入一个map或者对象,这样的话,在mapper.xml中才可以接收到传入的参数。
这个过程其实是很麻烦的,使用session.selectOne("......")来调用mapper定义的方法(id),和我们平时开发时调用方法的形式有点相似,但是由于需要处理参数的封装,就显得不爽了。
mybatis提供了getMapper方法,可以很方便的解决这个问题,最终达到的效果就是:使用mapperName.idName(paramlist)的形式来调用mapperName中的idName方法,传入paralist参数。
创建Person.java实体类
类的全路径为lixin.gan.pojo.Person
包含id、name、age、addr四个属性。
package lixin.gan.pojo; public class Person { private int id; private String name; private int age; private String addr; //省略了 有参和无参构造方法、getter、setter、toString }
创建PersonMapper.xml映射文件
创建包:lixin.gan.mapper,包内创建PersonMapper.xml,内容如下:
<?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="lixin.gan.mapper.PersonMapper"> <select id="selectAll" resultType="Person"> <!-- public List<Person> selectAll(); --> select * from person </select> <select id="selectById" resultType="Person"> <!-- public Person selectById(int id); --> select * from person where id=#{0} </select> <select id="selectByLimit" resultType="Person"> <!-- public List<Person> selectByLimit(int start, int offset);#{0}获取start, #{1}获取offset --> <!-- select * from person limit #{0}, #{1} --> <!-- public List<Person> selectByLimit(@Param("start") int start,@Param("offset") int offset); --> <!-- 使用注解后,参数会被组装为一个map,然后传入,那么就可以使用#{key}来使用传入的参数了 --> select * from person limit #{start}, #{offset} </select> <select id="selectByAddr" resultType="Person"> select * from person where addr=#{addr} </select> </mapper>
需要注意的是,namespace属性值要设定为当前文件名的全路径(不包含.xml后缀)。parameterType可以省略。
创建PersonMapper.java接口
在lixin.gan.mapper包下面,也就是和PersonMapper.xml在一个地方,创建一个PersonMapper.java文件,文件名必须与xml文件保持对应,这里的PersonMapper.xml对应PersonMapper.java。注意,其实新建的接口所在的package,是与其对应的xml文件中的namespace相同的,而且必需相同。
PersonMapper.java这个接口中,只需要声明xml中定义的方法(与id对应),不需要实现接口。
package lixin.gan.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import lixin.gan.pojo.Person; public interface PersonMapper { public List<Person> selectAll(); public Person selectById(int id); //public List<Person> selectByLimit(int start, int offset); public List<Person> selectByLimit(@Param("start") int start,@Param("offset") int offset); public List<Person> selectByAddr(String addr); }
创建mybatis.xml配置文件
在项目的src目录下创建mybatis.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置别名 --> <typeAliases> <package name="lixin.gan.pojo"/> </typeAliases> <environments default="mysql"> <environment id="mysql"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="lixin/gan/mapper/PersonMapper.xml"></mapper> <!-- 或者使用package指定包下面的所有interface --> <!-- <package name="lixin.gan.mapper"></package> --> </mappers> </configuration>
运行测试代码
package lixin.gan.test; import java.io.IOException; import java.io.InputStream; import java.util.List; 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 lixin.gan.mapper.PersonMapper; import lixin.gan.pojo.Person; public class Test { public static void main(String[] args) throws IOException { InputStream config = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config); SqlSession session = factory.openSession(); // 以前的做法 //List<Person> list1 = session.selectList("lixin.gan.mapper.PersonMapper.selectAll"); // 现在的做法 PersonMapper personMapper = session.getMapper(PersonMapper.class); List<Person> list1 = personMapper.selectAll(); for (Person p : list1) { System.out.println(p); } Person p1 = personMapper.selectById(1); System.out.println(p1); List<Person> list2 = personMapper.selectByLimit(2,2); for (Person p : list1) { System.out.println(p); } } }