SSM项目中自定义对象,当一个对象中仍然还含有一个自定义对象的时候,怎么在项目中mybatis映射文件中讲数据库的相关的表(>1张表)映射到所有的属性上

实体类:

Good.java

package com.thinkgem.jeesite.modules.goodsmanage.entity;

public class Good extends CommentEntity {

    private String id;
    private String name;
    private String price;
    private String number;
    private String tolPrice;
    private String remarks;

    private Provider provider;   //Good是一个自定义对象,在good中仍然有另一个自定义对象Provider

   //*......
  getter和setter方法省略
  ....*//
@Override public String toString() { // TODO Auto-generated method stub return "id:" + this.id + "name:" + this.name + "price:" + this.price + "number:" + this.number + "remarks:" + this.remarks + "provider:" + this.provider.getCompanyName(); } }

Provider.java

package com.thinkgem.jeesite.modules.goodsmanage.entity;

public class Provider {

    private String id;
    private String companyName;
    private String managerName;
    private String phone;
    private String address;
    private String type;
   //*......
  getter和setter方法省略
  ....*//
 @Override public String toString() {
// TODO Auto-generated method stub return "id:" + this.id+" "
+"companyName:" +" "+ this.companyName+" " +"managerName:"
+this.managerName+" "+" "+"phone:" +this.phone +" " + " address:" + this.address + " ";
} }

GoodDao.java

package com.thinkgem.jeesite.modules.goodsmanage.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
import com.thinkgem.jeesite.modules.goodsmanage.entity.Good;
/**
* mybatis接口类
* @author 31899
*
*
*/
@MyBatisDao
public interface GoodDao {

public List<Good> getAllGood();

public Good getGoodById(@Param("id")String id);

public void saveGood(Good good);

public int deleteGood(String id);
}

GoodDao.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.thinkgem.jeesite.modules.goodsmanage.dao.GoodDao">




<sql id="goodColumns">
    g.id AS id ,
    g.name AS name,
    g.price AS price,
    g.number AS number,
    g.tolPrice AS tolPrice,
    g.remarks AS remarks,
    g.providerId AS "provider.id",
    g.delFlag AS delFlag,
    p.companyName as "provider.companyName",
    p.companyName as "provider.managerName",
    p.phone as "provider.phone",
    p.address as "provider.address"
    
    
    
</sql>

<sql id="goodJoins">
join ma_provider p on g.providerId = p.id
</sql>



<select id="getAllGood" resultType="com.thinkgem.jeesite.modules.goodsmanage.entity.Good">
select 
    <include refid="goodColumns"></include>
    from ma_good g
    <include refid="goodJoins"></include>
    where g.delFlag!="1"
</select>

<select id="getGoodById" resultType="com.thinkgem.jeesite.modules.goodsmanage.entity.Good">
    select <include refid="goodColumns"></include>
    from ma_good g
    <include refid="goodJoins"></include>
     where g.id=#{id} and g.delFlag!="1" 
</select>


<select id=""></select>

    
<insert id="saveGood">
    insert into ma_good(id,name,price,number,tolPrice,remarks,providerId,delFlag) 
    values(#{id},#{name},#{price},#{number},#{tolPrice},#{remarks},#{provider.id},"0"})
</insert>

<delete id="deleteGood">
    update ma_good set delFlag="1" where id=#{id}
</delete> 

</mapper>

mysql数据库表

ma_good表 别名g

ma_ provider表  别名p

需求:

我想在查询所有的商品Good的时候,同时将每一个商品的供应商的信息同时的也查询出来,其中的good是一个自定义对象,provider也是一个自定义对象,现在的目标就是通过mybais的映射文件怎么同时将good对象的所有属性从数据库ma_good表映射到自己的基本属性上的同时,再将每一个商品的对象自己的一个非基本的属性provider(Provider.java类型)的属性同时也映射到内层的provider的属性上。

实现:

在GoodDao.xml文件中的动态sql  goodColumns中 用一个灵巧的写法;具体的意思见代码中:

<sql id="goodColumns">
    g.id AS id ,
    g.name AS name,
    g.price AS price,
    g.number AS number,
    g.tolPrice AS tolPrice,                        整体的谁对应谁:可以这样的想,左侧是想要的表别名.字段名,as的右侧是想要将左侧的对应到那个对象的那个属性上面,
                                就写成单独的属性名,如tolPrice 如果是内部的对象 的属性的话,应该写成:provider.compantName这样的 ,
                                 其中的provider是good对象的一个自定义复合属性 g.remarks AS remarks, g.providerId AS
"provider.id", g.delFlag AS delFlag, p.companyName as "provider.companyName", #其中的g、p都为后面select时 from后面的表别名, p代表provider表别名,其中的 p.managerName as "provider.managerName", g 代表good表,而 p. 和g. (粉色字体)后面的是表中字段名
                            (通过明确字段名称属于哪个表,就选p.还是g.),
                            而As后面的是具体的 就是具体 的对选bean中的属性的名称
p.phone as "provider.phone",                  可以根据颜色去找是对应的是表字段还是bean的属性
p.address as "provider.address"


</sql> <sql id="goodJoins"> join ma_provider p on g.providerId = p.id </sql> <select id="getAllGood" resultType="com.thinkgem.jeesite.modules.goodsmanage.entity.Good"> select <include refid="goodColumns"></include> from ma_good g <include refid="goodJoins"></include> where g.delFlag!="1" </select>

猜你喜欢

转载自www.cnblogs.com/isme-zjh/p/12615332.html