美文网首页
无废话mybatis五(说明白参数传递)

无废话mybatis五(说明白参数传递)

作者: 毛仑上保罗先生 | 来源:发表于2018-11-05 16:08 被阅读0次

    paramX形式传递参数

    在UserMapper.xml中添加一段查询代码

    
     <select id="selectByidAndName" resultMap="userMap">
                select * from sys_user where id =#{id} and user_name=#{userName}
     </select>
    
    

    在UserMapper.java接口中添加一个接口

    
        public SysUser selectByidAndName(long ID, String userName);
    
    

    在UserMapperTest.java测试类中添加

    @Test
        public void testselectByidAndName(){
            SqlSession sqlSession = getSqlSession();
            try {
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                SysUser sysUser = userMapper.selectByidAndName(Long.valueOf(1),"admin");
                System.out.println(sysUser);
            } finally {
                sqlSession.commit();
                sqlSession.close();
            }
        }
    
    

    运行结果

    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
    ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
    
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
        at com.sun.proxy.$Proxy6.selectByidAndName(Unknown Source)
        at simple.UserMapperTest.testselectByidAndName(UserMapperTest.java:160)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
        at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:204)
        at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:45)
        at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
        at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:219)
        at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:146)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
        ... 29 more
    
    

    由于是多个参数, mybatis是按照参数的位置进行赋值, 再看错误提示: Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2], 这个错误说xml的参数可以是arg1, arg0, param1, param2,

    所以上面的这种情况压根就找不到,所以我们可以将xml里面的查询语句改成下列形式,然后运行,,,成功

    
        <select id="selectByidAndName" resultMap="userMap">
                select * from sys_user where id =#{ param1 } and user_name=#{param2}
        </select>
    
    

    所以说mybatis是按照参数传递的顺序进行一个赋值,从param1 开始, 记住是从1开始, 现实中很不建议这么干, 这么干如果参数多的话会是一种悲剧

    @Param注解传参

    还是UserMapper.java

    
        public SysUser selectByidAndName( @Param("ID")  long ID,  @Param("userName") String userName);
    
    

    UserMapper.xml

        <select id="selectByidAndName" resultMap="userMap">
                select * from sys_user where id =#{ ID } and user_name=#{userName}
        </select>
    

    或者是

    
     <select id="selectByidAndName" resultMap="userMap">
                select * from sys_user where id =#{ param1 } and user_name=#{param2}
     </select>
    
    

    运行之后消息返回

    [DEBUG] 2018-11-05 15:28:26,572 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==>  Preparing: select * from sys_user where id =? and user_name=? 
    [DEBUG] 2018-11-05 15:28:26,616 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==> Parameters: 1(Long), admin(String)
    [TRACE] 2018-11-05 15:28:26,628 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
    <==    Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
    [TRACE] 2018-11-05 15:28:26,628 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
    <==        Row: 1, admin, 123456, admin@mybatis.tk, <<BLOB>>, <<BLOB>>, 2016-06-07 01:11:12.0
    [DEBUG] 2018-11-05 15:28:26,631 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    <==      Total: 1
    SysUser [id=1 , userName=admin , userPassword=null , userEmail=null , userInfo=null , headImg=null , createTime=null  ]
    
    

    给参数配直@Param注解后, MyBatis就会自动将参数封装成Map类型,@Param注解值会作为Map中的 key ,因此在 SQL 部分就可以通过配置的注解值来使用参数。

    多个javabean方式

    为了演示, 就直接点啦
    UserMapper.java添加下列代码

        public List<SysUser> selectRolesByUser1AndUser2(@Param("user1") SysUser user1,@Param("user2") SysUser user2);
    
    

    UserMapper.xml添加对应的代码

    
        <select id="selectRolesByUser1AndUser2" resultMap="userMap">
                select * from sys_user where id =#{ user1.id } and user_name=#{user2.userName}
        </select>
    
    

    UserMapperTest.java中添加相应的代码进行测试:

    @Test
        public void testselectRolesByUserAndRole() {
            SqlSession sqlSession = getSqlSession();
            try {
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                SysUser sysUser1 = new SysUser();
                sysUser1.setId(Long.valueOf(1));
    
                SysUser sysUser2 = new SysUser();
                sysUser2.setUserName("admin");
                List<SysUser> sysUser = userMapper.selectRolesByUser1AndUser2(sysUser1, sysUser2);
                System.out.println(sysUser);
            } finally {
                sqlSession.commit();
                sqlSession.close();
            }
        }
    
    
    批注: 在xml中获取对象一定是 xxx.属性, 而且属性名区分大小写

    如果单个参数可以直接用基本类型, 或者是直接用单个javabean, 至于用哪个就应该自己衡量啦
    单个javabean的方式, 单个参数的其实没必要多说, 前面几个章节都写很多了, 下面代码为一个简单的javabean参数方式进行传入

    UserMapper.java

    
        public SysUser selectSysUser(SysUser sysUser);
    
    

    UserMapper.xml

     <select id="selectSysUser" resultMap="userMap">
                select * from sys_user where id =#{ id } and user_name=#{userName}
     </select>
    
    

    UserMapperTest.java

     @Test
        public void testselectSysUser() {
            SqlSession sqlSession = getSqlSession();
            try {
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                SysUser sysUser1 = new SysUser();
                sysUser1.setId(Long.valueOf(1));
                sysUser1.setUserName("admin");
                SysUser sysUser = userMapper.selectSysUser(sysUser1);
                System.out.println(sysUser);
            } finally {
                sqlSession.commit();
                sqlSession.close();
            }
        }
    

    注意xml中参数的获取方式, 也是却分大小写的 ,

    相关文章

      网友评论

          本文标题:无废话mybatis五(说明白参数传递)

          本文链接:https://www.haomeiwen.com/subject/ikujxqtx.html