Mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以 Mybatis 官方也推出了一个 Mybatis 代码生成工具的 jar 包.
首先要下载mybatis-generator-core-1.3.2-bundle.zip 文件,之后解压有两个文件夹
docs 是帮助文档目录; lib 目录是jar 包,需要 mybatis-generator-core-1.3.2.jar,将它拷贝到我们刚刚创建的
Java工程中;
按照 Mybatis generator 的 doc 文档参考,如:E:/jar/mybatis-generator-core-1.3.2/docs/configreference/xmlconfig.html
初步配置出了一个可以使用的版本,我把源代码也提供下载,Mybatis 代码生成工具,主要有一下功能:
- 生成 pojo 与 数据库结构对应
- 如果有主键,能匹配主键
- 如果没有主键,可以用其他字段去匹配
- 动态 select,update,delete 方法
- 自动生成接口(也就是以前的 dao 层)
- 自动生成 sql mapper,增删改查各种语句配置,包括动态 where 语句配置
- 生成 Example 例子供参考
具体的步骤:
配置 Mybatis 代码生成工具的配置文件
在用 Mybatis 代码生成工具之前,这些目录必须先创建好,作为一个好的应用程序,这些目录的创建也是有规律的。
(1)在创建的 Web 工程中,创建相应的 package 比如 :
(2)com.hlx.inter 用来存放 Mybatis 接口对象。
(3)com.hlx.mapper 用来存放 sql mapper 对应的映射,sql 语句等。
(4)com.hlx.model 用来存放与数据库对应的 model 。
(5)com.hlx.test
用来测试。
(a)根据 Mybatis 代码生成工具文档,需要一个配置文件,这里命名为:generatorConfiguration.xml
放在 src 目录下.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 配置oracle驱动jar包路径;这里是绝对路径 --> <classPathEntry location="E:\jar\ojdbc6.jar"/> <!-- 内容配置 --> <context id="hlx_oracle_tables" targetRuntime="MyBatis3"> <!-- 为了防止生成的代码中有很多注释,比较难看,加入下面的配置控制 --> <commentGenerator> <property name="suppressAllComments" value="true" /> <property name="suppressDate" value="true" /> </commentGenerator> <!-- 注释控制完毕 --> <!-- 数据库连接 --> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:HLX" userId="rent" password="aaa"> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 数据表对应的model 层 --> <javaModelGenerator targetPackage="com.hlx.model" targetProject="src"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- sql mapper 隐射配置文件 --> <sqlMapGenerator targetPackage="com.hlx.mapper" targetProject="src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 在ibatis2 中是dao层,但在mybatis3中,其实就是mapper接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.hlx.inter" targetProject="src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 要对那些数据表进行生成操作,必须要有一个 表 schema="rent" tableName="USERINFOS" 数据库表 domainObjectName="Userinfo" 对应的实体类 --> <table schema="rent" tableName="USERINFOS" domainObjectName="Userinfo"> </table> </context> </generatorConfiguration>
(b) 测试能否用
Mybatis 成生成刚刚创建的Userinfos表对应的
model,sql mapper 等内容.
package com.hlx.test; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.exception.InvalidConfigurationException; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; public class GeneratorTest { @Test public void test() { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; String genCfg = "/generatorConfiguration.xml"; File configFile = new File(GeneratorTest.class.getResource(genCfg).getFile()); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = null; try { config = cp.parseConfiguration(configFile); } catch (IOException e) { e.printStackTrace(); } catch (XMLParserException e) { e.printStackTrace(); } DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = null; try { myBatisGenerator = new MyBatisGenerator(config, callback, warnings); } catch (InvalidConfigurationException e) { e.printStackTrace(); } try { myBatisGenerator.generate(null); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
执行之后,记得刷新工程,即图示:
注意:另外生成的 sql mapper 等,只是对单表的增删改查,如果你有多表 join 操作,你就可以手动配置,如果调用存储过程,你也需要手工配置. 这时工作量已经少很多了。
如果你想用命令行方式处理,也是可以的。
比如:
java -jar mybatis-generator-core-1.3.2.jar -generatorConfiguration.xm -overwrite
这时,要用绝对路径才行. 另外 generatorConfiguration.xml 配置文件中 targetProject 的配置也必须是绝对路径
测试刚刚生成的代码:
mybatis.xml配置文件:
<?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> <!-- 引入 jdbc.properties 文件 --> <properties resource="jdbc.properties" /> <!-- (a) Userinfos实体类对应一个别名 _User --> <!-- 这就达到了一个简化实体类引用的目的。 --> <!-- <typeAliases> <typeAlias type="com.hlx.pojo.Userinfos" alias="_User" /> </typeAliases> --> <!-- (b) 上面这种方式单独为某一个实体类设置别名之外,我们还可以使用如下的方式批量为某个包下的所有实体类设置别名,如下: --> <!-- 为com.hlx.pojo包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名 比如com.hlx.pojo.Userinfos这个实体类的别名就会被设置成Userinfos --> <typeAliases> <package name="com.hlx.model.rent" /> </typeAliases> <!-- development : 开发模式 work : 工作模式 --> <environments default="development"> <environment id="development"> <!--配置事务管理,采用JDBC的事务管理 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 value属性值引用jdbc.properties配置文件中配置的值 --> <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 将mapper文件加入到配置文件中 --> <mappers> <mapper resource="com/hlx/mapper/rent/UserinfoMapper.xml" /> </mappers> </configuration>
测试类:
package com.hlx.test; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import com.hlx.inter.rent.UserinfoMapper; import com.hlx.model.rent.Userinfo; import com.hlx.util.MyBatisUtil; public class TestUserinfo { @Test public void list() { // 获得会话 SqlSession session = MyBatisUtil.getSqlSession(true); try { // shift+alt+Z 提示块 // 接口 UserinfoMapper uMapper = session.getMapper(UserinfoMapper.class); // 调用方法 List<Userinfo> list = uMapper.selectByExample(null); for (Userinfo userinfo : list) { System.out.println(userinfo); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭会话 session.close(); } } @Test public void add() { // 获得会话 SqlSession session = MyBatisUtil.getSqlSession(true); try { // 接口 UserinfoMapper uMapper = session.getMapper(UserinfoMapper.class); // 调用方法 int count = uMapper.insert(new Userinfo(10, "girl", "198033")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭会话 session.close(); } } }
效果: