配置優化
-
將數據源的配置放在properties文件中
在mybatis的配置文件中使用properties引入數據庫的配置文件
在數據源指定屬性的位置使用類似el表達式替換數據 ${} -
批量註冊dao層
在mapper標籤中指定package 會自動掃描包下面的所有接口 -
實體類別名
typeAliases中配置實體類的別名
mybatis具有內置的別名
統一起別名 指定某一個包下面的實體類都支持別名
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/emp
username=root
password=123456
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"></properties>
<!--相關的設置-->
<settings>
<!--mybatis log4j的日誌 -->
<setting name="logImpl" value="LOG4J" />
</settings>
<!--給實體類定義別名-->
<typeAliases>
<!--別名的規則是類名-->
<!--單獨定義別名-->
<!--<typeAlias type="com.igeek.entity.Dept" alias="Dept"></typeAlias>
<typeAlias type="com.igeek.entity.Emp" alias="Emp"></typeAlias>-->
<!--統一定義類名-->
<package name="com.igeek.entity"></package>
</typeAliases>
<!--所有的數據源
default指定默認的數據源 填入數據源的ID
-->
<environments default="mysqlDataSource">
<!--單個數據源-->
<environment id="mysqlDataSource">
<!--事務類型 -->
<transactionManager type="JDBC"></transactionManager>
<!--數據連接池-->
<dataSource type="POOLED">
<!--數據源的4個配置 驅動,地址,用戶名,密碼-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 註冊dao層 -->
<mappers>
<!--掃描dao層-->
<package name="com.igeek.dao"></package>
</mappers>
</configuration>
高級使用
實體類映射
resultMap
-
配置resultMap
a.id代表當前表的ID(不是必須的)
b.result指定 column代表表的列字段 property代表需要映射的java的屬性 -
應用resultMap
指定查詢的結果集的resultMap屬性,匹配resultMap的ID -
resultMap如果表中的列名和java中的字段名是同名,支持直接映射,可以不寫映射,如果不一樣一定要寫映射
-
resultMap一旦使用了就可以不用resultType
一對多和多對一(二次查詢,連表映射)
-
不帶外鍵查詢
1.改造javabean,將外鍵字段改造成實體對象
2.映射集如果bean中是實體對象的話,可以採用 對象.屬性 的方式映射到對象內部 -
多對一 使用 association 二次映射
1.改造javabean,將外鍵字段改造成實體對象
2.使用標籤association 標籤一定要放在result的後面 collection的前面
3.property 代表javabean中的 複合Bean的名稱 column代表二次查詢的條件 select代表二次查詢語句(全路徑) javaType 二次查詢返回的結果類型
4.二次查詢參數一定要統一,類型一定要匹配(只能要覆蓋就可以) -
一對多 一方查詢多條記錄 使用collection
1.改造bean,在bean中增加多條記錄的字段 一定是List
2.collection 放在最後面(association的後面)
3.property 代表javabean中的 List集合的名稱 column代表二次查詢的條件(無外鍵,一般都是當前表的主鍵) select代表二次查詢語句(全路徑) ofType 二次查詢返回的List中的泛型 -
注意點
1.避免遞歸出現 儘量不要使用association 自身查詢別的對象可以使用
2.不能濫用association和collection,會降低查詢效率 根據實際情況自己選擇(association,left join)
CURD注意點
- DML沒有返回值 void 不需要配置resultMap或者resultType
- 多參數 當參數類型無法確定的時候 統一使用map 參數匹配使用 @Param(“匹配參數的key”)
- 設置自動提交事務爲true sessionFactory.openSession(true)
- 參數是複雜類型,要保證匹配類型中的字段的get set方法
- mybatis不支持複雜加簡單
- 當數據庫有自增主鍵,insert 可以通過設置 useGeneratedKeys=“true” keyProperty=“接收自增主鍵的名稱” 回填自增主鍵
- mybatis在insert update 的時候如果你插入null值有可能會出現錯誤 要使用jdbcType指定數據庫類型
示例
IEmpDao.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.dao.IEmpDao">
<!--mybatis的映射集-->
<resultMap id="empIDMap" type="Emp">
<result column="HIREDATE" property="hie"></result>
<!--不帶二次查詢映射實體關係 -->
<result column="MGR" property="mgr.empno"></result>
<result column="DEPTNO" property="dept.deptno"></result>
</resultMap>
<resultMap id="empFKMap" type="Emp">
<result column="HIREDATE" property="hie"></result>
<!--映射二次查詢 (映射實體bean) 多對一關係 -->
<association property="dept" column="deptno"
select="com.dao.IDeptDao.findByID" javaType="Dept">
</association>
<association property="mgr" column="mgr"
select="com.dao.IEmpDao.findByID" javaType="Emp">
</association>
</resultMap>
<!--指定我的sql語句
id 代碼接口中方法名
resultType 返回值的類型(泛型)
parameterType 參數類型
-->
<select id="findAllEmp" resultType="Emp">
select * from emp
</select>
<select id="findByID" parameterType="int" resultMap="empIDMap">
SELECT * FROM emp where EMPNO = #{empno}
</select>
<select id="findByFK" parameterType="int" resultMap="empFKMap">
SELECT * FROM emp where EMPNO = #{empno}
</select>
<select id="findEmpByDept" parameterType="int" resultMap="empIDMap">
SELECT * FROM emp where DEPTNO = #{deptno}
</select>
</mapper>
IDeptDao.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.dao.IDeptDao">
<resultMap id="deptFKMap" type="Dept">
<collection property="emps" column="deptno"
select="com.dao.IEmpDao.findEmpByDept" ofType="Emp"></collection>
</resultMap>
<resultMap id="deptIDMap" type="Dept">
</resultMap>
<select id="findAllDept" resultType="Dept">
select * from dept
</select>
<select id="findByID" parameterType="int" resultMap="deptFKMap">
select * from dept where DEPTNO = #{deptno}
</select>
<insert id="insert" parameterType="map">
insert into dept (DEPTNO, DNAME, LOC)values (#{deptno,jdbcType=INTEGER},#{dname,jdbcType=VARCHAR},#{loc,jdbcType=VARCHAR})
</insert>
<insert id="insertDept" parameterType="Dept">
insert into dept (DEPTNO, DNAME, LOC)values (#{deptno,jdbcType=INTEGER},#{dname,jdbcType=VARCHAR},#{loc,jdbcType=VARCHAR})
</insert>
</mapper>
IStudentDao.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.dao.IStudentDao">
<insert id="insert" parameterType="com.igeek.entity.Student" useGeneratedKeys="true" keyProperty="id">
INSERT INTO student (name, age)VALUES(#{name},#{age})
</insert>
</mapper>