0 0

myBatis要不要用实体类5

新手学myBatis,
请问用myBatis一定要写实体类吗?比如一些多表查询关联报表查询都是临时性的或者说都是多变,能不能不写实体类以jdbc结果集的型式展现呢?

问题补充:
xueliang880107 写道
每张表都要对应一个实体 这样才能映射嘛 多表联合查询的结果可以返回一个hashmap处理 时情况而定

能具体举个例子吗?谢谢

问题补充:
w6513017 写道
如果你是多表联合查询,然后你又觉得返回方式用map很麻烦的话,你可以自己建立个实体类,这个实力类中包含有你所要查询的多表中的字段,然后在mybatis中用typeAlias指定一下,到时候,就能像用一般的实体类那样使用就好。

我就是不想这样呀,如果这个sql语句是动态的,字段名不确定,那如何建实体类?
所以能不能不建实体类,取出来就是一个结果集呢?

问题补充:
zhaoruiqing 写道
本身取出来就是结果集。
  <select id="select_adatt" parameterType="HashMap" resultMap="AD_Att_result">
   		select 
   		ID,
   		AD_ID,
   		AD_URL,
   		AD_PATH
   		from 
   		ad_attachment
   		<where>
   			1=1
   			<if test="ad_id!=null">
   			 and AD_ID=#{ad_id}
   			</if>
 			<if test="ID!=null">
   			 and ID=#{id}
   			</if>
   		</where>
   </select>

定义一个resultMap接就可以了


但这个定义这个结果集resultMap="AD_Att_result"时能不能不定义实体类(如下):
<resultMap id="AD_Att_result" type="com.myEntity.AD_Att_result">
<id property="id" column="ID" />
<result property="ad_url" column="AD_URL"/>
...
...
...
</resultMap>


问题补充:
zhaoruiqing 写道
本身取出来就是结果集。
  <select id="select_adatt" parameterType="HashMap" resultMap="AD_Att_result">
   		select 
   		ID,
   		AD_ID,
   		AD_URL,
   		AD_PATH
   		from 
   		ad_attachment
   		<where>
   			1=1
   			<if test="ad_id!=null">
   			 and AD_ID=#{ad_id}
   			</if>
 			<if test="ID!=null">
   			 and ID=#{id}
   			</if>
   		</where>
   </select>

定义一个resultMap接就可以了

zhaoruiqing: 能说说这个resultMap="AD_Att_result" 是如何定义吗?我的理解是这个resultMap最终还是要挂靠一个实体类吧?

问题补充:
zhaoruiqing 写道
我没像你那样做过,resultMap你可以指定他的类型为实体类,但是既然这样你为何要用reslutmap而不是直接就用实体类呢。搞这个你可以直接返回一个reslutMap,他的类型直接是一个hashmap就可以。
基本的过程是这样:首先查询得到返回结果集,这时为Map,如果有reslutType则将key_value通过get_set方式建立一个对象,如果直接用reslutMap 则省去转换的一步,当然,你又指定resultMap的type的话,他也一样会转换成一个实体类来处理。不知道明白了没


如果类型指定为hashMap只是针对返回一条记录的情况吧,如果返回多条记录类型就不能指定为hashMap了.

问题补充:
zhaoruiqing 写道
多个结果集他会给你放入一个List,你在javacode中用selectList这样的代码返回的是list,当然这个list中可能是实体类也可能是hashmap


这点还是没理解,能用代码举例说明一下吗?在javacode中如何selectList?谢谢.

问题补充:
zhaoruiqing 写道
多个结果集他会给你放入一个List,你在javacode中用selectList这样的代码返回的是list,当然这个list中可能是实体类也可能是hashmap


谢谢zhaoruiqing,经过反复测试明白了,在定义接口的时候如果定义成List,myBatis自动转了,就可以把自已自定义的map入进去,;


public interface UserMapper {

    public List  get_sp_Goods(Map returnMap);

}

	@Test
	public void callProcedure(){
		SqlSession session=sqlSessionFactory.openSession();
	    UserMapper  userMapper=session.getMapper(UserMapper.class);
	    Map retuParam = new HashMap();
	   List list= userMapper.get_sp_Goods(retuParam);
	   System.out.println(list.size());
	   for (Object object : list) {
		   Map map=(Map) object;
		   System.out.println(map);
	   } 	
	}


 <!-- 调用存储过程 -->
     <select  id="get_sp_Goods" 
             statementType="CALLABLE"  
             parameterMap="ParaMap_test"
             resultMap="mpGoods"        
             >   
            {#{result} = call sp_getGoods()}  
     </select> 


  <resultMap type="hashmap" id="mpGoods">  
          <result property="price"   column="price"   javaType="java.lang.String"    jdbcType="VARCHAR"/>  
          <result property="name"   column="name"    javaType="java.lang.String"   jdbcType="VARCHAR"/>  
          <result property="manufacture"   column="manufacture"    javaType="java.lang.String"    jdbcType="VARCHAR"/>  
       </resultMap>  
       
       <parameterMap    type="hashmap" id="ParaMap_test">  
            <parameter property="result"   
                       mode="OUT"   
                       javaType="java.sql.ResultSet"     
                       jdbcType="OTHER" 
                       resultMap="mpGoods"
                       />  
        </parameterMap>  


我以上这个例子,又如何能得到这个输出参数呢?是我在java Code中的方法调用传参有问题吗?thks.

问题补充:
zhaoruiqing 写道
 <!-- 调用存储过程 -->   
     <select  id="get_sp_Goods"    
             statementType="CALLABLE"     
             parameterMap="ParaMap_test"  
             resultMap="mpGoods"           
             >      
            {#{result} = call sp_getGoods()}     
     </select>  


这个里面的 parameterMap="ParaMap_test"  不要,还有你的传入参数是一个空的map?你的代码应该没问题,如果list有值的话,直接map.get("key")就可以了

 <resultMap type="hashmap" id="mpGoods">     
          <result property="price"   column="price"   javaType="java.lang.String"    jdbcType="VARCHAR"/>     
          <result property="name"   column="name"    javaType="java.lang.String"   jdbcType="VARCHAR"/>     
          <result property="manufacture"   column="manufacture"    javaType="java.lang.String"    jdbcType="VARCHAR"/>     
       </resultMap>  
就是这里定义的这些


这个list有值的,我的测试数据显示如下:
{id=1, price=98.00, manufacture=机械工程出版社, name=java编程思想, specification=本书赢得全球程序员的广泛赞誉., ID=1, SPECIFICATION=本书赢得全球程序员的广泛赞誉.}
{id=2, price=108.00, manufacture=机械工程出版社, name=java核心技术, specification=针对Java SE6平台进行全面更新,涵盖Java语言核心内容., ID=2, SPECIFICATION=针对Java SE6平台进行全面更新,涵盖Java语言核心内容.}
{id=3, price=108.00, manufacture=中国电力出版社, name=java经典实例, specification=本书针对Java开发人员而言是理想的'第二本书'讲述API比一般书籍要详细,非常适合扩大Java应用的知识面., ID=3, SPECIFICATION=本书针对Java开发人员而言是理想的'第二本书'讲述API比一般书籍要详细,非常适合扩大Java应用的知识面.}
{id=4, price=58.00, manufacture=中国电力出版社, name=Asp.Net经典实例, specification=本书针对.Net开发人员., ID=4, SPECIFICATION=本书针对.Net开发人员.}
{id=5, price=58.00, manufacture=中国电力出版社, name=C#经典实例, specification=本书针对.Net开发人员., ID=5, SPECIFICATION=本书针对.Net开发人员.}
但我看网上的另一方法是把要输出的结果集放入了参数变量中(如上),然后从这个参数hashMap中取得这个"result",再转成list输出,传参应该是传一个空hashMap呀,为什么没有返回值呢?


问题补充:
zhaoruiqing 写道
上面的数据已经有了。。。单个转换成map什么的都可以。
你说的:
但我看网上的另一方法是把要输出的结果集放入了参数变量中(如上),然后从这个参数hashMap中取得这个"result",再转成list输出,传参应该是传一个空hashMap呀,为什么没有返回值呢?

不太明白,不是已经有了返回值了么??这个返回结果的过程很好理解,你如果熟悉jdbc操作,应该对resultSet不陌生


请看此处:
http://database.51cto.com/art/201108/287703.htm

我是说这个返回结果放入了参数hashMap中的一个key中,然后再在调用处得到这个key.我就是做不到它这里的这个效果,参数输入为Null.

问题补充:
zhaoruiqing 写道
你得有in....至少你的指定一下in吧,既然你要传入一些参数来执行这个存储,那就指定in吧,你给的链接就是个好例子,码上去试试


我这个存储过程不需要传入参数呀,所以只用到了:
   <parameterMap    type="hashmap" id="ParaMap_test"> 
            <parameter property="result"  
                       mode="OUT"  
                       javaType="java.sql.ResultSet"    
                       jdbcType="OTHER"/> 
  </parameterMap>

而这个property="result"   mode="OUT"  是不需要传参的呀.

问题补充:
zhaoruiqing 写道
既然不需要传参数。。。自然输入为null....你觉得结果应该如何??存储有out才行。。不知道你的有没有,他这样的就是存储有in有out....


CREATE PROCEDURE [dbo].[ProcedureName]  @para1 VARchar(8)='HNZZC001',  @para2  VarChar(30)='2010-07-08 02:00:00',  @para3  VarChar(30)='2010-07-09 12:00:00'  
AS 
 BEGIN  --查询临时表中的数据  
  SELECT *   FROM #tempTable
END  


他这个存储过程只有in参数,也是没用out参数呀,out是在这里定义的:

      <parameterMap    type="hashmap" id="ParaMap_test"> 
            <parameter property="result"  
                       mode="OUT"  
                       javaType="java.sql.ResultSet"    
                       jdbcType="OTHER"/> 
     </parameterMap> 
       
     <!-- 调用存储过程 -->
     <select  id="get_sp_Goods"
             statementType="CALLABLE" 
             parameterMap="ParaMap_test"
             resultMap="mpGoods"       
             >  
             <!--这里#{result}就是向输出参数赋值了呀 -->
            {#{result} = call sp_getGoods()} 
     </select>
       

问题补充:
zhaoruiqing 写道
好吧。。。那是我没看到。。。那你认为他是直接out出去了?那指定resultMap做什么。。。。模仿他的做一下。。莫非你出不来?


zhaoruiqing,非常感谢你的耐心解答,还真出来,不知道以下传参哪里有问题?
            SqlSession session=sqlSessionFactory.openSession();
    UserMapper  userMapper=session.getMapper(UserMapper.class);
    Map retuParam = new HashMap();
    ResultSet rs=null ;
//     retuParam.put("result", rs);
    System.out.println("====================");
   List list= userMapper.get_sp_Goods(retuParam);

            System.out.println(retuParam.get("result"));
2012年5月22日 14:15

13个答案 按时间排序 按投票排序

0 0

采纳的答案

多个结果集他会给你放入一个List,你在javacode中用selectList这样的代码返回的是list,当然这个list中可能是实体类也可能是hashmap

2012年5月23日 14:38
0 0

好吧。。。那是我没看到。。。那你认为他是直接out出去了?那指定resultMap做什么。。。。模仿他的做一下。。莫非你出不来?

2012年5月23日 16:56
0 0

既然不需要传参数。。。自然输入为null....你觉得结果应该如何??存储有out才行。。不知道你的有没有,他这样的就是存储有in有out....

2012年5月23日 16:32
0 0

你得有in....至少你的指定一下in吧,既然你要传入一些参数来执行这个存储,那就指定in吧,你给的链接就是个好例子,码上去试试

2012年5月23日 16:05
0 0

上面的数据已经有了。。。单个转换成map什么的都可以。
你说的:
但我看网上的另一方法是把要输出的结果集放入了参数变量中(如上),然后从这个参数hashMap中取得这个"result",再转成list输出,传参应该是传一个空hashMap呀,为什么没有返回值呢?

不太明白,不是已经有了返回值了么??这个返回结果的过程很好理解,你如果熟悉jdbc操作,应该对resultSet不陌生

2012年5月23日 15:39
0 0

 <!-- 调用存储过程 -->   
     <select  id="get_sp_Goods"    
             statementType="CALLABLE"     
             parameterMap="ParaMap_test"  
             resultMap="mpGoods"           
             >      
            {#{result} = call sp_getGoods()}     
     </select>  


这个里面的 parameterMap="ParaMap_test"  不要,还有你的传入参数是一个空的map?你的代码应该没问题,如果list有值的话,直接map.get("key")就可以了

 <resultMap type="hashmap" id="mpGoods">     
          <result property="price"   column="price"   javaType="java.lang.String"    jdbcType="VARCHAR"/>     
          <result property="name"   column="name"    javaType="java.lang.String"   jdbcType="VARCHAR"/>     
          <result property="manufacture"   column="manufacture"    javaType="java.lang.String"    jdbcType="VARCHAR"/>     
       </resultMap>  
就是这里定义的这些

2012年5月23日 15:20
0 0

	public List select_adatt(HashMap paramMap) {
		if(paramMap!=null){
			if(paramMap.containsKey("offset")&&paramMap.containsKey("limit")){
				return this.getSqlSessionTemplate().selectList("com.cepri.spicss.systemad.dao.ADDao.select_adatt", paramMap,new RowBounds(Integer.parseInt((String)paramMap.get("offset")), Integer.parseInt((String)paramMap.get("limit"))));
			}else{
				return this.getSqlSessionTemplate().selectList("com.cepri.spicss.systemad.dao.ADDao.select_adatt", paramMap);
			}
		}
		else{
			return this.getSqlSessionTemplate().selectList("com.cepri.spicss.systemad.dao.ADDao.select_adatt", paramMap);
		}
	
	}

   <select id="select_adatt" parameterType="HashMap" resultMap="AD_Att_result">  
        select    
        ID,   
        AD_ID,   
        AD_URL,   
        AD_PATH   
        from    
        ad_attachment   
        <where>  
            11=1   
            <if test="ad_id!=null">  
             and AD_ID=#{ad_id}   
            </if>  
        <if test="ID!=null">  
             and ID=#{id}   
            </if>  
        </where>  
 </select> 

2012年5月23日 15:05
0 0

我没像你那样做过,resultMap你可以指定他的类型为实体类,但是既然这样你为何要用reslutmap而不是直接就用实体类呢。搞这个你可以直接返回一个reslutMap,他的类型直接是一个hashmap就可以。
基本的过程是这样:首先查询得到返回结果集,这时为Map,如果有reslutType则将key_value通过get_set方式建立一个对象,如果直接用reslutMap 则省去转换的一步,当然,你又指定resultMap的type的话,他也一样会转换成一个实体类来处理。不知道明白了没

2012年5月23日 11:37
0 0

本身取出来就是结果集。

  <select id="select_adatt" parameterType="HashMap" resultMap="AD_Att_result">
   		select 
   		ID,
   		AD_ID,
   		AD_URL,
   		AD_PATH
   		from 
   		ad_attachment
   		<where>
   			1=1
   			<if test="ad_id!=null">
   			 and AD_ID=#{ad_id}
   			</if>
 			<if test="ID!=null">
   			 and ID=#{id}
   			</if>
   		</where>
   </select>

定义一个resultMap接就可以了

2012年5月23日 10:08
0 0

如果你是多表联合查询,然后你又觉得返回方式用map很麻烦的话,你可以自己建立个实体类,这个实力类中包含有你所要查询的多表中的字段,然后在mybatis中用typeAlias指定一下,到时候,就能像用一般的实体类那样使用就好。

2012年5月22日 18:09
0 0

灵活处理,不一定非要使用实体类。关联查询,返回一个map的例子你可以看一下原来ibatis的,这个没怎么变。

2012年5月22日 16:52
0 0

http://limingnihao.iteye.com/blog/781878

2012年5月22日 15:50
0 0

每张表都要对应一个实体 这样才能映射嘛 多表联合查询的结果可以返回一个hashmap处理 时情况而定

2012年5月22日 14:26

相关推荐

Global site tag (gtag.js) - Google Analytics