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=mSqlMapConfig
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
?
舉例來說:
? ? 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
總結
以上是生活随笔為你收集整理的mybatis错误之配置文件属性配置问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录下在linux下编译java源程序
- 下一篇: 文档排序模型--查询似然Query Li