使用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);
} } }

  

最新文章

  1. Spring.Net简单用法
  2. thinkphp 导出exl功能
  3. Rails学习笔记二
  4. Windows 8(虚拟机环境)安装.NET Framework3.5(includes .NET 2.0 and 3.0)
  5. [转] - MC、MC、MCMC简述
  6. UVALive 7147 World Cup
  7. xcode笔记
  8. [UOJ 74] 【UR #6】破解密码
  9. vi 按了ctrl+s之后
  10. Centos7.0 下挂载磁盘
  11. 【转】解决未能加载文件或程序集&#39;WebGrease‘的问题
  12. jsp:set/getProperty底层实现的探究
  13. max (Largest elements in array)
  14. Robot Framework - 2 - 创建测试库
  15. mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
  16. Python --代码风格检查 pep8
  17. Asp.Net Mvc控制器重名问题整理
  18. 解决pycharm安装包过程出现的问题:module &#39;pip&#39; has no attribute &#39;main&#39;
  19. 订阅 memcached: error while loading shared libraries: libevent-2.0.so.5: cannot o解决
  20. Cocos2d-x Scene生命周期 pushScene和replaceScene

热门文章

  1. Captcha服务(后续1)
  2. 【小o地图Excel插件版】不止能做图表,还能抓58、大众点评网页数据...
  3. Pythoy 数据类型序列化——json&amp;pickle 模块
  4. xxxx-xx-xx的时间的加减
  5. 解决GJson 获取web api数据出现Not a JsonObject问题
  6. Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
  7. GsonFormat插件
  8. 使用synchronized的几种场景
  9. shell判断USB接口是否有设备插入
  10. SQLServer数据库维护(一)碎片检查整理