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的两种用法。里面的属性值缺一不可。
-
<resultMap type="com.raven.pojo.Pay" id="getPay"> <association property="xsdcode" column="xsdcode" select="com.raven.intefdao.CodeMapper.getCodeById" > </association> </resultMap>
另外需要注意:第二种用法需要对Pay对象其他的属性设置,不然其他属性都是null.
-
为什么第二个不需要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数据,
那么首先
-
导入依赖
-
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
mybatis配置文件加入如下设置:
<settings> <setting name="logImpl" value="LOG4J" /> </settings>
-
建立 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>
好了,今天先总结到这里。