• JAVA框架 Mybaits 动态代理


     一、动态代理:

    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对象来传入参数。

  • 相关阅读:
    【LeetCode-树】找树左下角的值
    【LeetCode-贪心】合并区间
    MongoDB3.6版本新增特性
    MongoDB initial sync过程
    MongoDB3.4版本新增特性
    保险配置原则
    MongoDB批量操作时字段为null时没有入库
    Kafka消费者没有收到通知的分析
    Git分支的管理
    NoSQLBooster如何MongoDB的部分文档从一个集合拷贝到另外一个集合中
  • 原文地址:https://www.cnblogs.com/evilliu/p/8931655.html
Copyright © 2020-2023  润新知