mysql 一对多映射_mybatis入门_一对多,多对多映射以及整合spring框架

一.一对多映射.

1.1 一对多映射之根据多的一方关联查询一的一方

示例:查询出具体的订单信息,同时也查询出来订单的用户信息.

引入的订单表如下所示:

f0d97ed108f76da5b3d56803261b7884.png

框选出来的为具体的外键.

订单的Pojo类如下所示:

bc20fc847be7b0275c15e6c545b8d504.png

创建OrdersMapper接口.

f46a0739c355c3ad5b54cedb5a66753a.png

书写ordersMapper.xml.先书写SQL语句:

SELECT o.id,o.user_id,o.number,u.username,u.sex

FROM ORDERS o,

USER u WHERE o.user_id=u.id;

我们发现,由于查询出来的一些column无法映射到对应的属性里面去.因此我们采用resultMap的形式.

查询出来的u.username,u.sex这些属性无法直接赋值到column对应的属性中去.因此,采用标签去赋值.的属性标识了关联对象的id.属性标识了关联对象的其他属性.具体做

法参见注释.

Mapper的配置如下:

SELECT o.id,o.user_id,o.number,u.username,u.sex

FROM ORDERS o,

USER u WHERE o.user_id=u.id;

测试:

e70c36e0a08fcafea8b51b3c25c0cddb.png

1.2 一对多映射之根据一的一方关联查询多的一方

订单明细是指在商城中下单的时候,可能会购买不同的物品,一个物品可能购买不止一个,那么一个物品项对应的就是一个订单明细

订单类和订单明细类,对应一对多.一个订单可以有不止一个订单明细,而一个订单明细必然属于一个订单.

引入订单明细的表:

42aa72d2f427e2b3b6d2fa1ed0c2f068.png

引入订单明细的Pojo类:

650649c1bca5d3068db00b3fdc9e7d30.png

需求分析:

查询所有的订单,同时关联查询出所有的订单明细.

OrdersMapper类中的对应方法已经有了,我们需要做的就是在Orders类中添加订单明细的字段:

cda2475c986ed1e364d5cc8f89a3ce12.png

书写SQL:

SELECT o.id,o.user_id,o.number,u.username,u.sex,od.id,od.items_numFROMORDERS o,USER u,orderdetail od WHERE o.user_id=u.id and od.orders_id=o.id;

执行后的查询结果如下所示:

8ff1cf2c879d9742cccf45aa0c7a8d77.png

可以看出orderdetail的id的列名以id1的形式列了出来,这是因为在书写sql的时候,查询的id列名与orders表的id列名重复了.解决方法是给orderdetail查询id的查询结果起一个别名:detailId

924fe5af1b4e92a4aeedddc7bbdb7fab.png

改写OrdersMapper对应的配置文件..同样需要配置resultMap.这里用到了新的标签,.可以完成对于集合类型的属性的映射.具体操作方法如下:

这样就完成了一对多的映射.接下来就可以直接调用指定的方法查询出对应的结果了:

aa939932a931e4a4fbbdaeab7f8105db.png

二.多对多映射

物品(items)和订单(orders)是多对多映射.两者实际上是通过OrderDetails中间表完成了关联.

需求:查询用户.同时查询出用户所关联的所有的订单,同时查询出订单所对应的所有的订单项以及订单项所对应的物品.

分析表之间的关系:

用户与订单是一对多关系.订单和订单项是一对多关系.订单项和物品是一对一的关系.

理清表之间的关系后,就可以去写Pojo类了:

User类:

b5624a893ed19610d3a96de2becaec26.png

Orders类:

1ba9e0d1948a197f4250872e8e8dac16.png

OrderDetail类:

255434a5ef3e73ccaced5be0eb54e5d5.png

Items类:

439b0b90589ecf89de14730dbcd83087.png

书写SQL语句如下.为了方便,为每一个表的主键都起了别名:

SELECTu.id uid,u.username,

o.id oid,o.number,od.id odid,od.items_num,

i.id iid,i.name,i.priceFROM useru,orders o,orderdetail od,items iWHERE u.id=o.user_id AND o.id=od.orders_idAND od.items_id=i.id;

书写Mapper配置文件.根据表与表之间的对应关系,书写映射关系:

SELECT u.id uid,u.username,

o.id oid,o.number,od.id odid,od.items_num,

i.id iid,i.name,i.price

FROM user u,orders o,orderdetail od,items i

WHERE u.id=o.user_id and o.id=od.orders_id

AND od.items_id=i.id;

测试:

8e52cdb0512acf9a9e7bf4c8e80e114e.png

三.mybatis整合spring

3.1.搭建环境.

导入jar包,pojo类,导入db.properties配置文件

db.properties如下:

db.driverClass=com.mysql.jdbc.Driver

db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8

db.username=root

db.password=root

3.2.建立SqlMapConfig.xml.

在刚开始SqlMapConfig.xml中不需要书写任何信息.(因为数据库连接信息交给spring去管理了.)

3.3.采用传统Dao方式开发

3.3.1 建立User.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM USER WHERE

id=#{id}

在SqlMapConfig.xml中引入User.xml

5bd53fd343661222f189dcce406ca0db.png

3.3.2 .书写Dao

注意,SqlSessionDaoSupport是由spring提供的便捷操作的类.

c953e9d0d37d3947f303aec632b079c6.png

3.3.3 建立spring配置文件.

需要配置的包括datasource,sqlSessionFactory和dao

3.3.4 测试

@ContextConfiguration("classpath:spring/applicationContext.xml")

@RunWith(SpringJUnit4ClassRunner.class)public classtestMybatis {

@AutowiredprivateUserDao udao;

@Testpublic voidtestMyBatis() {

User user= udao.findUserById(1);

System.out.println(user);

}

}

3.4. 采用mapper代理的方式开发

3.4.1 建立UserMapper接口

d61481b53533a3e003262a190c36979e.png

3.4.2 建立UserMapper.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM USER WHERE

id=#{id}

3.4.3 书写applicationContext.xml

配置datasource,sqlsessionfactory与传统dao几乎完全一致.需要注意的是,mapper代理开发可以不去书写mybatis全局配置文件!

此外,我们需要在applicationContext.xml中,去批量生成代理的mapper对象.具体做法如下所示:

76c07d32b2802de4bf24378c83455d37.png

3.4.4 测试

@ContextConfiguration("classpath:spring/applicationContext.xml")

@RunWith(SpringJUnit4ClassRunner.class)public classtestMybatis {

@AutowiredprivateUserMapper mapper;

@Testpublic voidtestMyBatis2() {

User user=mapper.findUserById(1);

System.out.println(user);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值