`
Mr.Chris
  • 浏览: 84512 次
  • 性别: 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

分享到:
评论
21 楼 zeeler 2011-05-17  
我这里有个以前写的小笔记,或许对楼主有用哦:http://www.blogjava.net/javaren/archive/2010/09/27/mybatis_3_x_example.html
20 楼 Mr.Chris 2011-05-17  
chat 写道
from user where user_id=#userId# limit 1;

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

好吧 学到了 但是这么用这是OK的 不信你试试
19 楼 chat 2011-05-17  
from user where user_id=#userId# limit 1;

一看就是没有好好看mybatis文档,能跑起来才怪。
#userId#是ibatis2.×写法
#{userId}才是mybatis的写法
18 楼 Mr.Chris 2011-05-17  
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?,或许对你有帮助哦……我明天去公司也试一下
17 楼 andy20050125 2011-05-17  
楼主有没有配置过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
16 楼 yin_bp 2011-05-17  
Java_大猫 写道
ibatis 的 动态SQL还是很无敌的


你可以看看bbossgroups项目中的动态sql语句,那才是真真无敌的动态sql呢,呵呵
15 楼 Mr.Chris 2011-05-17  
不出意外的被投了新手和隐藏 哎……
14 楼 walldr2161 2011-05-17  
苍老师。。。????
13 楼 Mr.Chris 2011-05-17  
Java_大猫 写道
ibatis 的 动态SQL还是很无敌的

那是他的优势啊。
12 楼 Java_大猫 2011-05-17  
ibatis 的 动态SQL还是很无敌的
11 楼 Mr.Chris 2011-05-17  
caoyangx 写道
yunzhu 写道
Mr.Chris 写道
zxmlgh 写道
楼主,你换个头像吧。一看你这帖,血气顿时方刚起来了

哈哈 要的就是这效果哦


血气方刚,无心看贴啊

那就看看我的头像吧;
ibatis的xml简直就是折磨人,还美其名曰方便DBA调试。不如让DBA直接看SQL日志来的快。


方便DBA调试?没听过哦。但话说回来,DBA一般都比较不喜欢iBatis的动态SQL,因为不好控制,尤其是那些个万能SQL。
10 楼 caoyangx 2011-05-17  
yunzhu 写道
Mr.Chris 写道
zxmlgh 写道
楼主,你换个头像吧。一看你这帖,血气顿时方刚起来了

哈哈 要的就是这效果哦


血气方刚,无心看贴啊

那就看看我的头像吧;
ibatis的xml简直就是折磨人,还美其名曰方便DBA调试。不如让DBA直接看SQL日志来的快。
9 楼 yunzhu 2011-05-17  
Mr.Chris 写道
zxmlgh 写道
楼主,你换个头像吧。一看你这帖,血气顿时方刚起来了

哈哈 要的就是这效果哦


血气方刚,无心看贴啊
8 楼 Mr.Chris 2011-05-17  
zxmlgh 写道
楼主,你换个头像吧。一看你这帖,血气顿时方刚起来了

哈哈 要的就是这效果哦
7 楼 zxmlgh 2011-05-17  
楼主,你换个头像吧。一看你这帖,血气顿时方刚起来了
6 楼 Mr.Chris 2011-05-17  
theoffspring 写道
mybatis支持表达式语言了,使用起来比2要方便得多,另外,听说还支持拦截器了,比如某个dao 方法执行时候你想做点别的事,这时候就可以用拦截器了,很牛的功能。我自己玩的时候都用mybatis

嗯 还是你了解的多 公司现在还统一用的是ibatis2.3
回头读读MyBatis的reference看看有哪些变化
5 楼 theoffspring 2011-05-17  
mybatis支持表达式语言了,使用起来比2要方便得多,另外,听说还支持拦截器了,比如某个dao 方法执行时候你想做点别的事,这时候就可以用拦截器了,很牛的功能。我自己玩的时候都用mybatis
4 楼 Mr.Chris 2011-05-17  
akunamotata 写道
MyBatis上手比较容易...喜欢简单的框架

嗯 我前天用了一次,感觉很不错 叫ibatis2有不少积极的变化,另外还增强了约束大于配置的思想
3 楼 akunamotata 2011-05-17  
MyBatis上手比较容易...喜欢简单的框架
2 楼 Mr.Chris 2011-05-17  
47478220 写道
准备学习iBatis

这里主要介绍的是MyBatis如何上手,和iBatis还是有些不同之处,:)

相关推荐

    MyBatis3官方中文文档

    MyBatis是一款流行的Java持久层框架,它的设计理念是通过简单的XML或注解用于配置和映射原始类型、接口和Java POJOs(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。MyBatis可以与各种数据库交互,...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    在MyBatis中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至关重要的DTD(Document Type Definition)文件,它们定义了MyBatis配置文件和映射文件的结构和规则。 首先,让我们深入了解一下`mybatis-3...

    MyBatis3 教程 中文版

    MyBatis3 是一款流行的Java持久层框架,它简化了数据库操作,使开发人员能够将SQL语句直接集成到XML映射文件或Java代码中,实现了数据访问对象(DAO)与业务逻辑的解耦。本教程旨在深入讲解MyBatis3的核心概念、配置...

    MyBatis3入门到精通教程

    MyBatis3是一款深受开发者喜爱的持久层框架,它提供了灵活的SQL映射和对象关系映射功能,使得Java开发人员能够方便地处理数据库操作。本教程旨在带你从零开始,逐步掌握MyBatis3的核心概念和技术,实现数据库操作的...

    mybatis3.x源码深度解析与最佳实践.pdf

    MyBatis 3.x 源码深度解析与最佳实践 MyBatis 是当前最流行的 Java 持久层框架之一,其通过 XML 配置的方式消除了绝大部分 JDBC 重复代码以及参数的设置,结果集的映射。为了更好地学习和理解 MyBatis 背后的设计...

    mybatis-3-mybatis-3.5.8.zip源码

    在mybatis-3-mybatis-3.5.8.zip源码中,我们可以深入理解MyBatis的工作原理和设计模式。这个版本的MyBatis包含以下几个主要模块: 1. **SqlSessionFactoryBuilder**: 用于构建SqlSessionFactory,它是MyBatis的核心...

    mybatis3 中文手册

    mybatis3 中文手册, 官方版本,mybatis入门必读

    Mybatis3_API Word版

    mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架...

    mybatis练习3mybatis练习3mybatis练习3mybatis练习3

    mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...

    mybatis-3-mybatis-3.2.6

    3. **SqlSessionFactory**:这是MyBatis的核心,用于创建SqlSession实例。SqlSessionFactory是线程安全的,可以长期保存,多次重复使用。 4. **SqlSession**:SqlSession代表数据库的一次会话,可以执行SQL命令和...

    mybatis3 jar

    mybatis3 jar mybatis3 jar mybatis3 jar

    MyBatis 3 用户指南中文英文

    MyBatis 3 是一款流行的Java持久层框架,它提供了灵活的映射机制,使得数据库操作与对象模型之间能够高效地进行数据交换。本用户指南包括了中文和英文两个版本,帮助开发者深入理解和使用MyBatis 3。 一、MyBatis...

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你放dtd文件的位置例如:‪D:\mybatis\mybatis-3-config.dtd)-&gt;Key(如果更改config,此处应该是:-//...

    Mybatis3Demo

    Mybatis3Demo是一个示例项目,它展示了Mybatis3框架的各种使用方式。Mybatis3是一个优秀的持久层框架,它简化了Java开发中的数据库操作,通过XML或注解方式配置,可以将SQL语句与Java代码紧密集成,提供更加灵活的...

    mybatis-3-mapper.dtd文件下载

    在 Mybatis 中,`mybatis-3-mapper.dtd` 文件扮演着至关重要的角色,它是 Mybatis 映射器接口的定义文件,用于验证 XML 映射文件的语法正确性。 `mybatis-3-mapper.dtd` 文件是基于 DTD(Document Type Definition...

    MyBatis3 教程 中文完整版

    MyBatis3是一款深受开发者喜爱的轻量级Java持久层框架,它简化了数据库操作,提供了灵活的SQL映射机制,使得开发人员可以更方便地处理数据库查询、更新等任务。这个“MyBatis3 教程 中文完整版”包含的PDF文件,将为...

Global site tag (gtag.js) - Google Analytics