在mybatis的配置文件SqlMapConfig.xml中,可以在开始的地方先加载一个properties节点,用来定义属性变量。
1 23 4 5
然后可以在后面的节点中引用变量:
db.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password=value=m
SqlMapConfig
1 23 4 5 146 7 8 139 10 11 12
但是,这涉及到几个问题,首先就是加载顺序,后者的变量会覆盖先加载的?看教程是这样说的:
properties特性:
注意:
MyBatis 将按照下面的顺序来加载属性:
在 properties 元素体内定义的属性首先被读取。
然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX
举例来说:
- 在db.properties中定义了value=m
- 在mybat配置mapper里,SqlMapConfig.xml中设置mapper文件为:
1 23 4
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 mrf13 * @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 ListfindUserByName(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 2 5 6 910 11 12 13 22 25 26 32 35
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 @Before23 public void setUp() throws Exception {24 // 创建sqlSessionFactory25 // 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 @Test36 public void testFindUserByName() throws Exception{37 SqlSession sqlSession = sqlSessionFactory.openSession();38 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);39 Listusers = 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博客园博客,原文链接:http://www.cnblogs.com/woshimrf/p/4828974.html,如需转载请自行联系原作者