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

举例来说:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JMCui

MongoDB系列三(Spring集成方案).

一、前言  MongoDB是最为流行的开源文档数据库之一。Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB: 通过注...

6247
来自专栏Hadoop实操

如何使用Java代码访问CDH的Solr服务

CDH集群使用的Solr版本为4.10.3,Java开发中会经常使用到solrj客户端包访问Solr集群。本篇文章主要讲述如何使用Java代码访问Kerbero...

8426
来自专栏飞雪无情的博客

Android注解支持(Support Annotations)

原文地址 http://tools.android.com/tech-docs/support-annotations

913
来自专栏Java开发

Spring MyBatis多数据源(同包)

创建基本的包 entity service dao 为了区分多数据源 一个用的是Mysql 一个是Oracle 方便测试,

1532
来自专栏Bug生活2048

Spring Boot学习笔记(六)结合MyBatis实现较为复杂的RESTful API

首先看下要实现的效果吧,完成下面截图部分的API,除了CRUD之外,分页查询也是使用的比较多的。

812
来自专栏程序猿DD

【译】Spring 官方教程:创建批处理服务

原文:Creating a Batch Service 译者:Mr.lzc 校对:lexburner 本指南将引导你完成创建基本的批处理驱动解决方案的过程。 你...

5127
来自专栏菩提树下的杨过

linq学习笔记(二)

试用了几天linq,感觉确实方便,而且生成的sql也还不错,下面是几点体会 1.几种常见的等效select写法 var s = from c in ctx.T...

18410
来自专栏hbbliyong

Spring Boot搭建Web项目常用功能

     首先要弄清楚为什么要包装统一结构结果数据,这是因为当任意的ajax请求超时或者越权操作时,系统能返回统一的错误信息给到前端,前端通过封装统一的ajax...

2462
来自专栏你不就像风一样

Spring+Struts2+Hibernate框架整合流程

1.新建Maven项目,导入相关依赖(推荐) 若不使用maven:请前往Maven官网依次下载jar包导入)

883
来自专栏微服务生态

Flume-NG源码分析-整体结构及配置载入分析

终于开始Flume源码的分析研究工作了,我也是边学边和大家分享,内容上难免有不足之处,望大家见谅。

1194

扫码关注云+社区