zoukankan      html  css  js  c++  java
  • mybatis关联配置(一对多配置)

          mybatis框架的关联配置:

        首先假设我们数据库中有两个表,一个表示move,另一个是moveType,move里面有一个字段typeid,与moveType表里面的id相对应。相信大家已经看出来了,一个moveType对应多个move,我们查询move字段的时候,必要的时候得显示moveType的内容,比如我的move的name是:《A计划》,那么对应的我的moveType就是动作片,而不是直接显示的id,有人说这不就是sql的内连接查询么?非也,你用sql的内连接是显示不出来MoveType里面的name的,那么,对于这种情况我们该怎么查询呢?怎么配置呢?

         别急,听我娓娓道来。

    为了不让大家迷糊,我还是写全吧,从最基本的实体类开始:

          首先我们创建一个Move的实体类,与数据库中的move表相对应,代码如下:

    public class Move {
    	private Long id;               //电影id
    	private MoveType type;         //电影类型
    	private String name;           //电影名称
    	private String actor;          //电影主演
    	private String director;       //电影导演
    	private Integer price;         //电影价格
    }

          在这里我们省略getter和setter方法,直接在创建一个实体类,MoveType,此类与数据库中的moveType表相对应,代码如下:

    public class MoveType {
    	private Integer  	id;
    	private String		typeName;
    }

          同样我们省略getter和setter方法,咱们在去建一个dao接口,IMoveDao,与Move类相对应,代码如下:

     

    public interface IMoveDao {
    	/**
    	 * 
    	* @Title: saveMove
    	* @Description: 添加电影
    	* @param @param move
    	* @param @return    设定文件
    	* @return int    返回类型
    	* @throws
    	 */
    	public int  saveMove(Move move);
    	/**
    	 * 
    	* @Title: queryMoveByTerm
    	* @Description: 动态查询电影
    	* @param @param mt
    	* @param @return    设定文件
    	* @return List<Move>    返回类型
    	* @throws
    	 */
    	public List<Move> queryMoveByTerm(MoveTerm mt);
    }

               接着在创建个IMoveTypeDao接口类,与实体类MoveType相对应:

    public interface IMoveTypeDao {
    	/**
    	 * 
    	* @Title: getAllMoveTypes
    	* @Description: 查询全部的电影类型
    	* @param @return    设定文件
    	* @return List<MoveType>    返回类型
    	* @throws
    	 */
    	public List<MoveType>  getAllMoveTypes();
    }
    

            光有了实体类和dao接口还远远不够,正儿八经的配置还没开始呢。

            我们先配置MoveDaoMapper.xml的映射文件,同样,此映射文件对应的是IMoveDao接口,这个比较复杂,咱们慢慢的来,代码如下:

        (1)先把头部拿出来:

    <?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">

       (2)映射Move实体类的字段属性

    <!-- 映射Move实体类的字段属性 -->
    	<!-- type="move" 等价于type="org.entity.Move"-->
    	<resultMap type="move" id="moveMapper">
    		<id property="id" column="id"/>
    		<result property="name" column="name"/>
    		<result property="actor" column="actor"/>
    		<result property="director" column="director"/>
    		<result property="price" column="price"/>
    <!-- 关联MoveType实体类, -->
            <!-- type:实体类Move中的type对象 -->
            <!-- typeid:数据表Move的typeid -->
            <!-- selectMoveType:映射的是实体类MoveType -->
            <association property="type" column="typeid"
            select="selectMoveType" />
    </resultMap>
    

       (3)映射实体类MoveType

    <!-- 映射实体类MoveType -->
    	<!-- type="moveType" 等价于type="org.entity.MoveType"一样  -->
    	<resultMap id="moveTypeMapper"  type="moveType" >
    			<id property="id" column="id"/>
    			<result property="typeName" column="typename"/>
    	</resultMap>

       (4)对应的moveType的映射

    <!-- selectMoveType与上面MoveType实体类的select相对应 -->
    	<!-- moveTypeMapper与上面映射实体类MoveType的id相对应 -->
    	<select id="selectMoveType"  resultMap="moveTypeMapper">
    		select * from movetype where id=#{typeid}
    	</select>

       (5)下面就是咱们在Dao层里面方法的sql实现了

    	<!-- 添加电影 -->
    	<insert id="saveMove" parameterType="move">
    		insert into 
    		move
    		(id,typeId,name,actor,director,price)
    		values
    		(#{id},#{type.id},#{name},#{actor},#{director},#{price})
    	</insert>
    	
    	<!-- 动态查询电影 -->
    	<select id="queryMoveByTerm" 
    	parameterType="hashmap" 
    	resultMap="moveMapper">
    		select 
    		id,
    		typeid,
    		name
    		,actor
    		,director
    		,price
    		 from move 
    		  <where>
    			<if test="typeid!=null "> and typeid=#{typeid}</if>
    			<if test="name!=null"> and name=#{name}</if>
    			<if test="actor!=null"> and actor=#{actor}</if>
    			<if test="director!=null"> and director=#{director}</if>
    			<if test="smallPrice!=null"> and price between #{smallPrice}  and #{bigPrice}</if>
    		</where> 
    	</select>

       最后记得用<mapper></mapper>把上面的配置包起来。

    到此,我们的MoveDaoMapper.xml的配置就结束了,下面我们来配置一下MoveTypeDaoMapper.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="moveTypeDao">
    	<select id="getAllMoveTypes" resultType="moveType">
    		select * from movetype 
    	</select>
    </mapper>

          这里面只有一个查询所有电影类型的方法,所以比较简单,重点和难点还是都在MoveDaoMapper.xml里面,最后我在附加一个动态查询的条件类吧:

    public class MoveTerm {
    	private Long id;             //电影id
    	private MoveType type;      //电影类型
    	private String name;        //电影名称
    	private String actor;       //主演
    	private String director;    //导演
    	private Integer smallPrice; //最低价格
    	private Integer bigPrice;   //最高价格
    }
    

    省略getter和setter方法!!

         好了,配置到此结束,有意见的评论区交流,评论区见!!


  • 相关阅读:
    The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make s
    ScrollView 定位
    Fragment获取Activity,Activity获取Fragment
    Popupwindow全屏问题
    bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
    bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)
    2016vijos 1-3 兔子的晚会(生成函数+倍增FWT)
    bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)
    bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
    cdqz2017-test10-加帕里图书馆(区间DP & 简单容斥)
  • 原文地址:https://www.cnblogs.com/a1111/p/7459757.html
Copyright © 2011-2022 走看看