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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在mybatis的配置文件SqlMapConfig.xml中,可以在开始的地方先加载一个properties节点,用来定义属性变量。 1 2 3 4 5 然后可以在后面的节点中引用变量: db.

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

1 <!-- 加载属性文件 -->
2     <properties resource="db.properties">
3         <!--properties中还可以配置一些属性名和属性值  -->
4         <!-- <property name="jdbc.driver" value=""/> -->
5     </properties>

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

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=

value=m

SqlMapConfig

 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文件为:
1     <!-- 加载 映射文件 -->
2     <mappers>
3         <mapper resource="mapper/UserMapper.xml"/>
4     </mappers>

    3. 编写接口:UserMapper.java

 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

 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

 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.结果:

 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中并没有这个值,所以没有覆盖。





唯有不断学习方能改变! -- Ryan Miao
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
XML Java 数据库连接
Mybatis学习笔记(二)Mapper的配置问题
Mybatis学习笔记(二)Mapper的配置问题
|
20天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
7天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
2月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
93 1
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。
|
28天前
|
Java 数据库连接 开发者
MyBatis-Plus整合SpringBoot及使用
MyBatis-Plus为MyBatis提供了强大的增强,使得在Spring Boot项目中的数据访问层开发变得更加快捷和简便。通过MyBatis-Plus提供的自动CRUD、灵活的查询构造器和简洁的配置,开发者
36 0
|
2月前
|
数据库
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
这篇文章介绍了如何在基于SpringBoot+Vue+MybatisPlus的项目中使用elementUI的dialog组件进行用户信息的添加和删除操作,包括弹窗表单的设置、信息提交、数据库操作以及删除前的信息提示和确认。
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
|
2月前
|
Java 数据库 Spring
MyBatisPlus分页插件在SpringBoot中的使用
这篇文章介绍了如何在Spring Boot项目中配置和使用MyBatis-Plus的分页插件,包括创建配置类以注册分页拦截器,编写测试类来演示如何进行分页查询,并展示了测试结果和数据库表结构。
MyBatisPlus分页插件在SpringBoot中的使用