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

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中参数的获取方式, 也是却分大小写的 ,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容