Mybatis中resultMap標簽和sql標簽的設置方式
resultMap標簽和sql標簽的設置
1、項目目錄
2、數據庫中的表的信息
3、配置文件的信息
1、SqlMapConfig.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"> <!--mybatis主配置文件--> <configuration> <!--配置環境--> <environments default="mysql"> <!-- 配置mysql環境--> <environment id="mysql"> <!-- 配置事務類型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置數據源(連接池)--> <dataSource type="POOLED"> <!-- 配置數據庫的基本信息--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT"/> <property name="username" value="root"/> <property name="password" value="111111"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每一個dao獨立的配置文件--> <mappers> <mapper resource="com/mybatis/dao/IUserDao.xml"/> </mappers> </configuration>
2、IUserDao.xml
其中的mapper標簽中的namespace屬性指的就是持久層中的接口,這裡的sql語句都是對應這個接口中的方法,也就是指定瞭命名空間。
在這裡resultMap標簽是查詢結果的列名和實體類的屬性名的對應關系,也就是說我們類中的屬性名不一定和數據庫中的保持一致,其中property配置的就是類中的屬性名,column設置的就是數據庫中表的字段名。
在sql語句的標簽中之前的,resultType變成瞭resultMap。sql標簽中直接寫的是就是sql語句,這個可以有效的避免重復的寫sql相同代碼,如果要引用sql標簽中內容,在對應的語句中需要引用Include標簽,具體的可以看下面的代碼。
<?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"> <mapper namespace="com.mybatis.dao.IUserDao"> <!-- 配置,查詢結果的列名和實體類的屬性名的對應關系--> <resultMap id="userMap" type="com.mybatis.domain.User"> <!-- 主鍵字段對應--> <id property="userId" column="id"></id> <!-- 非主鍵字段對應--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> </resultMap> <sql id="defaultUser"> select * from users </sql> <!-- 查詢所有--> <select id="findAll" resultMap="userMap"> <include refid="defaultUser"></include> </select> <select id="findById" parameterType="INT" resultMap="userMap"> select * from users where id = #{uid} </select> </mapper>
4、User類
package com.mybatis.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer userId; private String userName; private Date userBirthday; private String userSex; private String userAddress; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getUserBirthday() { return userBirthday; } public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userBirthday=" + userBirthday + ", userSex='" + userSex + '\'' + ", userAddress='" + userAddress + '\'' + '}'; } }
5、IUserDao接口
package com.mybatis.dao; import com.mybatis.domain.User; import java.util.List; public interface IUserDao { /** * 查詢所有用戶 * @return */ List<User> findAll(); /** * 根據ID查詢用戶信息 * @param userId * @return */ User findById(Integer userId); }
6、MybatisTest
package com.mybatis.test; import com.mybatis.dao.IUserDao; import com.mybatis.domain.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.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisTest { private InputStream in; private SqlSession session; private IUserDao userDao; @Before public void init() throws Exception { this.in = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder(); System.out.println(in); SqlSessionFactory factory = factoryBuilder.build(in); // this.session = factory.openSession(true); this.session = factory.openSession(); this.userDao = session.getMapper(IUserDao.class); } @After public void destory() throws IOException { session.commit(); this.in.close(); this.session.close(); } @Test public void testFindAll() throws Exception{ List<User> users = userDao.findAll(); for (User user:users){ System.out.println(user); } } }
7、運行結果
resultMap標簽的使用規則
自定義結果映射規則
<!-- resultMap自定義某個javabean的封裝規則 type:自定義規則的java類型 id:唯一id方便引用 --> <resultMap type="entity.Employee" id="getEmpByIdMap"> <!-- id指定主鍵列的封裝規則 column:指定哪一列 property:指定對應的javabean屬性 --> <id column="id" property="id"/> <!-- result定義普通列封裝規則,若屬性名與數據庫對應表的列名相同可不寫, mybatis會自動封裝,但建議將所有的映射規則都寫上 --> <result column="name" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> </resultMap> <!-- public Employee getEmpById(Integer id) --> <select id="getEmpById" resultMap="getEmpByIdMap"> select * from employee where id=#{id} </select>
association聯合查詢
association可以指定聯合的javabean對象
property="dept"
:指定哪個屬性是聯合對象javaType
:指定這個屬性的類型
<resultMap type="entity.Employee" id="getEmpAndDeptMap"> <id column="id" property="id"/> <result column="empName" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> <!-- association可以指定聯合的javabean對象 property="dept":指定哪個屬性是聯合對象 javaType:指定這個屬性的類型--> <association property="dept" javaType="entity.Department"> <id column="did" property="id"/> <result column="deptName" property="departmentName"/> </association> </resultMap> <!-- public Employee getEmpAndDept(Integer id) --> <select id="getEmpAndDept" resultMap="getEmpAndDeptMap"> select e.id id,e.name empName,e.email email,e.sex sex,e.d_id d_id, d.id did,d.name deptName from employee e,dept d where e.d_id=d.id and e.id=#{id} </select>
使用association進行分佈查詢
1、先按照員工id查詢員工信息將會調用查詢員工的sql
2、根據查詢員工信息中的d_id值去部門表中查出部門信息
3、部門設置到員工中
<resultMap type="entity.Employee" id="getEmpAndDeptStepMap"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> <!-- association定義關聯對象的封裝規則 select:表明當前屬性是調用select指定的方法查出的結果 column:指定將那一列的值作為參數傳給這個方法 流程:使用select指定的方法(傳入column指定的這列參數的值)查出對象, 並封裝給property指定的屬性 --> <!-- discriminator鑒別器 column:指定判定的列名 javaType:列值對應的java類型 --> <discriminator javaType="string" column="sex"> <!-- resultType不能缺少 --> <case value="男" resultType="entity.Employee"> <association property="dept" select="dao.DepartmentMapper.getDeptById" column="d_id"> </association> </case> </discriminator> </resultMap> <!-- public Employee getEmpByIdStep(Integer id) --> <select id="getEmpByIdStep" resultMap="getEmpAndDeptStepMap"> select * from employee where id=#{id} </select>
嵌套結果集的方式,使用collection標簽定義關聯的集合類型的屬性封裝規則
<resultMap type="entity.Department" id="getDeptByIdPlusMap"> <id column="did" property="id"/> <result column="deptName" property="departmentName"/> <!-- collection定義關聯集合類型的屬性的封裝規則 ofType:指定集合裡面元素的類型 --> <collection property="emps" ofType="entity.Employee"> <!-- 定義這個集合中元素的封裝規則 --> <id column="eid" property="id"/> <result column="empName" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> </collection> </resultMap> <!-- public Department getDeptByIdPlus(Integer id) --> <select id="getDeptByIdPlus" resultMap="getDeptByIdPlusMap"> select d.id did,d.name deptName,e.id eid, e.name empName,e.sex,e.email from dept d left join employee e on d.id=e.d_id where d.id=#{id} </select>
collection分步查詢
<resultMap type="entity.Department" id="getDeptByIdStepMap"> <id column="id" property="id"/> <result column="name" property="departmentName"/> <collection property="emps" select="dao.EmployeeMapperPlus.getEmpsByDeptId" column="{id}"> <!-- 或則 column="{deptId=id}"--> </collection> </resultMap> <!-- public List<Employee> getEmpsByDeptId(Integer deptId --> <select id="getEmpsByDeptId" resultType="entity.Employee"> select * from employee where d_id=#{deptId} </select> <!-- public Department getDeptByIdStep(Integer id) --> <select id="getDeptByIdStep" resultMap="getDeptByIdStepMap"> select * from dept where id=#{id} </select>
當分佈查詢需要傳遞多個多個值時,將多個值封裝map傳遞
colum=“{key1=column1,key2=colum2...}”
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Mybatis結果集映射與生命周期詳細介紹
- Mybatis一對多查詢列表屬性處理示例詳解
- Mybatis如何實現關聯屬性懶加載
- mybatis mapper互相引用resultMap啟動出錯的解決
- MyBatis延遲加載策略深入探究