关于mybatis中mapper文件resultMap中collection和association的使用
mybatis mapper配置文件结果集映射resultMap中collection属性(一对多关系结果集映射)和association属性(多对一关系结果集映射)理解:
collection的使用有两种resultMap和select,必须手动指定一种
association的使用和collection使用类似,只是right join需换成left join
1. 实体类:
1 package com.mrlu.mybatis.domain;2 3 import java.util.List;4 5 /**6 * Created by stefan on 15-12-31.7 */8 public class User {9 private Integer id; 10 private String name; 11 private List<Account> accounts; //user (1)-->(*) account 12 13 public Integer getId() { 14 return id; 15 } 16 17 public void setId(Integer id) { 18 this.id = id; 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 @Override 30 public String toString() { 31 return "User{" + 32 "id=" + id + 33 ", name='" + name + '\'' + 34 ", accounts=" + accounts + 35 '}'; 36 } 37 38 public List<Account> getAccounts() { 39 return accounts; 40 } 41 42 public void setAccounts(List<Account> accounts) { 43 this.accounts = accounts; 44 } 45 46 }
package com.mrlu.mybatis.domain;/*** Created by stefan on 15-12-31.*/ public class Account {private Integer id;private Integer userId;private String num;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}@Overridepublic String toString() {return "Account{" +"id=" + id +", userId=" + userId +", num='" + num + '\'' +'}';} }
2. DAO:
package com.mrlu.mybatis.dao;import com.mrlu.mybatis.domain.User;import java.util.List;/*** Created by stefan on 15-12-31.*/ public interface UserDao {public void insert(User user);public List<User> selectAll(); }
package com.mrlu.mybatis.dao;import com.mrlu.mybatis.domain.Account;/*** Created by stefan on 15-12-31.*/ public interface AccountDao {public void insert(Account account); }
3. mapper.xml
AccountDao:
<?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.mrlu.mybatis.dao.AccountDao" ><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO account(user_id, num) VALUES(#{userId}, #{num})</insert> </mapper>
UserDao: (collection中标出的属性字段都是必须的,没标出的都是可选的)
resultMap:(若有同名属性,需指定不同的名称)
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >3 <mapper namespace="com.mrlu.mybatis.dao.UserDao" >4 <resultMap id="BaseResultMap" type="com.mrlu.mybatis.domain.User">5 <result column="tid" property="id" />6 <result column="name" property="name" />7 <collection property="accounts" resultMap="accountMap" />8 </resultMap>9 <resultMap id="accountMap" type="com.mrlu.mybatis.domain.Account"> 10 <result column="aid" property="id" /> 11 <result column="user_id" property="userId" /> 12 <result column="num" property="num" /> 13 </resultMap> 14 <insert id="insert" keyProperty="id" useGeneratedKeys="true"> 15 INSERT INTO user(name) VALUES( 16 #{name} 17 ) 18 </insert> 19 20 <select id="selectAll" resultMap="BaseResultMap"> 21 SELECT t.id as tid, t.name as name, a.id as aid,a.user_id,a.num FROM user t 22 RIGHT JOIN account a ON t.id=a.user_id 23 </select> 24 </mapper>
select:(select查询的结果需要和java bean属性名称相同)
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >3 <mapper namespace="com.mrlu.mybatis.dao.UserDao" >4 <resultMap id="BaseResultMap" type="com.mrlu.mybatis.domain.User">5 <result column="id" property="id" />6 <result column="name" property="name" />7 <collection property="accounts" column="id" select="selectAccount" />8 </resultMap>9 <insert id="insert" keyProperty="id" useGeneratedKeys="true"> 10 INSERT INTO user(name) VALUES( 11 #{name} 12 ) 13 </insert> 14 15 <select id="selectAll" resultMap="BaseResultMap"> 16 SELECT * FROM user t 17 </select> 18 19 <select id="selectAccount" resultType="com.mrlu.mybatis.domain.Account"> 20 SELECT id as id, user_id as userId, num as num FROM account 21 WHERE user_id = #{id} 22 </select> 23 </mapper>
4. mybatis-config.xml
1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">3 <configuration>4 <!--5 properties属性只能有一个,有三种方式指定:(源码: XMLConfigBuilder.#propertiesElement())6 1. 通过resource引入外部配置文件(优先级最高)7 2. 通过url指定网络文件(次之)8 3. 通过property来内部指定(优先级最低)9 --> 10 <properties resource="jdbc.properties" > 11 <property name="jdbc.url" value="jdbc:mysql://127.0.0.1:3306/user" /> 12 </properties> 13 <settings> 14 <setting name="cacheEnabled" value="false"/> 15 </settings> 16 <environments default="development"> 17 <environment id="development"> 18 <transactionManager type="JDBC"></transactionManager> 19 <dataSource type="POOLED"> 20 <property name="driver" value="${jdbc.driver}" /> 21 <property name="url" value="${jdbc.url}" /> 22 <property name="username" value="${jdbc.username}" /> 23 <property name="password" value="${jdbc.password}" /> 24 </dataSource> 25 </environment> 26 </environments> 27 28 <mappers> 29 <mapper resource="com/mrlu/mybatis/dao/UserDao-select.xml" /> 30 <mapper class="com.mrlu.mybatis.dao.AccountDao" /> 31 </mappers> 32 </configuration>
5. 测试代码
1 public class Main {2 public static SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();3 4 public static void main(String[] args){5 String resource = "mybatis-config.xml";6 try {7 Reader reader = Resources.getResourceAsReader(resource);8 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);9 SqlSession sqlSession = sqlSessionFactory.openSession(); 10 UserDao userDao = sqlSession.getMapper(UserDao.class); 11 AccountDao accountDao = sqlSession.getMapper(AccountDao.class); 12 13 User user = new User(); 14 user.setId(2); 15 user.setName("z3"); 16 userDao.insert(user); 17 18 for (int i = 0; i < 3; i++) { 19 Account account = new Account(); 20 account.setUserId(user.getId()); 21 account.setNum("123"); 22 accountDao.insert(account); 23 } 24 25 List<User> re = userDao.selectAll(); 26 System.out.println("result...."); 27 for(User user1: re){ 28 System.out.println(user1); 29 } 30 31 sqlSession.commit(); //这句很重要,因为SqlSessionFactory#openSession()方法默认设置的autoCommit为false,即不自动提交,所以如果不手动调用,则插入不成功 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 } 36 }
6. association(多对一结果集转换)的示例:
1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >3 <mapper namespace="com.mrlu.mybatis.dao.AccountDao" >4 <resultMap id="BaseResultMap" type="com.mrlu.mybatis.domain.Account">5 <result column="aid" property="id" />6 <result column="user_id" property="userId" />7 <result column="num" property="num" />8 <association property="user" resultMap="userMap" />9 </resultMap> 10 <resultMap id="userMap" type="com.mrlu.mybatis.domain.User"> 11 <result column="tid" property="id" /> 12 <result column="name" property="name" /> 13 </resultMap> 14 15 <insert id="insert" useGeneratedKeys="true" keyProperty="id"> 16 INSERT INTO account(user_id, num) VALUES( 17 #{userId}, #{num} 18 ) 19 </insert> 20 21 <select id="selectAll" resultMap="BaseResultMap"> 22 SELECT a.id as aid, t.id as tid, a.user_id as user_id, num as num, t.name as name FROM account a 23 LEFT JOIN user t on a.user_id = t.id 24 </select> 25 </mapper>
关于mybatis中mapper文件resultMap中collection和association的使用相关推荐
- 【Mybatis】Mapper文件中sql不等于的写法
[Mybatis]Mapper文件中sql不等于的写法 认识误区:在xml文件中,是 不能直接使用 < .>.& 的.因为会被语法检查而报错. 正确使用的两种方法 1. 第一种:转 ...
- Mybatis的mapper文件中涉及大于号小于号等特殊符号使用
什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBati ...
- python中按照文件夹中文件的排列顺序读取文件内容,python文件显示和windows目录显示一致
原创 python中按照文件夹中文件的排列顺序读取文件内容 2018-12-06 11:49:18 途径北海道 阅读数 3891 更多 分类专栏: python 版权声明:本文为博主原创文章,遵循 C ...
- python中读取文件过程中seek()函数的使用
python中读取文件过程中seek()函数的使用 目录 概述: 语法: 参数: 返回值: 实例: 概述: seek() 方法用于移动文件读取指针到指定位置. 语法: seek() 方法语法如下: 文 ...
- Goland中在文件模板中为go文件添加个人声明
Goland中在文件模板中为go文件添加个人声明 打开文件模板菜单 修改内容如下: 效果演示 打开文件模板菜单 从goland左上角依次点击: [File] – [Settings] – [Edito ...
- Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
1. Mybatis工作流程 1.1 使用MySQL创建数据库girls并生成一个表boys,如下图. 1.2 创建该表对应的简单实体类Boys,如下图. 1.3 创建Dao接口以及和接口同名的map ...
- mybatis的Mapper文件中的大于小于号,为什么要转成“lt ;”、“gt ;”,转义后的lt、gt又代表什么?
为什么的Mapper文件中的"<".">" 要转成"< ;"."> ;" 问题分析 ...
- 【转】淮左白衣-解决maven管理SSM中mybatis的mapper文件扫描失败的问题
本文链接: https://blog.csdn.net/youngyouth/article/details/86468910 好久没有写博客了,11月底来到公司实习,上个月写个小demo,趁此回顾下 ...
- mybatis的Mapper文件配置
一.resultMap resultMap 元素是 MyBatis 中最重要最强大的元素. 该配置节点下如下子节点配置 id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能 const ...
最新文章
- 约瑟夫环之循环链表实现
- 如何使用logminer查看日志内容
- 2020最详细安装Ubuntu指南
- 【目标检测_概述】recent advances in deep learning for object detection_2019
- docker的安装与安装mysql(mac,centos为例)
- 文本删除空行_010 Editor for mac(文本和十六进制编辑器)
- 【转】Visual Studio 2005/2008中的快捷键与小技巧整理
- 解读:滴滴“猜你去哪儿”功能的算法实现
- 引领移动协同需求Cnskype结合微信企业号推出企业办公、通讯整合方案
- kron matlab_使用kron来实现repmat, repelem的功能
- oracle sql的优化方法
- CloseHandle(),TerminateThread(),ExitThread()的区别
- 各个版本的金蝶kis的区别
- DNS 解析器(DNS Resolver)
- 识别IOS和android方法
- mysql 备份 发送邮件_mysql 自动备份发邮件 到指定邮箱
- GNU/Linux与Windows魔兽争霸3局域网对战安装与配置
- ESP32程序调试 win10 使用OPENOCD及GDB工具
- ExecuteNonQuery(),ExecuteDataSet() ,ExecuteReader() ,ExecuteScalar(),DataTable() 用法
- 图书信息管理系统(数据结构顺序表,c语言版)
热门文章
- JavaScript笔记8-DOM中的事件、获取元素、操作元素
- Matlab图像处理基础(1):图像表示,点处理
- 我的三个月实习——PB运维(2)
- plc的毕业设计冷门题目_PLC毕业设计题目
- Go语言十周年 | Go精华资料整理
- PDF文档工具:pdfFactory快照功能详解
- 我,北漂5年程序员,终于在帝都全款买房
- 安装了微信支付的安全控件,检测不到,总提示安装-解决方案
- 唐诗宋词 v3.0 软件下载 唐诗宋词三百首 唐诗三百首 宋词三百首 唐诗三百首下载 宋词三百首下载 SQL优化前后的代码:...
- vscode php中文乱码,vscode打开乱码怎么办