一、动态代理:
mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类。底层通过反射实例化代理对象,通过代理对象调用相应的方法,
执行相应的数据库语句。
接口:
1 package jd.com.proxydao; 2 3 4 import jd.com.mybaitstest.account; 5 6 import java.io.IOException; 7 import java.util.List; 8 9 public interface AccMapper { 10 List<account> selectDemo(String name) throws IOException; 11 void updateDemo(account ac) throws IOException; 12 }
mapper文件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="jd.com.proxydao.AccMapper" > 6 <select id="selectDemo" resultType="jd.com.mybaitstest.account" parameterType="java.lang.String" > 7 8 SELECT * FROM t_account WHERE NAME LIKE '%${value}%'; 9 </select> 10 <insert id="updateDemo" parameterType="jd.com.mybaitstest.account"> 11 12 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> 13 14 SELECT LAST_INSERT_ID(); 15 </selectKey> 16 INSERT INTO t_account(NAME ,money) VALUES(#{name},#{money}); 17 </insert> 18 </mapper>
注意:
mapper文件和接口的对应的关系:
1)mapper文件的namespace的值和接口的相对路径一致。
2)mapper文件的id值和接口的方法的名字一致。
3)mapper的resultType的返回类型和对应的方法的返回值类型一致,没有resultType的话,那方法的返回值为void。
4)mapper文件的parameterType的参数类型和方法的参数类型一致。
5)mapper文件和接口需要在同一目录下。
需要注意:mapper文件和接口在同一个目录中!
测试代码:
1 package jd.com.proxydao; 2 3 import jd.com.mybaitstest.account; 4 import jd.com.Utils.session; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.jupiter.api.Test; 7 8 import java.io.IOException; 9 import java.util.List; 10 11 public class TestDemo { 12 @Test 13 public void testdemo1() throws IOException { 14 SqlSession sqlSession=session.getSession(); 15 AccMapper ac=sqlSession.getMapper(AccMapper.class); 16 List<account> acc1=ac.selectDemo("ok"); 17 account acz=new account(); 18 acz.setId(9); 19 acz.setMoney(2313131); 20 ac.updateDemo(acz); 21 sqlSession.commit(); 22 sqlSession.close(); 23 System.out.println("acc1 = " + acc1); 24 } 25 }
工具类:
1 package jd.com.Utils; 2 3 import org.apache.ibatis.io.Resources; 4 import org.apache.ibatis.session.SqlSession; 5 import org.apache.ibatis.session.SqlSessionFactory; 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 7 8 import java.io.IOException; 9 import java.io.InputStream; 10 11 public class session { 12 private static SqlSessionFactory sqlSessionFactory; 13 14 public static SqlSession getSession(){ 15 String resource="SqlMapConfig.xml"; 16 try { 17 InputStream inp= Resources.getResourceAsStream(resource); 18 sqlSessionFactory= new SqlSessionFactoryBuilder().build(inp); 19 SqlSession sqlSession=sqlSessionFactory.openSession(); 20 return sqlSession; 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 return null; 25 } 26 }
问题汇总:
如果你使用的maven进行开发的时候,因为maven的资源目录:resources目录下。这是会抛出:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): jd.com.proxydao.AccMapper.selectDemo 错误。
我们看下maven编译完打包的target目录:
没有我们写的AccMapper.xml,编译的时候没有把我们mapper文件编译进去。需要在pom.xml添加如下配置:
1 <resources> 2 <resource> 3 <directory>src/main/java</directory> 4 <includes> 5 <include>**/*.xml</include> 6 </includes> 7 </resource> 8 </resources>
在次运行的时候我们看下:
我们mapper文件编译到相应的目录下面。
总结:
1)动态代理对象在调用sqlsession.selectone()和 sqlsession.seleclist(),是根据sql执行的返回值决定,如果返回值是list就用selectlist反之selectone。
2)mybaits官方推荐使用mapper代理方法来开发mapper接口,程序不用开发接口实现类。使用mapper接口,可以使用pojo对象来传入参数。