学习mybatis的时候,突然遇到测试出错。测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正。错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现确实。修改后正常。

原因是直接复制教学代码,在SqlMapConfig.xml中,配置mappers,加载映射文件,已经配置了加载包文件,然后我自己又添加了单独的mapper。所以出错了,将包注释掉就ok。

测试用例:

  1. @Before
  2. public void setUp() throws Exception {
  3. // 创建sqlSessionFactory
  4. // mybatis配置文件
  5. String resource = "SqlMapConfig.xml";
  6. // 得到配置文件流
  7. InputStream inputStream = Resources.getResourceAsStream(resource);
  8. // 创建会话工厂,传入mybatis的配置文件信息
  9. sqlSessionFactory = new SqlSessionFactoryBuilder()
  10. .build(inputStream);
  11.  
  12. }
  13.  
  14. @Test
  15. public void testFindUserById() throws Exception{
  16. SqlSession sqlSession = sqlSessionFactory.openSession();
  17. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  18. User user = userMapper.findUserById(1);
  19. System.out.println(user);
  20.  
  21. }

SqlMapConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.  
  7. <!-- 加载属性文件 -->
  8. <properties resource="db.properties">
  9. <!--properties中还可以配置一些属性名和属性值 -->
  10. <!-- <property name="jdbc.driver" value=""/> -->
  11. </properties>
  12. <!-- 全局配置参数,需要时再设置 -->
  13. <!-- <settings>
  14.  
  15. </settings> -->
  16.  
  17. <!-- 别名定义 -->
  18. <typeAliases>
  19.  
  20. <!-- 针对单个别名定义
  21. type:类型的路径
  22. alias:别名
  23. -->
  24. <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
  25. <!-- 批量别名定义
  26. 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
  27. -->
  28. <package name="cn.itcast.mybatis.po"/>
  29.  
  30. </typeAliases>
  31.  
  32. <!-- 和spring整合后 environments配置将废除-->
  33. <environments default="development">
  34. <environment id="development">
  35. <!-- 使用jdbc事务管理,事务控制由mybatis-->
  36. <transactionManager type="JDBC" />
  37. <!-- 数据库连接池,由mybatis管理-->
  38. <dataSource type="POOLED">
  39. <property name="driver" value="${jdbc.driver}" />
  40. <property name="url" value="${jdbc.url}" />
  41. <property name="username" value="${jdbc.username}" />
  42. <property name="password" value="${jdbc.password}" />
  43. </dataSource>
  44. </environment>
  45. </environments>
  46. <!-- 加载 映射文件 -->
  47. <mappers>
  48. <mapper resource="sqlmap/User.xml"/>
  49. <mapper resource="mapper/UserMapper.xml"/>
  50.  
  51. <!--通过resource方法一次加载一个映射文件 -->
  52. <!-- <mapper resource="mapper/UserMapper.xml"/> -->
  53.  
  54. <!-- 通过mapper接口加载单个 映射文件
  55. 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
  56. 上边规范的前提是:使用的是mapper代理方法
  57. -->
  58. <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
  59.  
  60. <!-- 批量加载mapper
  61. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
  62. 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
  63. 上边规范的前提是:使用的是mapper代理方法
  64. -->
  65. <!-- <package name="cn.mrf.mybatis.mapper"/> -->
  66.  
  67. </mappers>
  68.  
  69. </configuration>

UserMapper.xml

  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.  
  6. <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
  7. 注意:使用mapper代理方法开发,namespace有特殊重要的作用
  8. -->
  9. <mapper namespace="cn.mrf.mybatis.mapper.UserMapper">
  10.  
  11. <!-- 在 映射文件中配置很多sql语句 -->
  12. <!-- 需求:通过id查询用户表的记录 -->
  13. <!-- 通过 select执行数据库查询
  14. id:标识 映射文件中的 sql
  15. 将sql语句封装到mappedStatement对象中,所以将id称为statement的id
  16. parameterType:指定输入 参数的类型,这里指定int型
  17. #{}表示一个占位符号
  18. #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
  19.  
  20. resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
  21. -->
  22. <select id="findUserById" parameterType="int" resultType="cn.mrf.mybatis.po.User">
  23. SELECT * FROM USER WHERE id=#{value}
  24. </select>
  25.  
  26. <!-- 根据用户名称模糊查询用户信息,可能返回多条
  27. resultType:指定就是单条记录所映射的java对象 类型
  28. ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
  29. 使用${}拼接sql,引起 sql注入
  30. ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
  31. -->
  32. <select id="findUserByName" parameterType="java.lang.String" resultType="cn.mrf.mybatis.po.User">
  33. SELECT * FROM USER WHERE username LIKE '%${value}%'
  34. </select>
  35.  
  36. <!-- 添加用户
  37. parameterType:指定输入 参数类型是pojo(包括 用户信息)
  38. #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
  39. -->
  40. <insert id="insertUser" parameterType="cn.mrf.mybatis.po.User">
  41. <!--
  42. 将插入数据的主键返回,返回到user对象中
  43.  
  44. SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
  45.  
  46. keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
  47. order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
  48. resultType:指定SELECT LAST_INSERT_ID()的结果类型
  49. -->
  50. <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  51. SELECT LAST_INSERT_ID()
  52. </selectKey>
  53. insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
  54. <!--
  55. 使用mysql的uuid()生成主键
  56. 执行过程:
  57. 首先通过uuid()得到主键,将主键设置到user对象的id属性中
  58. 其次在insert执行时,从user对象中取出id属性值
  59. -->
  60. <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
  61. SELECT uuid()
  62. </selectKey>
  63. insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
  64.  
  65. </insert>
  66.  
  67. <!-- 删除 用户
  68. 根据id删除用户,需要输入 id值
  69. -->
  70. <delete id="deleteUser" parameterType="java.lang.Integer">
  71. delete from user where id=#{id}
  72. </delete>
  73.  
  74. <!-- 根据id更新用户
  75. 分析:
  76. 需要传入用户的id
  77. 需要传入用户的更新信息
  78. parameterType指定user对象,包括 id和更新信息,注意:id必须存在
  79. #{id}:从输入 user对象中获取id属性值
  80. -->
  81. <update id="updateUser" parameterType="cn.mrf.mybatis.po.User">
  82. update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  83. where id=#{id}
  84. </update>
  85.  
  86. </mapper>

Mybatis学习错误之:重复加载mapper.xml的更多相关文章

  1. MyBatis学习(01)之解决mapper绑定异常

    解决mapper绑定异常 HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.bind ...

  2. spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException

    14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [myba ...

  3. mybatis循环生成前后缀:mapper.xml的<trim></trim>

    *在mapper.xml中<trim prefix="(" suffix=")" suffixOverrides="," prefix ...

  4. mybatis框架的核心配置Mapper.xml

    映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系 需要配置的属性:<resultMap id=" ...

  5. 在mybatis 中批量加载mapper.xml

    可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...

  6. MyBatis 接口注解方式代替mapper.xml

    https://blog.csdn.net/m0_38068812/article/details/86566929 spring boot(8)-mybatis三种动态sql  或者 这个 1. 代 ...

  7. MyBatis学习(一)---配置文件,Mapper接口和动态SQL

    MyBatis MyBatis官方学习网站 http://www.mybatis.org/mybatis-3/zh/index.html 为什么需要MyBatis? Jdbc操作数据库的不足之处 1. ...

  8. Mybatis学习4——核心文件sqlMapperConfig.xml属性

    1.外部文件jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis ...

  9. mybatis学习 -每天一记 通用mapper 关于UUID回显的配置

    在使用通用mapper插入数据UUID回显 在使用通用mapper插入数据时,发现主键没有回显,我这里的主键是UUID的,解决方案是:配置一个MapperScannerConfigurer. @Bea ...

随机推荐

  1. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  2. dubbo分布式rpc框架用法

    dubbo是阿里巴巴开源的分布式服务框架,致力于提供高性能和透明化的rpc远程服务调用方案,以及soa服务治理方案,如果没有分布式需求,是不需要dubbo的,分布式环境dubbo的使用架构官方给出了一 ...

  3. Mac OS X 10.9.3 UI 设置界面无法设置时区解决

    10.9.3 在选项设置里无法设置时区,表现为选择时区的点的位置后无法保存,导致系统时间错乱,解决方法是用终端设置: sudo systemsetup -gettimezone sudo system ...

  4. 分享一个漂亮的ASP.NET MVC界面框架

    本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框 ...

  5. 移动app框架inoic功能研究

    原生移动app框架inoic功能研究 本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前 ...

  6. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  7. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  8. 【转载】学习资料存档:jQuery的deferred对象详解

    我在以前的文章里提到promise和deferred,这两个东西其实是对回调函数的一种写法,javascript的难点之一是回调函数,但是我们要写出优秀的javascript代码又不得不灵活运用回调函 ...

  9. 本地DNS安装

    在centOS里最常用的DNS服务工具应该是bind了.下面就以bind为例做一个DNS服务. 首先查看bind 是否已经安装 Rpm -qa | gerp bind 如果没有的话就用yum 安装一下 ...

  10. Spring-Context之六:基于Setter方法进行依赖注入

    上文讲了基于构造器进行依赖注入,这里讲解基于Setter方法进行注入.在Java世界中有个约定(Convention),那就是属性的设置和获取的方法名一般是:set+属性名(参数)及get+属性名() ...