本就不能wwWggg62CoM登入qts 进行基本配置了,还可以继续ggg62收视的

【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多
学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一、一对多、多对多,希望多有需要的小伙伴有帮助,小编主要从四个方面进行介绍,订单商品数据模型、一对一查询、一对多查询、多对多查询。
一、订单商品数据模型
1、执行脚本,如下所示:
CREATE TABLE items (
id INT NOT NULL
AUTO_INCREMENT,
itemsname 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)
DEFAULT CHARSET=utf8;
/*Table structure for table `orderdetail` */
CREATE TABLE orderdetail (
id INT NOT NULL AUTO_INCREMENT,
orders_id INT NOT NULL COMMENT '订单id',
items_id INT NOT NULL COMMENT '商品id',
items_num INT
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
DEFAULT CHARSET=utf8;
/*Table structure for table `orders` */
CREATE TABLE orders (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL COMMENT '下单用户id',
number VARCHAR(30) 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 `t_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
DEFAULT CHARSET=utf8;
/*Table structure for table `t_user` */
CREATE TABLE t_user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(32) NOT NULL COMMENT '用户名称',
birthday DATE DEFAULT NULL COMMENT '生日',
sex CHAR(1) DEFAULT NULL COMMENT '性别',
VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
测试数据代码
/*Data for the table `items` */
INTO items(itemsname,price,detail,pic,createtime) VALUES
('台式机',3000.0,'该电脑质量非常好!',NULL,' 13:28:53'),
('笔记本',6000.0,'笔记本性能好,质量好!',NULL,' 13:22:57'),
('背包',200.0,'名牌背包,容量大质量好!',NULL,' 13:25:02');
/*Data for the table `orderdetail` */
INTO `orderdetail`(`orders_id`,`items_id`,`items_num`) VALUES
/*Data for the table `orders` */
INTO `orders`(`user_id`,`number`,`createtime`,`note`) VALUES
(1,';,' 13:22:35',NULL),
(1,';,' 13:22:41',NULL),
(2,';,' 14:13:23',NULL),
(3,';,' 18:13:23',NULL),
(4,';,' 19:13:23',NULL),
(5,';,' 17:13:23',NULL),
(6,';,' 16:13:23',NULL);
/*Data for the table `user` */
INTO `t_user`(`username`,`birthday`,`sex`,`address`) VALUES
('王五',NULL,'2',NULL),
('张三','','1','北京市'),
('张小明',NULL,'1','河南郑州'),
('陈小明',NULL,'1','河南郑州'),
('张三丰',NULL,'1','河南郑州'),
('陈小明',NULL,'1','河南郑州'),
('王五',NULL,NULL,NULL),
('小A','','2','北京'),
('小B','','2','北京'),
('小C','','1','北京'),
('小D','','2','北京');
2、数据模型分析思路
(1).每张表记录的数据内容:分模块对每张表记录的内容进行熟悉,相当于你学习需求(功能)的过程;
(2).每张表重要的字段设置:非空字段、外键字段;
(3).数据库级别表与表之间的关系:外键关系;
(4).表与表之间的业务关系:在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。
3、针对订单商品模型的数据库思路分析,如下图所示:
二、一对一查询
2.1、需求:查询订单信息,关联查询用户信息
2.2、resultType实现
2.2.1sql语句
确定查询的主表:订单表,确定查询的关联表,用户表,代码如下所示:
t2.username,
t2.address
orders t1,
WHERE t1.user_id=t2.id
2.2.2创建entity实体
用户实体User.java,代码如下所示:
package com.mybatis.
import java.util.D
import java.util.L
* @ClassName: User
* @Description: TODO(用户实体)
* @author 阿赫瓦里
public class User {
// 用户创建的订单列表
private List ordersL
// getter and setter ......
订单实体orders.java
package com.mybatis.
import java.util.D
import java.util.L
* @ClassName: Orders
* @Description: TODO(订单实体)
* @author 阿赫瓦里
public class Orders {
/** 主键订单Id */
/** 下单用户id */
/** 订单号 */
/** 创建订单时间 */
private Date createT
/** 备注 */
// 用户信息
// 订单明细
private List
getter and setter ......
商品实体:items.java
package com.mybatis.
import java.util.D
* @ClassName: Items
* @Description: TODO(商品实体类)
* @author 丁国华
public class Items {
/** 商品表主键Id */
/** 商品名称 */
private String itemsN
/** 商品定价 */
/** 商品描述 */
/** 商品图片 */
/** 生产日期 */
private Date createT
// getter and setter ......
订单明细实体orderDetail.java
package com.mybatis.
* @ClassName: OrderDetail
* @Description: TODO(订单明细实体)
* @author 丁国华
public class OrderDetail {
/** 主鍵,訂單明细表Id */
/** 訂單Id */
private Integer ordersId;
/** 商品id */
private Integer itemsId;
/** 商品购买数量 */
private Integer itemsN
// 明细对应的商品信息
getter and setter ......
创建一个包装类,将查询到的信息全部映射到此类OrdersCustom.java
* @ClassName: OrdersCustom
* @Description: TODO(订单的扩展类,通过此类映射订单和用户的查询结果,让此类继承字段较多的实体类)
* @author: 丁国华
public class OrdersCustom extends Orders {
// 添加用户的属性
// getter and setter......
2.2.3创建OrderscCustomMapper.java,代码如下所示:
package com.mybatis.M
import java.util.L
import com.mybatis.entity.OrdersC
* @ClassName: OrdersMapperCustom
* @Description: TODO(OrdersMapperCustom的mapper)
* @author 丁国华
public interface OrdersCustomMapper {
/** 查询订单,关联查询用户信息 */
public List findOrdersUser();
2.2.4创建OrdersCustomMapper.xml和上面对应的接口名称一致,一边通过mapper接口加载配置文件,代码如下所示:
SELECT t1.*,
t2.username,
t2.address
orders t1,
WHERE t1.user_id=t2.id
2.3resultMap实现
2.3.1sql语句同上
2.3.2resultMap映射思路:
使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中(上面orders实体中已经添加)。
2.3.3 ordersCustomMapper.xml
1、定义resultMap,代码如下所示:
2、statement定义,代码如下所示:
SELECT t1.*,
t2.username,
t2.address
orders t1,
WHERE t1.user_id=t2.id
3、OrderCustomMapper.java接口中添加下面的方法:
/** 查询订单关联查询用户信息,使用reslutMap实现*/
public ListfindOrdersUserResultMap();
4、对resultType和resultMap实现的junit测试,代码如下所示:
package com.mybatis.
import java.io.InputS
import java.util.L
import org.apache.ibatis.io.R
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.apache.ibatis.session.SqlSessionFactoryB
import org.junit.B
import org.junit.T
import com.mybatis.entity.O
import com.mybatis.entity.OrdersC
import com.mybatis.mapper.OrdersCustomM
public class OrdersCustomMapperTest {
private SqlSessionFactory sqlSessionF
// 此方法是在执行findUserByIdTest之前执行
public void setUp() throws Exception {
String resource = &SqlMapConfig.xml&;
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFcatory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 查询订单,关联查询用户信息,使用resultType实现的测试
public void TestFindOrdersUser() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
// 调用mapper的方法
List list = oc.findOrdersUser();
System.out.println(list);
sqlSession.close();
// 查询订单,关联查询用户信息,使用resultMap实现的测试
public void TestFindOrdersUserResultMap() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
// 调用mapper的方法
List list = oc.findOrdersUserResultMap();
System.out.println(list);
sqlSession.close();
5、resultType和resultMap实现一对一查询小结
实现一对一查询:
a.resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
b.如果没有查询结果的特殊要求建议使用resultType。
c.resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
d.resultMap可以实现延迟加载,resultType无法实现延迟加载。
三、一对多查询
3.1 需求:查询订单(关联用户)及订单明细;
3.2 在orders.java类中添加ListorderDetails属性(上面实体已添加)。最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
3.3 在ordersCustomMapper.xml中添加如下
t2.username,
t2.address,
t3.id orderdetail_id,
t3.items_id,
t3.items_num,
t3.orders_id
orders t1,
t_user t2,
orderdetail t3
WHERE t1.user_id = t2.id AND t3.orders_id=t1.id
resultMap的定义同样添加到ordersCustomMapper.xml
3.4 在OrderCustomeMapper.java接口类中添加一个方法,代码如下所示:
/**查询订单(关联用户)以及订单明细*/
public ListfindOrdersAndOrderDetailResultMap();
3.5 在Junit测试类中添加测试方法,代码如下所示:
// 查询订单(关联用户)以及订单明细的测试
public void TestFindOrdersAndOrderDetailResultMap() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
// 调用mapper的方法
List list = oc.findOrdersAndOrderDetailResultMap();
System.out.println(list);
sqlSession.close();
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。使用resultType实现:将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。
四、多对多查询
4.1 需求:查询用户以及用户购买的商品信息
4.2 映射思路
将用户信息映射到user中,在user类中添加订单列表属性Listorderslist,将用户创建的订单映射到orderslist;在Orders中添加订单明细列表属性Listorderdetials,将订单的明细映射到orderdetials;在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Item。
4.3 OrdersCustomMapper.xml添加如下代码:
t2.username,
t2.address,
t3.id orderdetail_id,
t3.items_id,
t3.items_num,
t3.orders_id,
t4.itemsname items_name,
t4.detail items_detail,
t4.price items_price
orders t1,
t_user t2,
orderdetail t3,
WHERE t1.user_id =
t3.orders_id=t1.id AND t3.items_id = t4.id
4.4 在OrderCustomMapper.java中添加如下方法:
/** 查询用户及用户所购买的商品信息 */
public List findUserAndItemsResultMap();
4.5 在Junit测试中添加测试方法,代码如下所示:
// 查询用户及用户购买的商品的信息
public void TestFindUserAndItemsResultMap() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
// 调用mapper的方法
List list = oc.findUserAndItemsResultMap();
System.out.println(list);
sqlSession.close();
4.6 resultMap总结
resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
resultMap:
使用:association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
association:
作用:将关联查询信息映射到一个pojo对象中。
场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
collection:
作用:将关联查询信息映射到一个list集合中。
场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
如果使用resultType无法将查询结果映射到list集合中。
小编寄语:该博文小编主要简单的介绍了mybatis中高级映射,在前面的相关博文中,小编对比过hibernate和mybatis,有兴趣的小伙伴可以看看,今天这篇博文,就先介绍到这里,下篇博文,小编将继续介绍mybatis中的相关知识,延迟加载,敬请期待`(*&_&*)&!c语言如何将一个字符串中的数字提取求和..例如:12GDPs5.ghgggh62sfhhh中的12 5 62求和?_百度知道
c语言如何将一个字符串中的数字提取求和..例如:12GDPs5.ghgggh62sfhhh中的12 5 62求和?
我有更好的答案
int main(){
char a[] = {&12GDPs5.ghgggh62sfhhh&i&strlen(a);i++)
for(i = 0;}; && a[i] &='9')
sum+=a[i];
int i#include&stdio.h&
printf(&#include&
int sum = 0;string.h&n&;='总和为%d\0&#39
采纳率:49%
来自团队:
iostream&void main() { char str[]=&12GDPs5.ghgggh62sfhhh&9'%d\n&
printf(&stdio【程序】include&#include& && str[k]&lt!=0 )
{ if ( str[k]&='0' && str[k]&='9' )
{ s+=atoi(str+k);;
while ( str[k]; ) k++; }
else k++!=0 && str[k]&='string.h&='0'
getch().h&#include &,s); while ( str[k]
#include&&stdio.h&int&main(){&&&&char&str[]=&12GDPs5.ghgggh62sfhhh&;&&&&char&*p=&&&&int&n=0,s=0;&&&&do&&&&{&&&&&&&&if(*p&'0'&||&*p&'9')&&&&&&&&{&&&&&&&&&&&&s+=n;&&&&&&&&&&&&n=0;&&&&&&&&}&&&&&&&&else&&&&&&&&&&&&n=n*10+*p-'0';&&&&}while(*p++!='\0');&&&&printf(&%d&,s);}
问题很简单,但为了你好不能告诉你,你自己要多动脑,你自己能把代码写出来对东西的理解才更深刻,二楼的代码我看了,你那样只是对ASCII码求和并不是数字求和,在if语句下加上一句a[i]-=48;就可以了,这样计算出的就是数字的和
挨个遍历。不过你没说数字连在一起是当做多个数字 还是多个单个数字处理
是这样的结果吗?将连续的数看成是一组数字,将每组数字相加
其他3条回答
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 登入qts 进行基本配置 的文章

 

随机推荐