十年河東,十年河西,莫欺少年窮
學無止境,精益求精
MyBatis標籤如下:
Mybatis 標籤在配置文件中要按照上圖順序進行配置。
如果你在Idea中將順序配錯了,Idea會有一個提示,如下:
1、properties
properties 用於引入外部 .properties文件,最常用的是引入數據庫配置文件,常用語法爲:
<!--引入外部配置文件 --> <properties resource="db.properties"/>
在mybatis-config.xml同錄下下創建db.properties,如下
Jbdc.driver = com.mysql.cj.jdbc.Driver Jbdc.url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC Jbdc.username = root Jbdc.password = chen1234567890
2、settings
settings 用於配置MyBatis緩存、懶加載等,常用配置如下:
<settings> <!--開啓全局緩存 默認true--> <setting name="cacheEnabled" value="true"/> <!--開啓全局懶加載 默認false--> <setting name="lazyLoadingEnabled" value="true"/> <!--開啓關聯屬性懶加載 默認false--> <setting name="aggressiveLazyLoading" value="true"/> <!--全局開啓駝峯映射--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
3、typeAliases
typeAliases 用於爲映射文件中的 resultType 設置別名。
例如下面這個映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace=綁定一個指定的Dao/Mapper接口--> <mapper namespace="com.one5a.model.User"> <select id="getUserList" resultType="com.one5a.model.User"> select * from users </select> <select id="getUserbyId" resultType="com.one5a.model.User" parameterType="int"> select * from users where uid=#{id} </select> </mapper>
resultType="com.one5a.model.User" 比較長,用起來不方便,可以爲它設置一個別名,這樣寫起來方便快捷
<typeAliases> <typeAlias alias="User" type="com.one5a.model.User"></typeAlias> </typeAliases>
上述這種寫法簡潔了配置,但是如果一個包下面有100個實體,我們就需要配置100次,因此引入包掃描配置法
包掃描配置
<typeAliases> <!-- <typeAlias alias="User" type="com.one5a.model.User"></typeAlias> --> <package name="com.one5a.model"/> </typeAliases>
com.one5a.model 包下的實體默認均使用實體名稱【不區分大小寫】。
例如,count(*) 返回值爲int ,因此resultType 可以使用默認別名 int
<select id="getTotal" resultType="int" parameterType="int"> select count(*) from users where uid=#{id} </select>
@Test public void getTotal() throws IOException { String resource = "mybatis-config.xml"; //使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件) //InputStream is = Resources.getResourceAsStream(resource); //InputStream is = Tests.class.getClassLoader().getResourceAsStream(resource); InputStream is =Resources.getResourceAsStream(resource); //構建sqlSession的工廠 線程安全 建議使用單列模式 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //絕對不能將它作爲靜態對象使用,不可共享 SqlSession session = sessionFactory.openSession(); /** * 映射sql的標識字符串, * com.oumyye.mapping.UserMapping是userMapper.xml文件中mapper標籤的namespace屬性的值, * getUser是select標籤的id屬性值,通過select標籤的id屬性值就可以找到要執行的SQL */ String statement = "com.one5a.model.User.getTotal";//映射sql的標識字符串 //執行查詢返回一個唯一user對象的sql Integer count = session.selectOne(statement,1); System.out.println(count); }
environments
environments用於配置運行環境
在數據庫配置信息中增加生產環境用戶名和密碼
Jbdc.driver = com.mysql.cj.jdbc.Driver Jbdc.url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC Jbdc.username = root Jbdc.password = chen1234 prd.username = root prd.password = chen1234
<environments default="prd"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${Jbdc.driver}"/> <property name="url" value="${Jbdc.url}"/> <property name="username" value="${Jbdc.username}"/> <property name="password" value="${Jbdc.password}"/> </dataSource> </environment> <environment id="prd"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${Jbdc.driver}"/> <property name="url" value="${Jbdc.url}"/> <property name="username" value="${prd.username}"/> <property name="password" value="${prd.password}"/> </dataSource> </environment> </environments>
default = “prd” 使用的是生產環境,dataSource type=“POOLED”,使用默認數據庫連接池的模式
Mappers
<!-- 註冊UserMapper.xml --> <mappers> <mapper resource="Mapper/UserMapper.xml"/> </mappers>
最後貼出Mybatis核心配置文件 和 用於映射文件
mybatis-config.xml
<?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="db.properties"/> <settings> <!--開啓全局緩存 默認true--> <setting name="cacheEnabled" value="true"/> <!--開啓全局懶加載 默認false--> <setting name="lazyLoadingEnabled" value="true"/> <!--開啓關聯屬性懶加載 默認false--> <setting name="aggressiveLazyLoading" value="true"/> <!--全局開啓駝峯映射--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <!--別名方式--> <!-- <typeAlias alias="User" type="com.one5a.model.User"></typeAlias> --> <!--包掃描方式--> <package name="com.one5a.model"/> </typeAliases> <environments default="prd"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${Jbdc.driver}"/> <property name="url" value="${Jbdc.url}"/> <property name="username" value="${Jbdc.username}"/> <property name="password" value="${Jbdc.password}"/> </dataSource> </environment> <environment id="prd"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${Jbdc.driver}"/> <property name="url" value="${Jbdc.url}"/> <property name="username" value="${prd.username}"/> <property name="password" value="${prd.password}"/> </dataSource> </environment> </environments> <!-- 註冊UserMapper.xml --> <mappers> <mapper resource="Mapper/UserMapper.xml"/> </mappers> </configuration>
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace=--> <mapper namespace="com.one5a.model.User"> <select id="getUserList" resultType="User"> select * from users </select> <select id="getUserbyId" resultType="User" parameterType="int"> select * from users where uid=#{id} </select> <select id="getTotal" resultType="int" parameterType="int"> select count(*) from users where uid=#{id} </select> </mapper>
UserMapper 屬於映射文件,普通模式下,UserMapper文件的命名空間值和【實體所在的包+實體名稱】保持一致,接口編程情況下,和 【接口所在的包+接口名稱】保持一致。
Mybatis接口式編程
新建接口 com.one5a.Inter.IUser
接口必須實現UserMapper中定義的所有方法,如下
package com.one5a.Inter; import com.one5a.model.User; import java.util.List; public interface IUser { List<User> getUserList(); User getUserbyId(Integer id); Integer getTotal(Integer id); }
修改UserMapper的命名空間爲【接口所在的包+接口名稱】,即:com.one5a.Inter.IUser
光標放在接口上,Alt+Insert 快捷鍵,生成測試類
package com.one5a.Inter; import com.one5a.model.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.InputStream; import java.util.List; import static org.junit.Assert.*; public class UserTest { IUser user=null; @Before public void setUp() throws Exception { String resource = "mybatis-config.xml"; //使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件) //InputStream is = Resources.getResourceAsStream(resource); //InputStream is = Tests.class.getClassLoader().getResourceAsStream(resource); InputStream is = Resources.getResourceAsStream(resource); //構建sqlSession的工廠 線程安全 建議使用單列模式 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //絕對不能將它作爲靜態對象使用,不可共享 SqlSession session = sessionFactory.openSession(); //創建接口動態代理對象 user=session.getMapper(IUser.class); } @Test public void getUserList() { List<User> userLst=user.getUserList(); System.out.println(userLst); } @Test public void getUserbyId() { User userLst=user.getUserbyId(1); System.out.println(userLst); } @Test public void getTotal() { Integer cnt =user.getTotal(2); System.out.println(cnt); } }
注意代碼中的動態生成代理對象,這句話爲接口編程的核心。
@天才臥龍