本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码:
一、构建一个环境:
1. 首先创建一个表:
Sql代码
1. CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
2. 然后注入数据
Sql代码
1. insert into pet values('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', null);
2. insert into pet values('Claws', 'Gwen', 'cat', 'm', '1994-03-17', null);
3. insert into pet values('Buffy', 'Harold', 'dog', 'f', '1989-05-13', null);
4. insert into pet values('Fang', 'Benny', 'dog', 'm', '1990-08-27', null);
5. insert into pet values('Bowser', 'Diane', 'dog', 'm', '1979-08-31', '1995-07-29');
6. insert into pet values('Chirpy', 'Gwen', 'bird', 'f', '1998-09-11', null);
7. insert into pet values('Whistler', 'Gwen', 'bird', null, '1997-12-09', null);
8. insert into pet values('Slim', 'Benny', 'snake', 'm', '1996-04-29', null);
注:这里的sql例子来自 http://dev.mysql.com/doc/refman/5.5/en/creating-tables.html
3. 在 Mybatis 主页 http://code.google.com/p/mybatis/ 上下载 Mybatis mybatis-generator-core [本文使用的是 1.3.0 版本]。当然运行 mybatis-generator 生成的代码还需要下载 mybatis 的 jar 包[本例使用的是 3.0.2 版本],和相关数据库的 jdbc [本文中使用的是MySql的jdbc] 。
二、运行 mybatis-generator
1. 要运行 generator ,需要给 generator 提供一个配置文件,指定其生成的数据库的相关信息。
以下是一个示例:
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE generatorConfiguration
3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
5.
6. <generatorConfiguration>
7. <classPathEntry location="mysql-connector-java-5.1.6-bin.jar" />
8.
9. <context id="DB2Tables" targetRuntime="MyBatis3">
10.
11. <commentGenerator>
12. <property name="suppressDate" value="true" />
13. </commentGenerator>
14.
15. <jdbcConnection driverClass="com.mysql.jdbc.Driver"
16. connectionURL="jdbc:mysql://localhost/test" userId="qgd" password="123456">
17. </jdbcConnection>
18.
19. <javaTypeResolver>
20. <property name="forceBigDecimals" value="false" />
21. </javaTypeResolver>
22.
23. <javaModelGenerator targetPackage="test.model"
24. targetProject="../src/main/java">
25. <property name="enableSubPackages" value="true" />
26. <property name="trimStrings" value="true" />
27. </javaModelGenerator>
28.
29. <sqlMapGenerator targetPackage="test.dao"
30. targetProject="../src/main/java">
31. <property name="enableSubPackages" value="true" />
32. </sqlMapGenerator>
33.
34. <javaClientGenerator type="XMLMAPPER"
35. targetPackage="test.dao" targetProject="../src/main/java">
36. <property name="enableSubPackages" value="true" />
37. </javaClientGenerator>
38.
39. <table tableName="pet" domainObjectName="Pet">
40. </table>
41.
42. </context>
43. </generatorConfiguration>
这个配置文件提供了 mybatis-generator所需要的参数信息:
* 其中classPathEntry 是引用的jdbc的类路径,这里将jdbc jar和generator的jar包放在一起了;
* commentGenerator 是用来除去时间信息的,这在配合类似subversion的代码管理工具时使用很有效,因为可以减少没有必要的注释迁入;
* jdbcConnection是指定的jdbc的连接信息;
* javaTypeResolver式类型转换的信息,这里并没有用到;
* javaModelGenerator是模型的生成信息,这里将指定这些Java model类的生成路径;
* sqlMapGenerator是mybatis 的sqlMapper XML文件的生成信息,包括生成路径等;
* javaClientGenerator是应用接口的生成信息;
* table是用户指定的被生成相关信息的表,它必须在指定的jdbc连接中已经被建立。
2. mybatis-generator 有多种运行方式,最简单的就是命令行的方式,只需要指定相应的配置文件的路径即可:
Java代码
1. java -jar mybatis-generator-core-1.3.0.jar -configfile ../src/main/resource/config.xml -overwrite
运行后生成的代码包括模型类 test.model.Pet 和 test.model.PetExample , test.dao.PetMapper 接口以及其相对应的 xml 映射文件,在这里就不在赘述了。
三、使用 mybatis-generator 生成的代码
1. 现在我们要利用这些生成的代码,首先我们需要一个关于所有映射的配置文件。需要我们手写如下:【不知道为什么generator没有选择自动生成这个文件,毕竟这些信息generator都可以得到】
Xml代码
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE configuration
3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
5. <configuration>
6. <environments default="development">
7. <environment id="development">
8. <transactionManager type="JDBC" />
9. <dataSource type="POOLED">
10. <property name="driver" value="com.mysql.jdbc.Driver" />
11. <property name="url" value="jdbc:mysql://localhost/test" />
12. <property name="username" value="qgd" />
13. <property name="password" value="123456" />
14. </dataSource>
15. </environment>
16. </environments>
17. <mappers>
18. <mapper resource="test/dao/PetMapper.xml" />
19. </mappers>
20. </configuration>
2. 另外还要使用然后我们还需要一个Main示例方法来调用这些已生成的代码:
Java代码
1. package test;
2.
3. import java.io.Reader;
4. import java.util.List;
5.
6. import org.apache.ibatis.io.Resources;
7. import org.apache.ibatis.session.SqlSession;
8. import org.apache.ibatis.session.SqlSessionFactory;
9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10.
11. import test.dao.PetMapper;
12. import test.model.Pet;
13. import test.model.PetExample;
14.
15. public class Test {
16.
17. public static void main(String[] args) throws Exception {
18. String resource = "MapperConfig.xml";
19. Reader reader = Resources.getResourceAsReader(resource);
20. SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
21. SqlSession sqlSession = sqlMapper.openSession();
22.
23. PetExample pet = new PetExample();
24. pet.or().andDeathIsNotNull();
25. try {
26. PetMapper mapper = sqlSession.getMapper(PetMapper.class);
27. List<Pet> allRecords = mapper.selectByExample(pet);
28. for (Pet s : allRecords)
29. System.out.println(s);
30. } finally {
31. sqlSession.close();
32. }
33. }
34. }
这样就可以打印出相应的查询结果信息了。
四、小结
该示例的完整的Eclipse工程见附件mybatis-generator-usage.zip,其中已经包含了示例需要使用的jar包。
本文中只是用到了mybatis-generator 的一部分功能,mybatis-generator 生成代码的方式还包括ant或Maven脚本,或者直接使用java API生成;另外通过修改配置文件,generator还可以指定表的生成细节,并可以添加插件。其功能文档在generator的分发包的doc文件夹 下有更详细的介绍。
这里使用的表示没有主键的表,针对有一个主键或多个主键的表,mybatis-generator的生成的内容也有所不同,感兴趣的读者可以自行试验一下。
本文将简要介绍怎样利用Spring 整合 Mybatis Generator自动生成的代码:
关于Mybatis Generator自动生成怎样自动生成代码,请参考这篇文章:使用Mybatis Generator自动生成Mybatis相关代码 ,本篇文章将接着上一篇文章的例子继续。
一、准备环境
1. 下载jar包:首先要在Mybatis网站中下载相应的 jar包mybatis-spring-1.0.0-RC2-bundle.zip http://code.google.com/p/mybatis/downloads/list?can=3&q=Product%3DSpring
另外当然还需要Spring的jar包,本文中用到版本的是3.0.4
2. 添加jar包:要使用mybatis-spring-1.0.0-RC1.jar,除了要在构建路径上添加jdbc包、Mybatis的包外,还需要添加 Spring的asm, beans, context, core, expression, jdbc, transaction这几个包,当然还要包括apache-commons-logging。
二、运行 mybatis-generator
为了方便运行,在本示例中将Mybatis Generator的代码生成用ant脚本的方式给出:
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <project default="genfiles" basedir=".">
3. <target name="genfiles" description="Generate the files">
4. <taskdef name="mbgenerator" classname="org.mybatis.generator.ant.GeneratorAntTask"
5. classpath="mybatis-generator-core-1.3.0.jar" />
6. <mbgenerator overwrite="true" configfile="src/main/resource/config.xml"
7. verbose="false">
8. </mbgenerator>
9. </target>
10. </project>
不过在运行示例时请修改config.xml中jdbc jar包的位置 ,因为示例中使用的是绝对路径,而没有成功的转成相对路径,若有谁成功的转成相对路径的话,请留言相教,谢谢。
三、使用 mybatis-generator 生成的代码
在使用Mybatis Generator自动生成Mybatis相关代码 的文章中,我还不明白为什么要手写一个关于所有映射的配置文件。使用Spring后我知道了,原来在Spring中使用mybatis-generator 生成的代码,根本就不需要这个配置文件,只要在Spring的context文件中配置相应的信息即可。
下面是context配置示例:
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns:context="http://www.springframework.org/schema/context"
5. xsi:schemaLocation="
6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
8. default-autowire="byName">
9.
10. <bean
11. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
12. <property name="locations" value="classpath:datasource.properties" />
13. </bean>
14.
15. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
16. <property name="driverClassName" value="${jdbc.driverClassName}" />
17. <property name="url" value="${jdbc.url}" />
18. <property name="username" value="${jdbc.username}" />
19. <property name="password" value="${jdbc.password}" />
20. </bean>
21.
22. <bean id="transactionManager"
23. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
24. <property name="dataSource" ref="dataSource" />
25. </bean>
26.
27. <!-- beware that mapper-config.xml is not needed if you use injected mappers -->
28. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
29. <!-- <property name="configLocation" value="classpath:MapperConfig.xml" /> -->
30. <property name="dataSource" ref="dataSource" />
31. </bean>
32.
33. <bean id="petMapper1" class="org.mybatis.spring.MapperFactoryBean">
34. <!-- SqlSessionFactory property is autowired -->
35. <property name="mapperInterface" value="test.dao.PetMapper" />
36. </bean>
37.
38. </beans>
可以看到sqlSessionFactory bean中的configLocation属性被注释掉了,不过丝毫不影响对相应dao接口的使用。我们只需要编写下面的几行代码就已达到上篇文章示例中的相同效果:
Java代码
1. package test;
2.
3. import org.springframework.context.ApplicationContext;
4. import org.springframework.context.support.ClassPathXmlApplicationContext;
5.
6. import test.dao.PetMapper;
7. import test.model.PetExample;
8.
9. public class Test {
10.
11. public static void main(String[] args) {
12. ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
13. PetExample pet = new PetExample();
14. pet.or().andDeathIsNotNull();
15. PetMapper map = (PetMapper) context.getBean("petMapper1");
16. System.out.println(map.selectByExample(pet));
17. }
18. }
这里的给出的例子是结合Mybatis Generator自动生成的代码尽量少的手写代码的例子,但是灵活性上可能有不足。Mybatis的网站上提供了另外三种结合Spring使用的示例, 详见 http://code.google.com/p/mybatis/source/browse/#svn/sub-projects/mybatis-spring/trunk/src/test 这里就不再赘述了。
四、小结
该示例的完整的Eclipse工程见附件mybatis-generator-usage2.zip,其中已经包含了示例需要使用的jar包。