犹记得去年的这个时候,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官方还没有出整合MyBatis的API所以需要引入mybatis-sping这个工具包(该工具包是由MyBatis官方推出的)。
首先,我们使用Maven创建一个测试工程,Maven指令如下:
mvn archetype:create -DgroupId=com.shansun.mybatis -DartifactId=lb-ibatis-test
然后,我们在pom文件中添加mybatis及mybatis-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>
注意,这里我们额外还引入了mysql,commons-dbcp这两个依赖,他们在数据库访问时会用到,否则会报类似"com.mysql.jdbc.Driver not found"的错误。
然后,我们再src/main/resources目录下新建一个配置文件mybatis-test-ds.xml,里面配置数据源、Mapper的ConfigLocations等信息,具体内容如下:
<?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的原则是与数据表一一对应。多说一句,DO、DAO、Mapper这些其实都可以借助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
1014

被折叠的 条评论
为什么被折叠?



