前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >mybatis错误之配置文件属性配置问题

mybatis错误之配置文件属性配置问题

作者头像
Ryan-Miao
发布于 2018-03-13 03:59:37
发布于 2018-03-13 03:59:37
1.1K00
代码可运行
举报
文章被收录于专栏:Ryan MiaoRyan Miao
运行总次数:0
代码可运行

在mybatis的配置文件SqlMapConfig.xml中,可以在开始的地方先加载一个properties节点,用来定义属性变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <!-- 加载属性文件 -->
2     <properties resource="db.properties">
3         <!--properties中还可以配置一些属性名和属性值  -->
4         <!-- <property name="jdbc.driver" value=""/> -->
5     </properties>

然后可以在后面的节点中引用变量:

db.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=

value=m

SqlMapConfig

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 <!-- 和spring整合后 environments配置将废除-->
 2     <environments default="development">
 3         <environment id="development">
 4         <!-- 使用jdbc事务管理,事务控制由mybatis-->
 5             <transactionManager type="JDBC" />
 6         <!-- 数据库连接池,由mybatis管理-->
 7             <dataSource type="POOLED">
 8                 <property name="driver" value="${jdbc.driver}" />
 9                 <property name="url" value="${jdbc.url}" />
10                 <property name="username" value="${jdbc.username}" />
11                 <property name="password" value="${jdbc.password}" />
12             </dataSource>
13         </environment>
14     </environments>

但是,这涉及到几个问题,首先就是加载顺序,后者的变量会覆盖先加载的?看教程是这样说的:

properties特性:

 注意:

MyBatis 将按照下面的顺序来加载属性:

      在 properties 元素体内定义的属性首先被读取。

      然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

        最后读取parameterType传递的属性,它会覆盖已读取的同名属性。

 建议:

不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。

      在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX

举例来说:

  1. 在db.properties中定义了value=m
  2. 在mybat配置mapper里,SqlMapConfig.xml中设置mapper文件为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1     <!-- 加载 映射文件 -->
2     <mappers>
3         <mapper resource="mapper/UserMapper.xml"/>
4     </mappers>

    3. 编写接口:UserMapper.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package cn.mrf.mybatis.mapper;
 2 
 3 
 4 import java.util.List;
 5 
 6 import cn.mrf.mybatis.po.User;
 7 
 8 /**
 9  * 
10 * @ClassName: UserDao 
11 * @Description: mapper接口:用户管理 
12 * @author mrf
13 * @date 2015-9-19 下午05:48:49 
14 *
15  */
16 public interface UserMapper {
17     
18     
19     //根据id查询用户信息
20     public User findUserById(int id) throws Exception;
21     
22     //根据用户名查询用户列表
23     public List<User> findUserByName(String name) throws Exception;
24     
25     //添加用户信息
26     public void insertUser(User user) throws Exception;
27     
28     //删除用户信息
29     public void deleteUser(int id) throws Exception;
30     
31     //更新用户信息
32     public void updateUser(User user) throws Exception;
33     
34 }

 4. 配置UserMapper.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 </mapper>

 5. 编写mapper代理测试用例UserMapperTest.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package cn.mrf.mybatis.mapper;
 2 
 3 
 4 import java.io.InputStream;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import cn.mrf.mybatis.po.User;
15 
16 import com.sun.istack.internal.Builder;
17 
18 public class UserMapperTest {
19 
20     private SqlSessionFactory sqlSessionFactory;
21     
22     @Before
23     public void setUp() throws Exception {
24         // 创建sqlSessionFactory
25         // mybatis配置文件
26         String resource = "SqlMapConfig.xml";
27         // 得到配置文件流
28         InputStream inputStream = Resources.getResourceAsStream(resource);
29         // 创建会话工厂,传入mybatis的配置文件信息
30         sqlSessionFactory = new SqlSessionFactoryBuilder()
31                 .build(inputStream);
32         
33     }
34     
35     @Test
36     public void testFindUserByName() throws Exception{
37         SqlSession sqlSession = sqlSessionFactory.openSession();
38         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
39         List<User> users = userMapper.findUserByName("小军");
40         System.out.println(users);
41         sqlSession.close();
42         
43     }
44     
45 }

5.结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 DEBUG [main] - Opening JDBC Connection
 2 DEBUG [main] - Created connection 423250256.
 3 DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@193a4950]
 4 DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE username LIKE '%m%' 
 5 DEBUG [main] - ==> Parameters: 
 6 DEBUG [main] - <==      Total: 1
 7 [User [id=1, username=mrf, sex=, birthday=Sat Feb 23 00:00:00 CST 1991, address=北京]]
 8 DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@193a4950]
 9 DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@193a4950]
10 DEBUG [main] - Returned connection 423250256 to pool.

6.分析:

  可以看出,本来是根据用户名查找用户,输入了用户名为小军,而实际上,系统读取的用户名为m.

  也就是说,系统没有读取parameterType的值,或者被覆盖。

  那么,问题是,教程说最后读取parameterType并覆盖、如果这样,最后应该读取的小军才对。实际却是m.顺序有疑问了。

  好吧,因为parameterType中并没有这个值,所以没有覆盖。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis学习错误之:重复加载mapper.xml
学习mybatis的时候,突然遇到测试出错。测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正。错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现确实。修改后正常。 原因是直接复制教学代码,在SqlMapConfig.xml中,配置mappers,加载映射文件,已经配置了加载包文件,然后我自己又添加了单独的mapper。所以出错了,将包注释掉就ok。 测试用例: 1 @Before 2 public void setUp() throws E
Ryan-Miao
2018/03/13
2.1K0
Mybatis学习笔记之一(环境搭建和入门案例介绍)
  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Kevin_Zhang
2019/02/20
8890
Mybatis学习笔记之一(环境搭建和入门案例介绍)
MyBatis学习笔记(一) --- MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 
挽风
2021/04/13
1.3K0
MyBatis学习笔记(一) --- MyBatis入门
Mybatis学习笔记2
Mybatis学习笔记2 本章目录描述: 1、Dao开发方法 1.1需求 1.2SqlSession的使用范围 1.3原始Dao开发方式 1.4 Mapper动态代理方式 2、SqlMapConfig.xml配置文件; 2.1SqlMapConfig.xml中配置的内容 2.2properties(属性) 2.3typeAliases(类型别名) 2.4 mappers(映射器) 1 Dao开发方法 使用Mybatis开发Dao,通常有两个方法,即原始Dao开
Java学习
2018/04/17
6530
myBatis笔记
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
HUC思梦
2020/09/03
1.4K0
myBatis笔记
day61_Mybatis学习笔记_01
  1、执行sql_table.sql脚本,创建数据库表;   2、执行sql_data.sql初始化测试数据。
黑泽君
2018/11/08
1.4K0
mybatis使用(配置入门)
写好mapper接口(相当于dao的接口)和mapper.xml映射文件,mybatis可以自动生成mapper接口的实现类对象
leobhao
2022/06/28
3190
MyBatis框架之第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
1.2K0
MyBatis从入门到精通(二)—mybatis的Dao实现和配置文件深入
采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
共饮一杯无
2022/11/28
7170
MyBatis从入门到精通(二)—mybatis的Dao实现和配置文件深入
MyBatis学习笔记
MyBatis 1.MyBatis是一个优秀的持久层框架,对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身。   而不用花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集等jdbc繁杂的过程。 2.MyBatis配置: SQLMapConfig.xml  全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml sql映射文件,配置了操作数据库的sql语句。需要在SqlMapConfig.xml里边加载。
曼路
2018/10/18
4730
MyBatis学习笔记
mybatis使用 原始dao开发 (自己写dao实现类)
先配置sqlMapConfig.xml文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "
用户5927264
2019/07/31
5810
Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
Kevin_Zhang
2019/02/20
1.3K0
Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
MyBatis--框架学习
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精 去处理加载驱动、创建连接、创建statement等繁杂的过程。
花猪
2022/02/23
5360
MyBatis--框架学习
17-MyBatis映射文件与核心配置文件深入
可以看到,在之前的映射文件中,所有sql语句都是写死的,并不会根据我传入参数的不同进行区分,但在实际开发过程中,可能需要执行sql语句查询前先进行逻辑判断或其他操作,对参数进行简单的判断
Ywrby
2022/10/27
4130
17-MyBatis映射文件与核心配置文件深入
MyBatis:基本应用
软件开发常用的架构是三层架构,之所以流行是因为有着清晰的任务划分。一般包括以下三层:
RendaZhang
2020/09/08
1.3K0
MyBatis:基本应用
mybatis框架复习必看-全网最强的MyBatis学习教程
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
晴天娃娃只会笑不会哭
2022/03/23
5800
MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
②sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
共饮一杯无
2022/11/28
4250
MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
Mybatis代理开发、动态sql、核心配置文件
只需要编写Mapper 接口,Mybatis 框架根据接口定义创建接口的动态代理对象
咕咕星
2021/01/05
3240
手写Mybatis源码(原来真的很简单!!!)
主要分两部分,项目使用端:平常写代码所说的后台服务;持久层框架:即项目使用端引入的jar包
冬天vs不冷
2025/01/21
1210
手写Mybatis源码(原来真的很简单!!!)
Mybatis开发应用
采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
乐心湖
2021/01/18
6750
Mybatis开发应用
相关推荐
Mybatis学习错误之:重复加载mapper.xml
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文