`
Mr.Chris
  • 浏览: 83167 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MyBatis3新手上路

阅读更多

 

犹记得去年的这个时候,iBatis忽然声明迁移至Google Code,并改名为MyBatis。时已一载多,不怕众看官笑话,今天第一次试用MyBatis,缘由还是问答频道的一个问题

 

Hmmm…本文是分享给MyBatis初学者的。如果你是MyBatis老者,那建议不用去阅读下面的内容,也可提提建议、揪揪问题神马。J

 

MyBatis在配置和使用上,都发生了一定的变化。因为iBatis使用的较多,所以无论搭建MyBatis测试环境,还是使用MyBatis里面的一些API,都还算比较轻松。

 

闲话少说,本次测试使用的是MyBatis-3.0.1 + mybatis-spring-1.0.0-RC3进行测试的,并使用Maven (maven 2.1.x) 管理测试工程。

 

先说下为什么用mybatis-spring:由于目前Spring官方还没有出整合MyBatisAPI所以需要引入mybatis-sping这个工具包(该工具包是由MyBatis官方推出的)。

 

首先,我们使用Maven创建一个测试工程,Maven指令如下:

mvn archetype:create -DgroupId=com.shansun.mybatis -DartifactId=lb-ibatis-test

 

然后,我们在pom文件中添加mybatismybatis-spring的依赖。如下:

 

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.0.0-RC3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>
 

注意,这里我们额外还引入了mysqlcommons-dbcp这两个依赖,他们在数据库访问时会用到,否则会报类似"com.mysql.jdbc.Driver not found"的错误。

 

然后,我们再src/main/resources目录下新建一个配置文件mybatis-test-ds.xml,里面配置数据源、MapperConfigLocations等信息,具体内容如下:

<?xml version="1.0" encoding="GBK"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 
    <!-- 设置应用Spring注解扫描的包路径,我们后面的DAO会使用注解方式@Component配置Bean -->
    <context:component-scan base-package="com.shansun.mybatis.model"></context:component-scan>
 
    <!-- 设置数据源信息 -->
    <bean id="dataSourceImpl" class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <property name="driverClassName">
           <value>com.mysql.jdbc.Driver</value>
       </property>
       <property name="url">
           <value>jdbc:mysql://[数据库地址]:3306/[数据库名称]?characterEncoding=UTF-8</value>
       </property>
       <property name="username">
           <value>[用户名]</value>
       </property>
       <property name="password">
           <value>[密码]</value>
       </property>
    </bean>
   
    <!-- 设置MyBatis的SessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSourceImpl"/>
       <!-- 这里指定Mapper路径的配置信息 -->
       <property name="configLocation" value="classpath:ibatis/sqlMapConfig.xml"/>
    </bean> 
</beans>

  

同时,我们再于src/main/resources/ibatis/路径下新建上述配置文件中提到的sqlMapConfig.xml,这个文件时用于配置Mapper的路径的,这样处理的好处是方便mapper的统一管理。文件内容如下:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
       <mapper resource="ibatis/UserMapper.xml" />
    </mappers>
</configuration> 

  

观察上面这个文件,我们发现,在mappers中又指定了一个路径UserMapper.xml。没错,这个就是(动态)SQL语句等编写的地方。例如,我们要实现一个查询方法:根据用户编号(user_id)查询得到用户信息——用户名、性别、年龄等。

 

好了,到这里我们暂停一下,先不去关心UserMapper的内容。还是先说明下User表结构会对后文的理解有所帮助。User表结构如下:

字段名

类型

长度

备注

Id

Bigint

20

主键

User_id

Bigint

20

用户编号

User_nick

Varchar

20

用户昵称

Sex

Tinyint

1

性别:0-男,1-

Age

Tinyint

3

年龄

Gmt_create

Date

 

创建时间

Gmt_modified

Date

 

修改时间

 

在了解User表结构后,我们紧接着创建UserDO类,也就是Hibernate中所谓的Entity。创建DO的原则是与数据表一一对应。多说一句,DODAOMapper这些其实都可以借助abator工具自动生成代码。看下UserDO这个类:

package com.shansun.mybatis.model;
 
import java.util.Date;
 
public class UserDO {
    private Long id;
    private Long userId;
    private String userNick;
    private Byte sex;
    private Byte age;
    private Date gmtCreate;
    private Date gmtModified;
   
......setter/getter......
}

  

至此,我们了解了表结构并创建完Entity类后,我们再继续上面打断的内容,完成UserMapper.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.shansun.mybatis.model.UserMapper">
    <resultMap id="ibatorgenerated_BaseResultMap" type="com.shansun.mybatis.model.UserDO">
       <result column="id" property="id" jdbcType="BIGINT" />
       <result column="user_id" property="userId" jdbcType="BIGINT" />
       <result column="user_nick" property="userNick" jdbcType="BIGINT" />
       <result column="sex" property="sex" jdbcType="SMALLINT" />
       <result column="age" property="age" jdbcType="SMALLINT" />
       <result column="gmt_create" property="gmtCreate" jdbcType="TIMESTAMP" />
       <result column="gmt_modified" property="gmtModified" jdbcType="TIMESTAMP" />
    </resultMap>
   
    <sql id="commonColumns"> 
      id, user_id, user_nick, sex, age, gmt_create, gmt_modified
   </sql> 
 
    <select id="queryUserByUID" parameterType="Long"
       resultMap="ibatorgenerated_BaseResultMap">
       select <include refid="commonColumns"/>
       from user where user_id=#{userId} limit 1;
    </select>
</mapper>

  

个中的标签含义,我就不多介绍了,网上这些信息一搜一箩筐,而且比我介绍的要详细易懂。整个配置就完成了一个DB操作,即根据user_id查询用户信息,返回UserDO

 

配置方面的东东,我们都已经搞定了,下面可以编码实现上述提到的查询用户信息的DAO操作了。UserDAO及其实现类如下所示:

package com.shansun.mybatis.model;
 
public interface UserDAO {
    public UserDO queryUserByUID(Long userId);
}

  

package com.shansun.mybatis.model;
 
import org.mybatis.spring.support.SqlSessionDaoSupport;
@Component
public class UserDAOImpl extends SqlSessionDaoSupport implements UserDAO {
 
    @Override
    public UserDO queryUserByUID(Long userId) {
       return (UserDO) getSqlSession().selectOne("com.shansun.mybatis.model.UserMapper.queryUserByUID", userId);
    }
}

  

细心的你会主要到UserDAOImpl继承了SqlSessionDaoSupport,这样做的目的是方便获取sqlSession

 

好了,上述的DAO操作代码业已完成,我们编写测试的主方法吧(笔者很懒,没有做单元测试了)。

public class Main {
    public static void main(String[] args) {
       long userId = 198805;
       ApplicationContext aContext = new FileSystemXmlApplicationContext("classpath:ibatis-test-ds.xml");
       UserDAO userMapper = aContext.getBean(UserDAO.class);
       UserDO userDO = userMapper.queryUserByUID(userId);
       System.out.println(userDO.toString());
    }
}

  

嗯,测试下有没有查询到你期待已久的数据记录吧 J

 

本文源代码下载

 

 

By Mr.Chris

分享到:
评论
41 楼 jackyrong 2012-11-08  
zhongji 写道
Mr.Chris 写道
zhongji 写道
有个问题请教下:同一项目中MyBatis与ibatis能否共存??

有必要么?

项目前一段时间用ibatis,后续的开发可否用mybatis?


HI,你这边试验过mybatis,ibatis共存么
40 楼 yin_bp 2011-05-23  
zhongji 写道
Mr.Chris 写道
zhongji 写道
有个问题请教下:同一项目中MyBatis与ibatis能否共存??

有必要么?

项目前一段时间用ibatis,后续的开发可否用mybatis?


用bboss persistent吧,提供全套解决方案,详情参考文章:
http://www.iteye.com/wiki/bbossgroups/3092-mvc-bboss-config
39 楼 zhongji 2011-05-23  
Mr.Chris 写道
zhongji 写道
有个问题请教下:同一项目中MyBatis与ibatis能否共存??

有必要么?

项目前一段时间用ibatis,后续的开发可否用mybatis?
38 楼 Mr.Chris 2011-05-19  
zhongji 写道
有个问题请教下:同一项目中MyBatis与ibatis能否共存??

有必要么?
37 楼 zhongji 2011-05-19  
有个问题请教下:同一项目中MyBatis与ibatis能否共存??
36 楼 azheng270 2011-05-19  
复杂结果集 无法实现sql级别的分页,只能通过在全部记录集里分页

相当的被催
35 楼 yn5411 2011-05-18  
当初学习iBatis就是冲着它的动态SQL去的,但在实际的应用过程中却不如意,后来没办法,自己用velocity+dom4j写了一个动态SQL类(当然有些地方仿ibatis,如include、dynamic等),在项目中更加的灵活,对有些东西也不要太迷信了,当然,好的东西是要吸收的。
34 楼 Mr.Chris 2011-05-18  
andy20050125 写道
能否贴下代码,共享下。
我的配置如果SQL语句出错控制台连异常信息都不输出,只有JSP页面有异常。

刚看了下MyBatis的日志结构,如果要输出执行的sql(Executing SQL),只要做到在log4j.xml/log4j.properties里有
java.sql.PreparedStatement的logger配置并且保证log4j.xml/log4j.properties在classpath下即可。
可以参看下PreparedStatementLogger这个类,这个类代理了PreparedStatement,并且在execute、executeUpdate、executeQuery等方法执行前,输出executing sql的。
33 楼 mmBlue 2011-05-18  
我感觉在看2X,没看到3X的一个新特性,看看官方的文档吧。
32 楼 andy20050125 2011-05-18  
能否贴下代码,共享下。
我的配置如果SQL语句出错控制台连异常信息都不输出,只有JSP页面有异常。



Mr.Chris 写道
andy20050125 写道
楼主有没有配置过myBatis 的log4j 文件?
纠结了很长时间,没弄出来,报错时不显示SQL

刚才试了一下,是OK的,我的依赖包是:
<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.5.6</version>
		</dependency>

log4j.properties
# Rules reminder: 
# DEBUG < INFO < WARN < ERROR < FATAL 

# Global logging configuration 
log4j.rootLogger=INFO, stdout 

## Console output... 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  %5p %C: %m%n 

log4j.logger.org.apache.ibatis=DEBUG 
log4j.logger.java.sql=DEBUG 
log4j.logger.java.sql.Connection=DEBUG 
log4j.logger.java.sql.Statement=DEBUG 
log4j.logger.java.sql.PreparedStatement=DEBUG 
log4j.logger.java.sql.ResultSet=DEBUG 

31 楼 Mr.Chris 2011-05-18  
beitongmoming 写道
恩,看了这个贴子后觉得确实是新手上路啊.呵呵.....投新手贴是有原因的,至少我也会.就我的角度出发,说几点:

1.首先搂主给出的例子和代码明显是ibatis的风格.并不是mybatis.因为mybatis已经不建议使用DAO类(虽然楼主例子的名字叫mapper)了,而是Mapper接口.所以看到extends SqlSessionDaoSupport感到很怪,因为是在介绍Mybatis.
2.ibatis和mybatis在xml的映射配置变化很大,这也是mybatis区别与ibatis的重要特点之一.比如:1对1,1对多,解决N+1,多条件判断. 楼主的例子(最简单的select)一个都没涉及到,都是ibatis风格,所以没有mybatis特点.
3.我没用过spring,不知道spring是怎么管理session的. Mybatis明确指出每次操作要对session进行处理,但是又没有看到.
4.Mybatis对annotation支持.虽然我个人不是很喜欢这个,很乱.但是如果楼主把例子弄成 @Select ...... 至少也看到了mybatis的特点.(毕竟一个都没有嘛...)

综上所述,感觉是在介绍ibatis,不是mybatis.

呵呵 有道理啊。
本文主要还是偏向配置MyBatis的,而且确实有很多ibatis的风格,比如继承了SqlSessionDaoSupport。
至于MyBatis的新特性,呵呵,我本想就写个10 Minute Tutorial的。
And我也是MyBatis的新手,所以写出来也是让大家帮忙看有哪些误区、盲点神马的。
总之,很感谢你的批评和建议吧。
30 楼 beitongmoming 2011-05-18  
恩,看了这个贴子后觉得确实是新手上路啊.呵呵.....投新手贴是有原因的,至少我也会.就我的角度出发,说几点:

1.首先搂主给出的例子和代码明显是ibatis的风格.并不是mybatis.因为mybatis已经不建议使用DAO类(虽然楼主例子的名字叫mapper)了,而是Mapper接口.所以看到extends SqlSessionDaoSupport感到很怪,因为是在介绍Mybatis.
2.ibatis和mybatis在xml的映射配置变化很大,这也是mybatis区别与ibatis的重要特点之一.比如:1对1,1对多,解决N+1,多条件判断. 楼主的例子(最简单的select)一个都没涉及到,都是ibatis风格,所以没有mybatis特点.
3.我没用过spring,不知道spring是怎么管理session的. Mybatis明确指出每次操作要对session进行处理,但是又没有看到.
4.Mybatis对annotation支持.虽然我个人不是很喜欢这个,很乱.但是如果楼主把例子弄成 @Select ...... 至少也看到了mybatis的特点.(毕竟一个都没有嘛...)

综上所述,感觉是在介绍ibatis,不是mybatis.
29 楼 Mr.Chris 2011-05-18  
chat 写道
Mr.Chris 写道
chat 写道
from user where user_id=#userId# limit 1;

一看就是没有好好看mybatis文档,能跑起来才怪。
#userId#是ibatis2.×写法
#{userId}才是mybatis的写法

好吧 学到了 但是这么用这是OK的 不信你试试



这还用试?我用了半年了

谢谢chat的指点,我刚看了mybatis的源码,确实不再支持#name#的写法了。
在SqlSourceBuilder中,parse方法如下:
public SqlSource parse(String originalSql, Class parameterType) {
    ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType);
    GenericTokenParser parser = new GenericTokenParser("#{", "}", handler);
    String sql = parser.parse(originalSql);
    return new StaticSqlSource(configuration, sql, handler.getParameterMappings());
}
28 楼 chat 2011-05-18  
Mr.Chris 写道
chat 写道
from user where user_id=#userId# limit 1;

一看就是没有好好看mybatis文档,能跑起来才怪。
#userId#是ibatis2.×写法
#{userId}才是mybatis的写法

好吧 学到了 但是这么用这是OK的 不信你试试



这还用试?我用了半年了
27 楼 lgsun592 2011-05-18  
各位,麻烦帮忙解决下此问题:
http://topic.csdn.net/u/20110516/20/6eeb1cd8-ca01-4539-baf8-ddb1b45434f6.html
26 楼 lgsun592 2011-05-18  
我在做的时候,没有单独为Mybatis配置log4j,只是在我自己的文件中需要加入log输出,所以配置了log4j,但是在将log4j的log级别设为debug的时候,一样可以输出Mybatis的debug信息,当然包括sql
25 楼 yhonglieu 2011-05-18  
要想出日志,应该这么配置。
#mybatis
log4j.logger.com.ibatis=debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,Stdout
24 楼 Mr.Chris 2011-05-18  
andy20050125 写道
楼主有没有配置过myBatis 的log4j 文件?
纠结了很长时间,没弄出来,报错时不显示SQL

刚才试了一下,是OK的,我的依赖包是:
<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.5.6</version>
		</dependency>

log4j.properties
# Rules reminder: 
# DEBUG < INFO < WARN < ERROR < FATAL 

# Global logging configuration 
log4j.rootLogger=INFO, stdout 

## Console output... 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  %5p %C: %m%n 

log4j.logger.org.apache.ibatis=DEBUG 
log4j.logger.java.sql=DEBUG 
log4j.logger.java.sql.Connection=DEBUG 
log4j.logger.java.sql.Statement=DEBUG 
log4j.logger.java.sql.PreparedStatement=DEBUG 
log4j.logger.java.sql.ResultSet=DEBUG 
23 楼 andy20050125 2011-05-18  
andy20050125 写道
Mr.Chris 写道
andy20050125 写道
楼主有没有配置过myBatis 的log4j 文件?
纠结了很长时间,没弄出来,报错时不显示SQL

XML code
# Rules reminder:
# DEBUG < INFO < WARN < ERROR < FATAL

# Global logging configuration
log4j.rootLogger=INFO, stdout


## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  %5p %C: %m%n

log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

MyBatis的还没用过哦,但是你可以看看这个帖子—— 如何输出mybatis里的SQL?,或许对你有帮助哦……我明天去公司也试一下



纠结好几天了,还没弄出来,期待您的答复。


log4j-1.2.13.jar
commons-logging-1.1.1.jar
commons-logging-api-1.0.4.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar

这些jar 包都回进去了还是不行。
不报错时显示SQL,一报错就不显示SQL了, 而且报错时JSP 页面输出异常信息,控制台不输出异常信息。
同一个MyEclipse, 同一个Tomcat, 别的项目正常,就这个项目有问题,


applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<!--
    Copyright 2010 The myBatis Team

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:jdbc="http://www.springframework.org/schema/jdbc"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire="byName">

    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    	<property name="url" value="jdbc:oracle:thin:@**"/>
    	<property name="username" value="**"/>
    	<property name="password" value="**"/>
    	<property name="maxActive" value="150"/>
    </bean>
	 
    <!-- transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>    

    <!-- enable component scanning (beware that this does not enable mapper scanning!)   -->  
    <context:component-scan base-package="com.apeksys.qms.service" />
    
    <context:component-scan base-package="com.apeksys.qms.action" />
 
    <!-- enable autowire 
    <context:annotation-config /> -->

    <!-- enable transaction demarcation with annotations -->
    <tx:annotation-driven />
    
	<aop:aspectj-autoproxy/>
	
	<!-- propagration 表示事务传播特性, 使用required 时表示:当检测到以create开关的方法时先看有没有
						开启事务,如果开启事务则放进事务中去,如果没有则新建一个事务放进去;
		 read-only="true" 数据库的只读属性,当该方法在读时,其它方法不能再去写,保证一个事务的完整性;					
	  -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="create*" propagation="REQUIRED" read-only="true" rollback-for="Throwable"/>
			<tx:method name="update*" propagation="REQUIRED" read-only="true" rollback-for="Throwable"/>
			<tx:method name="delete*" propagation="REQUIRED" read-only="true" rollback-for="Throwable"/>
			<tx:method name="import*" propagation="REQUIRED" read-only="true" rollback-for="Throwable"/>
			<!-- 除了上面的方法,其它方法全部是只读  -->
			<tx:method name="*" read-only="true"/>
		</tx:attributes>
    </tx:advice>
    
    <aop:config proxy-target-class="true">
    	<!-- service 切入点 -->
    	<aop:pointcut  id="serviceMethods" expression="execution(* com.apeksys.qms.service.*.*(..))"/>
    	<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
    </aop:config>
    

    <!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
    </bean>

    <!-- scan for mappers and let them be autowired -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.apeksys.qms.mapper.dao" />
    </bean>
    <!-- 
    <bean id="rootService" class="com.apeksys.qms.service.RootService">
    	<constructor-arg index="0" ref="sysUserInfoService"/>
    </bean>
     -->
</beans>




web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<!-- 
		节点加载顺序	
		context-param > listener > filter > servlet   -->
	
	<display-name>Quanlity Management System</display-name>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- 
	<listener>
        <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>
    </listener>
     -->		

	<filter>
		<filter-name>loginFilter</filter-name>
		<filter-class>com.apeksys.qms.support.LoginFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>
	
	
	
	<servlet>
		<servlet-name>JSONRPCServlet</servlet-name>
		<servlet-class>com.metaparadigm.jsonrpc.JSONRPCServlet</servlet-class>
		<load-on-startup>2</load-on-startup> 
	</servlet>
	
	<servlet-mapping>
		<servlet-name>JSONRPCServlet</servlet-name>
		<url-pattern>/JSON-RPC</url-pattern>
	</servlet-mapping>	
 
	<taglib>
		<taglib-uri>/page</taglib-uri>
		<taglib-location>/WEB-INF/pageTag.tld</taglib-location>
	</taglib>
	 <!-- 
	<error-page>
		<exception-type>java.lang.Exception</exception-type>
		<location>/system/error.jsp</location>
	</error-page>
	
	<error-page>
		<error-code>404</error-code>
		<location>/system/error.jsp</location>
	</error-page>
	
	<error-page>
		<error-code>500</error-code>
		<location>/system/error.jsp</location>
	</error-page>
	 -->
	<welcome-file-list>
	  <welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

</web-app>



用到的Jar 包

aopalliance-1.0.jar
asm-3.1.jar
aspectjweaver-1.5.4.jar
cglib-2.2.jar
commons-beanutils-1.8.0.jar
commons-cli-2.0-SNAPSHOT.jar
commons-codec-1.3.jar
commons-collections-3.2.1.jar
commons-dbcp-1.3.jar
commons-fileupload-1.2.1.jar
commons-httpclient-3.0.1.jar
commons-io-1.3.2.jar
commons-lang-2.3.jar
commons-logging-api-1.0.4.jar
commons-pool-1.5.5.jar
ezmorph-1.0.3.jar
freemarker-2.3.16.jar
javassist-3.4.ga.jar
json-lib-2.1-jdk15.jar
jsonrpc-1.0.jar
jstl-1.2.jar
junit-3.8.1.jar
log4j-1.2.13.jar
mybatis-3.0.4.jar
mybatis-spring-1.0.0.jar
ognl-3.0.jar
org.springframework.aop-3.0.4.RELEASE.jar
org.springframework.asm-3.0.4.RELEASE.jar
org.springframework.aspects-3.0.4.RELEASE.jar
org.springframework.beans-3.0.4.RELEASE.jar
org.springframework.context-3.0.4.RELEASE.jar
org.springframework.context.support-3.0.4.RELEASE.jar
org.springframework.core-3.0.4.RELEASE.jar
org.springframework.expression-3.0.4.RELEASE.jar
org.springframework.jdbc-3.0.4.RELEASE.jar
org.springframework.test-3.0.4.RELEASE.jar
org.springframework.transaction-3.0.4.RELEASE.jar
org.springframework.web-3.0.4.RELEASE.jar
spring-tx-3.0.5.RELEASE.jar
struts2-convention-plugin-2.2.1.jar
struts2-core-2.2.1.jar
struts2-json-plugin-2.2.1.jar
struts2-junit-plugin-2.2.1.jar
struts2-spring-plugin-2.2.1.jar
xwork-core-2.2.1.jar
ojdbc15.jar
commons-logging-1.1.1.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
22 楼 andy20050125 2011-05-18  
Mr.Chris 写道
andy20050125 写道
楼主有没有配置过myBatis 的log4j 文件?
纠结了很长时间,没弄出来,报错时不显示SQL

XML code
# Rules reminder:
# DEBUG < INFO < WARN < ERROR < FATAL

# Global logging configuration
log4j.rootLogger=INFO, stdout


## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  %5p %C: %m%n

log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

MyBatis的还没用过哦,但是你可以看看这个帖子—— 如何输出mybatis里的SQL?,或许对你有帮助哦……我明天去公司也试一下



纠结好几天了,还没弄出来,期待您的答复。

相关推荐

Global site tag (gtag.js) - Google Analytics