MyBatis高级映射查询(3)
一、数据库数据和项目搭建过程
1、主要要四张表,分别为user用户信息表、items商品表、orderdetail订单明细表、orders订单表。表的结构和数据如下:
表结构
- CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
- CREATE TABLE `items` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `name` VARCHAR(32) NOT NULL COMMENT '商品名称',
- `price` FLOAT(10,1) NOT NULL COMMENT '商品定价',
- `detail` TEXT COMMENT '商品描述',
- `pic` VARCHAR(64) DEFAULT NULL COMMENT '商品图片',
- `createtime` DATETIME NOT NULL COMMENT '生产日期',
- PRIMARY KEY (`id`)
- ) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- CREATE TABLE `orderdetail` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `orders_id` INT(11) NOT NULL COMMENT '订单id',
- `items_id` INT(11) NOT NULL COMMENT '商品id',
- `items_num` INT(11) DEFAULT NULL COMMENT '商品购买数量',
- PRIMARY KEY (`id`),
- KEY `FK_orderdetail_1` (`orders_id`),
- KEY `FK_orderdetail_2` (`items_id`),
- CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
- CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- CREATE TABLE `orders` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `user_id` INT(11) NOT NULL COMMENT '下单用户id',
- `number` VARCHAR(32) NOT NULL COMMENT '订单号',
- `createtime` DATETIME NOT NULL COMMENT '创建订单时间',
- `note` VARCHAR(100) DEFAULT NULL COMMENT '备注',
- PRIMARY KEY (`id`),
- KEY `FK_orders_1` (`user_id`),
- CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
- CREATE TABLE `user` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
- `birthday` DATE DEFAULT NULL COMMENT '生日',
- `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
- `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
- PRIMARY KEY (`id`)
- ) ENGINE=INNODB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
表数据
- INSERT INTO `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) VALUES (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2015-02-06 13:23:02');
- INSERT INTO `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) VALUES (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);
- INSERT INTO `orders`(`id`,`user_id`,`number`,`createtime`,`note`) VALUES (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);
- INSERT INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);
2、整个项目的目录结构
3、首先创建mybatis配置文件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">
- <configuration>
- <!-- 加载属性文件 -->
- <properties resource="db.properties">
- </properties>
- <!-- 和spring整合后 environments配置将废除-->
- <environments default="development">
- <environment id="development">
- <!-- 使用jdbc事务管理,事务控制由mybatis-->
- <transactionManager type="JDBC" />
- <!-- 数据库连接池,由mybatis管理-->
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="sqlmap/Orders.xml" />
- </mappers>
- </configuration>
4、创建数据库配置文件db.properties
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
- jdbc.username=root
- jdbc.password=123
5、创建映射文件orders.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">
- <mapper namespace="com.zhang.dao.OrdersDao">
- <select id="findOrdersUser" resultType="com.zhang.domain.OrdersCustom">
- SELECT orders.*, USER.username,USER.sex,USER.address FROM orders,USER WHERE
- orders.user_id = user.id
- </select>
- <resultMap type="com.zhang.domain.Orders" id="OrdersUserResultMap">
- <id column="id" property="id"/>
- <result column="user_id" property="userId"/>
- <result column="number" property="number"/>
- <result column="createtime" property="createtime"/>
- <result column="note" property="note"/>
- <association property="user" javaType="com.zhang.domain.User">
- <id column="user_id" property="id"/>
- <result column="username" property="username"/>
- <result column="sex" property="sex"/>
- <result column="address" property="address"/>
- </association>
- </resultMap>
- <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
- SELECT orders.*, USER.username,USER.sex,USER.address FROM orders,USER WHERE
- orders.user_id = user.id
- </select>
- <resultMap type="com.zhang.domain.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap" >
- <collection property="orderdetails" ofType="com.zhang.domain.Orderdetail">
- <id column="orderdetail_id" property="id"/>
- <result column="items_id" property="itemsId"/>
- <result column="items_num" property="itemsNum"/>
- <result column="orders_id" property="ordersId"/>
- </collection>
- </resultMap>
- <!-- 查询订单关联查询用户及订单明细,使用resultmap -->
- <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
- SELECT
- orders.*,
- USER.username,
- USER.sex,
- USER.address,
- orderdetail.id orderdetail_id,
- orderdetail.items_id,
- orderdetail.items_num,
- orderdetail.orders_id
- FROM
- orders,
- USER,
- orderdetail
- WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
- </select>
- <!-- 查询用户及购买的商品 -->
- <resultMap type="com.zhang.domain.User" id="UserAndItemsResultMap">
- <!-- 用户信息 -->
- <id column="user_id" property="id"/>
- <result column="username" property="username"/>
- <result column="sex" property="sex"/>
- <result column="address" property="address"/>
- <!-- 订单信息一个用户对应多个订单,使用collection映射-->
- <collection property="ordersList" ofType="com.zhang.domain.Orders">
- <id column="id" property="id"/>
- <result column="user_id" property="userId"/>
- <result column="number" property="number"/>
- <result column="createtime" property="createtime"/>
- <result column="note" property="note"/>
- <!-- 订单明细 一个订单包括 多个明细-->
- <collection property="orderdetails" ofType="com.zhang.domain.Orderdetail">
- <id column="orderdetail_id" property="id"/>
- <result column="items_id" property="itemsId"/>
- <result column="items_num" property="itemsNum"/>
- <result column="orders_id" property="ordersId"/>
- <!-- 商品信息一个订单明细对应一个商品-->
- <association property="items" javaType="com.zhang.domain.Items">
- <id column="items_id" property="id"/>
- <result column="items_name" property="name"/>
- <result column="items_detail" property="detail"/>
- <result column="items_price" property="price"/>
- </association>
- </collection>
- </collection>
- </resultMap>
- <!-- 查询用户及购买的商品信息,使用resultmap -->
- <select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
- SELECT
- orders.*,
- USER.username,
- USER.sex,
- USER.address,
- orderdetail.id orderdetail_id,
- orderdetail.items_id,
- orderdetail.items_num,
- orderdetail.orders_id,
- items.name items_name,
- items.detail items_detail,
- items.price items_price
- FROM
- orders,
- USER,
- orderdetail,
- items
- WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
- </select>
- </mapper>
6、创建接口类OrderDao.java
- package com.zhang.dao;
- import java.util.List;
- import com.zhang.domain.Orders;
- import com.zhang.domain.OrdersCustom;
- import com.zhang.domain.User;
- public interface OrdersDao {
- //查询订单关联查询用户信息
- public List<OrdersCustom> findOrdersUser()throws Exception;
- //查询订单关联查询用户使用resultMap
- public List<Orders> findOrdersUserResultMap()throws Exception;
- //查询订单(关联用户)及订单明细
- public List<Orders> findOrdersAndOrderDetailResultMap()throws Exception;
- //查询用户购买商品信息
- public List<User> findUserAndItemsResultMap()throws Exception;
- //查询订单关联查询用户,用户信息是延迟加载
- public List<Orders> findOrdersUserLazyLoading()throws Exception;
- }
7、创建各种实体类user、orders、items、ordersdetail类
user类
- package com.zhang.domain;
- import java.io.Serializable;
- import java.util.Date;
- import java.util.List;
- public class User implements Serializable {
- //属性名和数据库表的字段对应
- private int id;
- private String username;// 用户姓名
- private String sex;// 性别
- private Date birthday;// 生日
- private String address;// 地址
- //用户创建的订单列表
- private List<Orders> ordersList;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", username=" + username + ", sex=" + sex
- + ", birthday=" + birthday + ", address=" + address + "]";
- }
- public List<Orders> getOrdersList() {
- return ordersList;
- }
- public void setOrdersList(List<Orders> ordersList) {
- this.ordersList = ordersList;
- }
- }
orders类
- package com.zhang.domain;
- import java.util.Date;
- import java.util.List;
- public class Orders {
- private Integer id;
- private Integer userId;
- private String number;
- private Date createtime;
- private String note;
- //用户信息
- private User user;
- //订单明细
- private List<Orderdetail> orderdetails;
- 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 getNumber() {
- return number;
- }
- public void setNumber(String number) {
- this.number = number == null ? null : number.trim();
- }
- public Date getCreatetime() {
- return createtime;
- }
- public void setCreatetime(Date createtime) {
- this.createtime = createtime;
- }
- public String getNote() {
- return note;
- }
- public void setNote(String note) {
- this.note = note == null ? null : note.trim();
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public List<Orderdetail> getOrderdetails() {
- return orderdetails;
- }
- public void setOrderdetails(List<Orderdetail> orderdetails) {
- this.orderdetails = orderdetails;
- }
- }
l
items类
- package com.zhang.domain;
- import java.util.Date;
- public class Items {
- private Integer id;
- private String name;
- private Float price;
- private String pic;
- private Date createtime;
- private String detail;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name == null ? null : name.trim();
- }
- public Float getPrice() {
- return price;
- }
- public void setPrice(Float price) {
- this.price = price;
- }
- public String getPic() {
- return pic;
- }
- public void setPic(String pic) {
- this.pic = pic == null ? null : pic.trim();
- }
- public Date getCreatetime() {
- return createtime;
- }
- public void setCreatetime(Date createtime) {
- this.createtime = createtime;
- }
- public String getDetail() {
- return detail;
- }
- public void setDetail(String detail) {
- this.detail = detail == null ? null : detail.trim();
- }
- @Override
- public String toString() {
- return "Items [id=" + id + ", name=" + name + ", price=" + price
- + ", pic=" + pic + ", createtime=" + createtime + ", detail="
- + detail + "]";
- }
- }
orderdetail类
- package com.zhang.domain;
- public class Orderdetail {
- private Integer id;
- private Integer ordersId;
- private Integer itemsId;
- private Integer itemsNum;
- //明细对应的商品信息
- private Items items;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public Integer getOrdersId() {
- return ordersId;
- }
- public void setOrdersId(Integer ordersId) {
- this.ordersId = ordersId;
- }
- public Integer getItemsId() {
- return itemsId;
- }
- public void setItemsId(Integer itemsId) {
- this.itemsId = itemsId;
- }
- public Integer getItemsNum() {
- return itemsNum;
- }
- public void setItemsNum(Integer itemsNum) {
- this.itemsNum = itemsNum;
- }
- public Items getItems() {
- return items;
- }
- public void setItems(Items items) {
- this.items = items;
- }
- @Override
- public String toString() {
- return "Orderdetail [id=" + id + ", ordersId=" + ordersId
- + ", itemsId=" + itemsId + ", itemsNum=" + itemsNum + "]";
- }
- }
8、创建测试类TestMy.java
- package com.zhang.test;
- import java.io.InputStream;
- import java.util.List;
- 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 com.zhang.dao.OrdersDao;
- import com.zhang.domain.Orders;
- import com.zhang.domain.OrdersCustom;
- import com.zhang.domain.User;
- public class TestMy {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在执行testFindUserById之前执行
- @Before
- public void setUp() throws Exception {
- // 创建sqlSessionFactory
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂,传入mybatis的配置文件信息
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- }
- //一对一查询利用resultType
- @Test
- public void findOrdersUser() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
- List<OrdersCustom> list=ordersDao.findOrdersUser();
- System.out.println(list.size());
- }
- //一对一查询利用resultMap
- @Test
- public void findOrdersUserResultMap() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
- List<Orders> list=ordersDao.findOrdersUserResultMap();
- System.out.println(list.size());
- }
- //一对多查询
- @Test
- public void findOrdersAndOrderDetailResultMap() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
- List<Orders> list=ordersDao.findOrdersAndOrderDetailResultMap();
- System.out.println(list.size());
- }
- //多对多查询
- @Test
- public void findUserAndItemsResultMap() throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
- List<User> list=ordersDao.findUserAndItemsResultMap();
- System.out.println(list.size());
- }
- }
二、一对一高级查询
- package com.zhang.domain;
- //通过此类映射订单和用户查询的结果,让此类继承包括 字段较多的pojo类
- public class OrdersCustom extends Orders{
- //添加用户属性
- private String username;
- private String sex;
- private String address;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
3、编写findOrdersUser接口
4、在Orders.xml文件定义SQL映射关系
5、测试方法:
6、利用resultMap映射查询,在Orders类中添加User属性:
7、编写接口方法
8、在Orders.xml中添加ResultMap信息:
9、测试方法:
三、一对多查询

3、编写接口方法
4、在order.xml编写resultMap,继承上面的resultMap
5、测试方法
四、多对多查询
3、在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials
4、在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items
5、编写接口方法
6、测试方法
五、知识点总结
1、resultMap与resultType:
资源下载链接:http://download.csdn.net/detail/u013865056/9907226
MyBatis高级映射查询(3)的更多相关文章
- mybatis 高级映射和spring整合之查询缓存(5)
mybatis 高级映射和spring整合之查询缓存(5) 2.0 查询缓存 2.0.1 什么是查询缓存 mybatis提供缓存,用于减轻数据压力,提高数据库性能. mybatis提供一级缓存和二级缓 ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- mybatis高级映射(一对一,一对多)
mybatis高级映射 一对一关联映射 需求:查询订单信息,关联查询用户信息(一个订单对应一个用户) (1)通过resultType实现 sql语句: select orders.* , USER.u ...
- mybatis 高级映射和spring整合之逆向工程(7)
mybatis 高级映射和spring整合之逆向工程(7) 4.0 逆向工程 4.1 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行 ...
- mybatis 高级映射和spring整合之与Spring整合(6)
mybatis 高级映射和spring整合之mybatis与Spring整合 3.0 mybatis和spring整合(掌握) 3.1 整合思路 需求spring通过单例方式管理SqlSessionF ...
- mybatis 高级映射和spring整合之高级映射(4)
mybatis 高级映射和spring整合之高级映射 ----------------学习结构-------------------- 0.0 对订单商品数据模型进行分析 1.0 高级映射 1.1 一 ...
- (转)Mybatis高级映射、动态SQL及获得自增主键
原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...
- 六 mybatis高级映射(一对一,一对多,多对多)
1 订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习.
- Mybatis高级映射、动态SQL及获得自增主键
一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...
随机推荐
- JAVA_Package
Javaの名前空間の仕組みの1つにパッケージがあります.大規模開発では必須の概念です.また.他人の作ったコードの再利用という観点でも.パッケージを正しく活用する必要があります. ・完全修飾名:パッケー ...
- linux 时间相关的一些总结
仅作为内核代码中时间管理模块的笔记,3.10内核,很乱,不喜勿喷. 先有time,后有timer. 常用的time结构有哪些?除了大名鼎鼎的jiffies和jiffies64之外,还有常用的一些结构如 ...
- DO and DOES Reduction
DO and DOES Reduction Share Tweet Share Tagged With: DO and DOES Reductions ‘Do’ and ‘does’ can be r ...
- vue启动时报错,node-modules下xxx缺失
从qq上拷贝了一个项目,解压后打开进vscode,安装依赖与scss后启动,显示node-modules下xxx指向缺失(想不起来是哪个缺失了),在网上找了很多解决办法,包括重新安装node 与 np ...
- TCP工作过程;TCP Flood的攻击的原理和现象;TCP协议设计的安全隐患与防范对策
TCP分三个阶段 连接建立(三次握手) 数据传输 连接释放(四次挥手) TCP工作过程 TCP连接建立阶段 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给S ...
- KVM虚拟化技术(四)安装虚拟机
一.首先用比较简单的virt-manager来安装 # virt-manager 后面就是一般的安装系统流程了,这里不再复述 二.用virt-install命令行来安装 还是通过本地IOS文件来进行安 ...
- js数组对象--数据格式的转换(字符串,对象的取值与赋值)
材料:提供一份数据:arr=[ {value:335, name:'直接访问'}, {value:310, name:'邮件营销'}, {value:234, name:'联盟广告'}, {value ...
- unity 数学公式
Mathf.Abs绝对值 计算并返回指定参数 f 绝对值. Mathf.Acos反余弦 static function Acos (f : float) : float 以弧度为单位计算并返回参数 f ...
- java 导包
在maven 中搜索相关模块依赖 http://mvnrepository.com/artifact/org.apache.spark/spark-mllib_2.10/1.0.0 dependenc ...
- 关于git经常忘记的:远程仓库关联。
我们有时习惯建立好工程后再传到git上,这是时候就忘记咋弄啦, 其实,只要配置远程仓库就行: git remote add +url...具体看网上哦,这里提醒下 Git clone远程分支 Git ...