mybatis的总结(2)


time :00点04分


mybatis的总结(2)

上次总结mybatis,还没有总结完,这次再补充一下吧。

一对多

  • 标签常用的属性介绍:

    • property 对象对应的属性名
    • column 属性对应的表的字段名
    • select 表示要调用哪个查询方法

    我拿下面的代码解释说明以下吧。

    首先呢,getPayByPayName方法返回的是一个resultMap指向下面的id名为

    getPay的结果集。然后这个结果集返回的对象类型是type="com.raven.pojo.Pay",

    可以这么理解,resultMap委托association查询出这个Pay对象的xsdcode属性。然后就完成了一个Pay对象的封装过程。

  <select id="getPayByPayName" resultMap="getPay">
  		select auditpass,id,mail,payamout,payname,xsdcode from t_pay where payname=#{payname}
  	</select>
  <resultMap type="com.raven.pojo.Pay" id="getPay">
  	<association property="xsdcode" column="xsdcode"  select="com.raven.intefdao.CodeMapper.getCodeById" >
  	
  	</association>
  	
  </resultMap>
  <!--CodeMapper.xml -->
  <mapper namespace="com.raven.intefdao.CodeMapper">
  	<select id="getCodeById" resultType="com.raven.pojo.Code">
  		select id,xsdcode,used,name,subject from t_code where id=#{id}
  	</select>
  
  </mapper>

另外 这是association的另外 一种使用方式,上面是结果集没有包含已经包含了xsdcode的属性,那么就需要委托select指向的函数接口去查找。那么下么这种用法显然是 结果集已经包含了xsdcode,所以直接赋值就行了。

 <resultMap type="com.raven.pojo.Pay" id="getPay2">	
  			<!-- 
  				注释的和下面的一个意思
  			<id column="cid" property="xsdcode.id"/>
  			<result column="name" property="xsdcode.name"/>
  			<result column="xsdcode" property="xsdcode.xsdcode"/>
  			<result column="used" property="xsdcode.used"/>
  			<result column="subject" property="xsdcode.subject"/> -->
  			<association property="xsdcode" javaType="com.raven.pojo.Code">
  				<id column="id" property="id"/>
  				<result column="name" property="name"/>
  				<result column="xsdcode" property="xsdcode"/>
  				<result column="used" property="used"/>
  				<result column="subject" property="subject"/>
  			</association>
  </resultMap>

这里我们得到结论,一般像这种的xml错误是很难找到原因的,所以我们总结出association的两种用法。里面的属性值缺一不可。

  1. <resultMap type="com.raven.pojo.Pay" id="getPay">
        
        <association property="xsdcode" column="xsdcode"  select="com.raven.intefdao.CodeMapper.getCodeById" >
                </association>
        
    </resultMap>
    

    另外需要注意:第二种用法需要对Pay对象其他的属性设置,不然其他属性都是null.

  2. 为什么第二个不需要column属性呢?因为它用不到。。上面用到column是必须需要的,因为他需要用到那个值去查数据库。

    
    <resultMap type="com.raven.pojo.Pay" id="getPay2">
        
         <!-- 需要对Pay对象属性设置-->    
      <id column="pid" property="id"/>
        
    <association property="xsdcode" javaType="com.raven.pojo.Code">
        <!-- 中间省略-->    	
        </association>
        
    </resultMap>
    

一对多

collection标签常用的属性介绍

上面已经介绍过其他属性了,这里只介绍一个

  • ofType 是映射到list集合属性中pojo的类型

    • 什么意思呢?<collection property="pays" ofType="com.raven.pojo.Pay" >拿这句代码来讲,就是说这个属性pays是个List类型。拿代码我们也能很直观的看到pays是个List对象。

      • public class User {
        	private int id;
        	private String username;
        	private List<Pay> pays;
        	}
        
<mapper namespace="com.raven.intefdao.UserMapper">
	<select id="getUserInfo" resultMap="getUser" >
		<!-- select * from t_user,t_pay where t_username = #{username} and payname = #{username} -->
		select * from t_user where t_username = #{username}
	</select>
	<resultMap type="com.raven.pojo.User" id="getUser" >
		<id column="t_id" property="id"></id>
		<result column="t_username" property="username"/>
		<!-- 
				ofType指定的是映射到list集合属性中pojo的类型
					以下用两种方式实现
						这里解释下为什么传入 column="t_username" ,因为他要拿这个参数去查订单啊。。
						
		 -->
		 <collection property="pays" column="t_username"  select="com.raven.intefdao.PayMapper.getPayByPayName" ofType="com.raven.pojo.Pay" >
		 </collection>
	<!-- 	<collection property="pays" ofType="com.raven.pojo.Pay" >
			<id column="id" property="id"/>
			<result column="paystaus" property="paystaus"/>
			<result column="payamout" property="payamout"/>
			<result column="payname" property="payname"/>
			<result column="paytime" property="paytime"/>
			<result column="mail" property="mail"/>
			<result column="auditpass" property="auditpass"/>
			<association property="xsdcode" column= "xsdcode" select="com.raven.intefdao.CodeMapper.getCodeById"></association>
		</collection> -->
	</resultMap>

其实弄懂了,一对一,那么这个一对多也很好理解,就是个ofType属性搞懂就行啦。

另外,如果想查看mybatis输出sql数据,

那么首先

  1. 导入依赖

  2. <dependency>
    		<groupId>log4j</groupId>
    		<artifactId>log4j</artifactId>
    		<version>1.2.17</version>
    	</dependency>
    
  3. mybatis配置文件加入如下设置:

    <settings>
            <setting name="logImpl" value="LOG4J" />
    </settings>
    
  4. 建立 log4j.properties文件

    #Root Logger  
    #log4j.rootLogger = [ level ] , appenderName, appenderName,  
    #ConversionPattern:%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t]  [%c] [%p] - %m%n    
    #FilePath =  /opt/uploads/maven_logs/maven_web.log  
    #########################################################################  
    #将Mybatis log4j运行级别调到DEBUG可以在控制台打印出Mybatis运行的sql语句  
    log4j.rootLogger=DEBUG,Console,File  
    ### 把日志信息输出到控制台 ###  
    log4j.appender.Console=org.apache.log4j.ConsoleAppender  
    log4j.appender.Console.Target=System.out  
    log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
    log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t]  [%c] [%p] - %m%n   
    ### 把日志信息输出到文件:/opt/uploads/maven_logs/maven_web.log ###  
    log4j.appender.File = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.File.File = /opt/uploads/maven_logs/maven_web.log  
    log4j.appender.File.Threshold = DEBUG  
    log4j.appender.File.layout = org.apache.log4j.PatternLayout  
    log4j.appender.File.layout.ConversionPattern =%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t]  [%c] [%p] - %m%n   
      
    ###显示SQL语句部分  
    log4j.logger.com.mybatis=DEBUG  
    log4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUG  
    log4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUG  
    log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG  
    log4j.logger.java.sql.Connection=DEBUG  
    log4j.logger.java.sql.Statement=DEBUG  
    log4j.logger.java.sql.PreparedStatement=DEBUG</strong>
    
    

    好了,今天先总结到这里。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值