mybatis错误之配置文件属性配置问题
时间:2022-05-04
本文章向大家介绍mybatis错误之配置文件属性配置问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在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
举例来说:
- 在db.properties中定义了value=m
- 在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中并没有这个值,所以没有覆盖。
- C# 窗体常用API函数 应用程序窗体查找
- C#进阶系列——WebApi接口测试工具:WebApiTestClient
- 由Dapper QueryMultiple 返回数据的问题
- 【初探IONIC】不会Native可不可以开发APP?
- MVC视图展现模式之移动布局解析-续集
- 在 ASP.NET MVC 中使用异步控制器
- MVC5 Entity Framework学习之异步和存储过程
- ConcurrentDictionary 对决 Dictionary+Locking
- 在ASP.NET 5中使用SignalR
- 避免在ASP.NET Core中使用服务定位器模式
- 直传文件到Azure Storage的Blob服务中
- 闭路电视探头究竟有多不安全?
- windows API 开发飞机订票系统 图形化界面 (四)
- windows API 开发飞机订票系统 图形化界面 (三)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- vue3+webpack项目搭建实验
- HTML中p标签中插入div标签会发生什么
- K8S 在有赞 PaaS 测试环境中的实践
- Netty高级篇
- SQL工具集-查询会话等待
- 哈工大李志军操作系统实验1
- 有赞推荐系统关键技术
- 8086汇编格式
- React 中 getDerivedStateFromProps 的三个场景
- Java7的try-with-resources声明(转)
- 聊聊java中的哪些Map:(三)HashMap中的Iterator和Spliterator
- 聊聊java中的哪些Map:(四)LinkedHashMap源码分析
- CGroup 介绍
- 有赞持续集成容器化实践
- 怎么创建一个良好的Git提交信息