• 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);
    		}
    		
    	}
    
    }
    

      

  • 相关阅读:
    ASCII 32个控制字符含义
    MFC中获取指定打印机的打印队列的方法
    某品牌led报文信息分析
    SQL Server 企业版没有 Management Studio管理工具 无法安装工作站组件 的解决方法(无需卸载重装)
    xla文件修改办法
    关于ALILIB
    编译器如何根据头文件来找到相应实现的cpp文件?
    C#调用C++接口提示找不到指定的模块解决方法,本机正常
    DataGridView中实现右击选中当前行功能,并通过ContextMenuStrip获取当前行
    C#递归获取文件列表
  • 原文地址:https://www.cnblogs.com/-beyond/p/10121466.html
Copyright © 2020-2023  润新知