您好,登錄后才能下訂單哦!
Mybatis中properties和settings標簽如何使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
如下面的例子:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"> <!-- <property name="database.driver" value="com.mysql.jdbc.Driver"/> <property name="database.url" value="jdbc:mysql://localhost:3306/chapter4"/> <property name="database.username" value="root"/> <property name="database.password" value="123456"/> --> </properties> <typeAliases><!-- 別名 --> <!-- <typeAlias alias="role" type="com.learn.ssm.chapter4.pojo.Role"/> --> <package name="com.learn.ssm.chapter4.pojo" /> </typeAliases> <typeHandlers> <!-- <typeHandler jdbcType="VARCHAR" javaType="string" handler="com.learn.ssm.chapter4.typehandler.MyTypeHandler" /> --> <package name="com.learn.ssm.chapter4.typehandler" /> </typeHandlers> <!-- 數據庫環境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="com.learn.ssm.chapter4.datasource.DbcpDataSourceFactory"> <property name="driver" value="${database.driver}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" /> </dataSource> </environment> </environments> <!-- <databaseIdProvider type="DB_VENDOR"> <property name="Oracle" value="oracle" /> <property name="MySQL" value="mysql" /> <property name="DB2" value="db2" /> </databaseIdProvider> --> <databaseIdProvider type="com.learn.ssm.chapter4.databaseidprovider.MyDatabaseIdProvider"> <property name="msg" value="自定義DatabaseIdProvider" /> </databaseIdProvider> <mappers> <package name="com.learn.ssm.chapter4.mapper" /> </mappers> </configuration>
需要注意的是mybatis的配置項不能夠相互顛倒,如果顛倒了他們的順序,那么在mybatis啟動階段就會發生異常,導致程序無法進行下去。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties></properties> <settings></settings> <typeAliases></typeAliases> <typeHandlers></typeHandlers> <objectFactory type=""></objectFactory> <plugins></plugins> <environments default=""> <environment id=""> <dataSource type=""></dataSource> <transactionManager type=""></transactionManager> </environment> </environments> <databaseIdProvider type=""></databaseIdProvider> <mappers></mappers> </configuration>
properties屬性是用來給系統配置一些參數,可以放在xml文件或者是properties文件中,而不是放在java 的編碼中,這樣的好處是方便管理和修改,而不會引起代碼的重新編譯,一般而言,有以下3種配置方式:
properties子元素:
<property name="database.driver" value="com.mysql.jdbc.Driver"/> <property name="database.url" value="jdbc:mysql://localhost:3306/chapter4"/> <property name="database.username" value="root"/> <property name="database.password" value="123456"/>
如上面及格對數據庫連接參數的設定,我們需要在property標簽內部標識屬性名稱和屬性值。這種方式將配置的屬性的名稱和對應的屬性值記錄在xml文件中。同時也可以采用占位符引用管理,這個在代碼的編寫中經常見到,是一種較為流行的操作方式。
<property name="driver" value="${database.driver}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" />
如上面屬性的賦值方式,采用的占位符引用的方式,將上文中寫好的值通過占位的方式引用過來,這樣寫的話還需要我們在上面的properties標簽下面定義properties的子元素,類似于所示的例子一樣。
使用properties文件:
這就需要我們創建一個properties的文件:
database.driver=com.mysql.jdbc.Driver database.url=jdbc:mysql://localhost:3306/chapter4 database.username=root database.password=123456
我們想利用這個文件中所定義的值,則需要在<properties>標簽的resource 進行賦值,其值為包的路徑,使用方式如下(假設文件名為jdbc.properties):
<properties resource="jdbc.properties" />
這樣可以將多個鍵值飯在一個properties文件中,方便以后的修改和管理。同時,也可以結合上面的占位符的方式進行傳遞。
使用程序傳遞方式傳遞參數:
某些情況下數據庫的用戶密碼數對開發人員和其他人員保密的,運維人員為了保密一般的都需要把用戶名和密碼進行加密,然后配置到properties文件中,此時往往需要解密才能到到真實的用戶名和密碼數據庫也不可能使用已經加密的字符串去鏈接數據庫。所以假設已經有一個操作解密的工具,我們需要解密人后重置到properties文件中:
public class SqlSessionFactoryUtils { private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class; private static SqlSessionFactory sqlSessionFactory = null; private SqlSessionFactoryUtils() { } public static SqlSessionFactory getSqlSessionFactory() { synchronized (LOCK) { if (sqlSessionFactory != null) { return sqlSessionFactory; } String resource = "mybatis-config.xml"; InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 采用程序傳遞加密參數,啟用它之前,修改用戶密碼為密文.. InputStream in = Resources.getResourceAsStream("jdbc.properties"); Properties props = new Properties(); props.load(in); String username = props.getProperty("database.username"); String password = props.getProperty("database.password"); // 解密用戶和密碼,并在屬性中重置 props.put("database.username", CodeUtils.decode(username)); props.put("database.password", CodeUtils.decode(password)); inputStream = Resources.getResourceAsStream(resource); // 使用程序傳遞的方式覆蓋原有的properties屬性參數 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, props); } catch (IOException e) { e.printStackTrace(); return null; } return sqlSessionFactory; } } public static SqlSession openSqlSession() { if (sqlSessionFactory == null) { getSqlSessionFactory(); } return sqlSessionFactory.openSession(); } public static void main(String[] args) { System.out.println(CodeUtils.encode("root")); System.out.println(CodeUtils.encode("123456")); } static class CodeUtils { private static String encode(String src) { BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(src.getBytes()); } private static String decode(String des) { BASE64Decoder decoder = new BASE64Decoder(); try { return new String(decoder.decodeBuffer(des)); } catch (IOException e) { e.printStackTrace(); } return null; } } }
這里面制作了一個基于程序傳遞的方式傳遞參數的例子,首先使用Resource對象讀取一個jdbc.properties文件,然后獲取原來的配置的用戶名和密碼,并進行解密,重置,最后使用SqlSessionFactoryBuilder類的biuld方法傳遞properties中的參數完成覆蓋原來的密文,及解決了安全問題,又能夠安全的去連接數據庫。
這個是mybatis中最為復雜的配置,這個標簽中的設置能夠深刻的影響到底層的運行,但是大部分情況下使用默認的配置就可以運行,不需要去配置這個屬性,多多數情況下修改一些常用的規則就可以了,比如自動映射,駝峰命名映射,級聯規則,是否開啟緩存,執行器類型等等。
<!-- settings是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。 --> <settings> <!-- 該配置影響的所有映射器中配置的緩存的全局開關。默認值true --> <setting name="cacheEnabled" value="true"/> <!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。默認值false --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 是否允許單一語句返回多結果集(需要兼容驅動)。 默認值true --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。默認值true --> <setting name="useColumnLabel" value="true"/> <!-- 允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。 默認值false --> <setting name="useGeneratedKeys" value="false"/> <!-- 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。 --> <!-- 默認值PARTIAL --> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <!-- 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句并執行批量更新。默認SIMPLE --> <setting name="defaultExecutorType" value="SIMPLE"/> <!-- 設置超時時間,它決定驅動等待數據庫響應的秒數。 --> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <!-- 允許在嵌套語句中使用分頁(RowBounds)默認值False --> <setting name="safeRowBoundsEnabled" value="false"/> <!-- 是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 默認false --> <setting name="mapUnderscoreToCamelCase" value="false"/> <!-- MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 --> <setting name="localCacheScope" value="SESSION"/> <!-- 當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 --> <setting name="jdbcTypeForNull" value="OTHER"/> <!-- 指定哪個對象的方法觸發一次延遲加載。 --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
關于Mybatis中properties和settings標簽如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。