一.一对多映射.

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

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

引入的订单表如下所示:

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

订单的Pojo类如下所示:

创建OrdersMapper接口.

书写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对应的属性中去.因此,采用<association>标签去赋值.<association>的<id>属性标识了关联对象的id.<result>属性标识了关联对象的其他属性.具体做

法参见注释.

Mapper的配置如下:

<mapper namespace="com.xyy.mapper.OrdersMapper">
<resultMap type="com.xyy.po.Orders" id="orderResultMap">
<id column="id" property="id"/>
<result column="number" property="number"/>
<!-- association标识了关联对象的属性.property表示属性名.javaType表示具体的类 -->
<association property="user" javaType="com.xyy.po.User">
<!-- 和resultMap的配置方法一样,property为具体映射的属性名,column为查询出来的结果名 -->
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="sex" column="sex"/>
</association>
</resultMap>
<select id="findOrders" resultMap="orderResultMap">
SELECT o.id,o.user_id,o.number,u.username,u.sex
FROM ORDERS o,
USER u WHERE o.user_id=u.id;
</select>
</mapper>

测试:

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

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

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

引入订单明细的表:

引入订单明细的Pojo类:

需求分析:

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

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

书写SQL:

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

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

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

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

<resultMap type="com.xyy.po.Orders" id="orderResultMap">
<id column="id" property="id"/>
<result column="number" property="number"/>
<!-- 配置user相关的映射信息 -->
<association property="user" javaType="com.xyy.po.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="sex" column="sex"/>
</association>
<!-- 配置orderdetails相关的信息 -->
<!--collection用于指定集合类型的映射.property指定对应的集合名称.ofType指定集合中存放的数据的类型 -->
<collection property="detailList" ofType="com.xyy.po.Orderdetail">
<!-- id和result指定了需要配置的列和属性名和映射 -->
<id column="detailId" property="id"/>
<result column="items_num" property="itemsNum"/>
</collection>
</resultMap>

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

二.多对多映射

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

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

分析表之间的关系:

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

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

Orders类:

OrderDetail类:

Items类:

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

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;

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

<resultMap type="com.xyy.po.User" id="userManyToManyMap">
<!--配置user -->
<id column="uid" property="id"/>
<result column="username" property="username"/>
<!-- 配置user对应的Orders 一对多 -->
<collection property="orders" ofType="com.xyy.po.Orders">
<id column="oid" property="id"/>
<result column="number" property="number"/>
<!-- 配置orders对应的orderdetail一对多 -->
<collection property="detailList" ofType="com.xyy.po.Orderdetail">
<id column="odid" property="id"/>
<result column="items_num" property="itemsNum"/>
<!-- 配置orderdetail对应的items 一对一-->
<association property="items" javaType="com.xyy.po.Items">
<id column="iid" property="id"/>
<result column="name" property="name"/>
<result column="price" property="price"/>
</association>
</collection>
</collection>
</resultMap>
<select id="findAllUsers" resultMap="userManyToManyMap">
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;
</select>

测试:

三.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

<?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="test1">
<select id="findUserById" parameterType="int" resultType="com.xyy.po.User">
SELECT * FROM USER WHERE
id=#{id}
</select>
</mapper>

在SqlMapConfig.xml中引入User.xml

3.3.2 .书写Dao

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

3.3.3 建立spring配置文件.

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

<!-- 引入配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${db.driverClass}"></property>
<property name="jdbcUrl" value="${db.url}"></property>
<property name="user" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引入mybatis全局的配置文件 -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="userDao" class="com.xyy.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

3.3.4 测试

@ContextConfiguration("classpath:spring/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class testMybatis {
@Autowired
private UserDao udao; @Test
public void testMyBatis() {
User user = udao.findUserById(1);
System.out.println(user);
}
}

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

3.4.1 建立UserMapper接口

3.4.2 建立UserMapper.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">
<!--namespace需要和mapper的全限定名保持一致-->
<mapper namespace="com.xyy.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE
id=#{id}
</select>
</mapper>

3.4.3 书写applicationContext.xml

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

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

3.4.4 测试

@ContextConfiguration("classpath:spring/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class testMybatis {
@Autowired
private UserMapper mapper; @Test
public void testMyBatis2() {
User user=mapper.findUserById(1);
System.out.println(user);
}
}

mybatis入门_一对多,多对多映射以及整合spring框架的更多相关文章

  1. 整合Spring框架和MyBatis框架

    ------------------------siwuxie095                                 整合 Spring 框架和 MyBatis 框架         ...

  2. JavaWeb_(Mybatis框架)MyBatis整合Spring框架

    MyBatis + Spring整合开发 a)使用Spring容器用单例模式管理Mybatis的sqlSessionFactory:b)使用Spring管理连接池.数据源等:c)将Dao/Mapper ...

  3. MyBatis入门学习教程-Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  4. mybatis ---- 级联查询 一对多 (集合映射)

    关联有嵌套查询和嵌套结果两种方式,本文是按照嵌套结果这种方式来说明的 上一章介绍了多对一的关系,用到了<association></association>,这是一个复杂类型的 ...

  5. mybatis入门_配置文件的配置

    一.全局配置文件配置 1.1 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties中..) 下为db. ...

  6. MyBatis 入门到精通(三) 高级结果映射

    MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程序,也将是非常 ...

  7. MyBatis 入门到精通(二) SQL语句映射XML文件

    MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...

  8. Mybatis入门(六)联查之多对一

    Mysql可以联查,但Mybatis也可以联查只是没有MySQL联查的舒服需要配置很多文件. 开始搭建环境: MySQL新建两个表一个Student一个Teacher表: Teacher表: CREA ...

  9. Mybatis的多对多映射

    一.Mybatis的多对多映射 本例讲述使用mybatis开发过程中常见的多对多映射查询案例.只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见& ...

随机推荐

  1. Easy Tag Write(3.3)

    package skyseraph.android.util; /** * @Title : Constant.java * @Package : tcl.nfc.tv.util * @ClassNa ...

  2. js 复选框 全选都选 如果某一个子复选框没选中 则全选按钮不选中

    <!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>js 复选框 全选都选 ...

  3. AppSettings从数据库读取

    /// <summary> /// 提供对配置信息的访问 /// </summary> public static class AppSettings { /// <su ...

  4. failed to lazily initialize a collection of role:XXX, no sessi

    系统 框架  springMVC+hibernate 这种情况 由于 hibernate 的 懒汉机制,和 Spring 事务机制(不确定)造成的 由于 spring 配置的时候,在service 层 ...

  5. NoSQL数据库笔谈(转)

    NoSQL数据库笔谈 databases , appdir , node , paper颜开 , v0.2 , 2010.2 序 思想篇 CAP 最终一致性 变体 BASE 其他 I/O的五分钟法则 ...

  6. 我认识的log4j开源日志

    Log4j 在java中如何配置log4j!! 步骤: ①引入jar包,推荐新建一个lib文件夹,用来装所有的jar包(还要进行下图内的操作) 之后项目中就会多出一个引入外部Library的项目 ②创 ...

  7. VB 中 NumericUpDown 控件 如何为手动输入设定触发事件

    Private Sub numDuration_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) ...

  8. weboffice控件使用不能嵌入网页

    var s = ""s += "<object id=WebOffice1 height=586 width='100%' style='LEFT: 0px; TO ...

  9. C语言-循环结构及break、continue

    循环结构 --1-- 结构循环 1.1 while循环 1.2 do…while循环 1.3 for循环 --2-- break和continue 2.1 break关键字 2.2 continue关 ...

  10. 同一界面放两个TTIWDBAdvWebGrid的问题(delphi IW TMS)

    同一个界面放了两个 TTIWDBAdvWebGrid 时,操作一个表,另一个的也跟着一起更改了,后查看网页生成的DIV,发现ID相同. 后查,有一个ID属性,更改后解决问题.