Mybatis学习错误之:重复加载mapper.xml
学习mybatis的时候,突然遇到测试出错。测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正。错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现确实。修改后正常。
原因是直接复制教学代码,在SqlMapConfig.xml中,配置mappers,加载映射文件,已经配置了加载包文件,然后我自己又添加了单独的mapper。所以出错了,将包注释掉就ok。
测试用例:
- @Before
- public void setUp() throws Exception {
- // 创建sqlSessionFactory
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- sqlSessionFactory = new SqlSessionFactoryBuilder()
- .build(inputStream);
- }
- @Test
- public void testFindUserById() throws Exception{
- SqlSession sqlSession = sqlSessionFactory.openSession();
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- User user = userMapper.findUserById(1);
- System.out.println(user);
- }
SqlMapConfig.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 加载属性文件 -->
- <properties resource="db.properties">
- <!--properties中还可以配置一些属性名和属性值 -->
- <!-- <property name="jdbc.driver" value=""/> -->
- </properties>
- <!-- 全局配置参数,需要时再设置 -->
- <!-- <settings>
- </settings> -->
- <!-- 别名定义 -->
- <typeAliases>
- <!-- 针对单个别名定义
- type:类型的路径
- alias:别名
- -->
- <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
- <!-- 批量别名定义
- 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
- -->
- <package name="cn.itcast.mybatis.po"/>
- </typeAliases>
- <!-- 和spring整合后 environments配置将废除-->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,事务控制由mybatis-->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,由mybatis管理-->
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 加载 映射文件 -->
- <mappers>
- <mapper resource="sqlmap/User.xml"/>
- <mapper resource="mapper/UserMapper.xml"/>
- <!--通过resource方法一次加载一个映射文件 -->
- <!-- <mapper resource="mapper/UserMapper.xml"/> -->
- <!-- 通过mapper接口加载单个 映射文件
- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
- 上边规范的前提是:使用的是mapper代理方法
- -->
- <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
- <!-- 批量加载mapper
- 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
- 上边规范的前提是:使用的是mapper代理方法
- -->
- <!-- <package name="cn.mrf.mybatis.mapper"/> -->
- </mappers>
- </configuration>
UserMapper.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
- 注意:使用mapper代理方法开发,namespace有特殊重要的作用
- -->
- <mapper namespace="cn.mrf.mybatis.mapper.UserMapper">
- <!-- 在 映射文件中配置很多sql语句 -->
- <!-- 需求:通过id查询用户表的记录 -->
- <!-- 通过 select执行数据库查询
- id:标识 映射文件中的 sql
- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id
- parameterType:指定输入 参数的类型,这里指定int型
- #{}表示一个占位符号
- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
- -->
- <select id="findUserById" parameterType="int" resultType="cn.mrf.mybatis.po.User">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- <!-- 根据用户名称模糊查询用户信息,可能返回多条
- resultType:指定就是单条记录所映射的java对象 类型
- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
- 使用${}拼接sql,引起 sql注入
- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
- -->
- <select id="findUserByName" parameterType="java.lang.String" resultType="cn.mrf.mybatis.po.User">
- SELECT * FROM USER WHERE username LIKE '%${value}%'
- </select>
- <!-- 添加用户
- parameterType:指定输入 参数类型是pojo(包括 用户信息)
- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
- -->
- <insert id="insertUser" parameterType="cn.mrf.mybatis.po.User">
- <!--
- 将插入数据的主键返回,返回到user对象中
- SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
- keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
- resultType:指定SELECT LAST_INSERT_ID()的结果类型
- -->
- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
- SELECT LAST_INSERT_ID()
- </selectKey>
- insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
- <!--
- 使用mysql的uuid()生成主键
- 执行过程:
- 首先通过uuid()得到主键,将主键设置到user对象的id属性中
- 其次在insert执行时,从user对象中取出id属性值
- -->
- <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
- SELECT uuid()
- </selectKey>
- insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
- </insert>
- <!-- 删除 用户
- 根据id删除用户,需要输入 id值
- -->
- <delete id="deleteUser" parameterType="java.lang.Integer">
- delete from user where id=#{id}
- </delete>
- <!-- 根据id更新用户
- 分析:
- 需要传入用户的id
- 需要传入用户的更新信息
- parameterType指定user对象,包括 id和更新信息,注意:id必须存在
- #{id}:从输入 user对象中获取id属性值
- -->
- <update id="updateUser" parameterType="cn.mrf.mybatis.po.User">
- update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
- where id=#{id}
- </update>
- </mapper>
Mybatis学习错误之:重复加载mapper.xml的更多相关文章
- MyBatis学习(01)之解决mapper绑定异常
解决mapper绑定异常 HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.bind ...
- spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException
14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [myba ...
- mybatis循环生成前后缀:mapper.xml的<trim></trim>
*在mapper.xml中<trim prefix="(" suffix=")" suffixOverrides="," prefix ...
- mybatis框架的核心配置Mapper.xml
映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系 需要配置的属性:<resultMap id=" ...
- 在mybatis 中批量加载mapper.xml
可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...
- MyBatis 接口注解方式代替mapper.xml
https://blog.csdn.net/m0_38068812/article/details/86566929 spring boot(8)-mybatis三种动态sql 或者 这个 1. 代 ...
- MyBatis学习(一)---配置文件,Mapper接口和动态SQL
MyBatis MyBatis官方学习网站 http://www.mybatis.org/mybatis-3/zh/index.html 为什么需要MyBatis? Jdbc操作数据库的不足之处 1. ...
- Mybatis学习4——核心文件sqlMapperConfig.xml属性
1.外部文件jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis ...
- mybatis学习 -每天一记 通用mapper 关于UUID回显的配置
在使用通用mapper插入数据UUID回显 在使用通用mapper插入数据时,发现主键没有回显,我这里的主键是UUID的,解决方案是:配置一个MapperScannerConfigurer. @Bea ...
随机推荐
- 备库Seconds_Behind_Master的计算
背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...
- dubbo分布式rpc框架用法
dubbo是阿里巴巴开源的分布式服务框架,致力于提供高性能和透明化的rpc远程服务调用方案,以及soa服务治理方案,如果没有分布式需求,是不需要dubbo的,分布式环境dubbo的使用架构官方给出了一 ...
- Mac OS X 10.9.3 UI 设置界面无法设置时区解决
10.9.3 在选项设置里无法设置时区,表现为选择时区的点的位置后无法保存,导致系统时间错乱,解决方法是用终端设置: sudo systemsetup -gettimezone sudo system ...
- 分享一个漂亮的ASP.NET MVC界面框架
本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框 ...
- 移动app框架inoic功能研究
原生移动app框架inoic功能研究 本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前 ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- 【转载】学习资料存档:jQuery的deferred对象详解
我在以前的文章里提到promise和deferred,这两个东西其实是对回调函数的一种写法,javascript的难点之一是回调函数,但是我们要写出优秀的javascript代码又不得不灵活运用回调函 ...
- 本地DNS安装
在centOS里最常用的DNS服务工具应该是bind了.下面就以bind为例做一个DNS服务. 首先查看bind 是否已经安装 Rpm -qa | gerp bind 如果没有的话就用yum 安装一下 ...
- Spring-Context之六:基于Setter方法进行依赖注入
上文讲了基于构造器进行依赖注入,这里讲解基于Setter方法进行注入.在Java世界中有个约定(Convention),那就是属性的设置和获取的方法名一般是:set+属性名(参数)及get+属性名() ...