Scala + Mybatis 传参问题

Scala + Mybatis 传参问题

徐老师您好:


在完成 5-5 学习任务的过程中

结合Mybatis向数据库写入数据时, 将 "word" , "count" 封装到Map集合中并传递给了SqlSession对象的update方法. 用Java写的程序执行后数据正常写入到了数据库, 而Scala写的程序执行过程中发生如下错误信息:

Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'word' in 'class scala.collection.immutable.Map$Map2'


对应的Java, Scala代码如下, 望老师给予纠正

谢谢


Java

.foreachPartition(new VoidFunction<Iterator<Tuple2<String, Integer>>>() {
    @Override
    public void call(Iterator<Tuple2<String, Integer>> it) throws Exception {
        SqlSession session = getSession();
        while (it.hasNext()) {
            Tuple2<String, Integer> tup = it.next();
            Map map = new HashMap<>();
            map.put("word", tup._1);
            map.put("count", tup._2);
            session.update("WordCountMapper.insert", map);
        }
    }


Scala

val dataRDD: RDD[String] = sc.parallelize(Array("hello you", "hello me"))
dataRDD.flatMap(_.split(" "))
  .map(word => (word, 1))
  .reduceByKey(_ + _)
  .sortByKey()
  .foreachPartition(it => {
    val session = getSession()
    it.foreach(tup => {
      val map = Map("word" -> tup._1, "count" -> tup._2)
      session.update("WordCountMapper.insert", map)
    })
  })


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
徐老师 2022-07-03 15:25:46

根据这个错误信息来看,说的是scala中的map类型中没有提供get方法,你可以尝试封装一个scala的case class,它会自动生成get和set方法。

其实这块就没有必要封装mybatis了,建议在foreachpartition里面直接使用原生jdbc代码即可,这样有问题也容易排查。

这个代码里面不会涉及很多操作数据库的地方,用原生的jdbc代码也不会导致代码很复杂,所以不建议引入其他数据库操作组件,工作中也都是直接用原生jdbc代码

  • 提问者 朴大东 #1

    封装一个 case class 之后问题已解决, 谢谢老师指导

    2022-07-03 15:58:15
  • 徐老师 回复 提问者 朴大东 #2
    不客气,使用原生jdbc代码的话就不用封装case class了,在这里还是建议使用原生的方式
    2022-07-03 16:02:12
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师