首页 > 开发 > 综合 > 正文

mybatis逆向工程

2024-07-21 02:51:22
字体:
来源:转载
供稿:网友

1.什么是逆向工程?

mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码:(mapper.java,mapper.xml、po..) 建议:企业实际开发中,常用的逆向工程方式,由于数据库的表生成java代码。

2.使用方法

根据官网介绍有一下几种使用方法: Running MyBatis Generator

MyBatis Generator (MBG) can be run in the following ways: From the command PRompt with an XML configuration

As an Ant task with an XML configurationAs a Maven PluginFrom another Java program with an XML configurationFrom another Java program with a Java based configuration

除了上面的方法还还可以使用eclipse插件的方式. 建议:使用java程序方式,不依赖开发工具。 这里逆向工程中用的方法是上面提到的 From another Java program with an XML configuration. 这里写图片描述 此处只用到了generatorConfig.xml文件.

generatorConfig.xml配置详情:

<?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> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.MySQL.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" passWord="root"> </jdbcConnection> <!-- 连接Oracle数据库的信息 --> <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> --> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="cn.com.yves.model" targetProject="./src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="cn.com.yves.mapper" targetProject="./src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.com.yves.mapper" targetProject="./src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table tableName="items" domainObjectName="ItemsModel"></table> <table tableName="orders" domainObjectName="OrdersModel"></table> <table tableName="orderdetail" domainObjectName="OrderdetailModel"></table> <table tableName="user" domainObjectName="UserModel"></table> <table tableName="user_stringkey" domainObjectName="User_stringkeyModel"> </table> <!-- <table schema="" tableName="sys_user"></table> <table schema="" tableName="sys_role"></table> <table schema="" tableName="sys_permission"></table> <table schema="" tableName="sys_user_role"></table> <table schema="" tableName="sys_role_permission"></table> --> <!-- 有些表的字段需要指定java类型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context></generatorConfiguration>

GeneratorSqlmap.java文件:

package cn.com.yves;import java.io.File;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;/** * java代码+ xml配置文件自动生成mapper.xml和mapper.java,以及po * * @author Yves He * */public class GeneratorSqlmap { public void generator() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; // 指定 逆向工程配置文件 File configFile = new File( "D://git//mybatisgeneration//generationConfig//generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } public static void main(String[] args) throws Exception { try { GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } }}

SqlMapconfig.xml配置内容:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 一般配置: 1.运行环境 2.数据源 3.事务 --><configuration> <!--全局属性配置:除了加载db.properties 中的属性,还可以自己配置一些属性 --> <properties resource="db.properties"> </properties> <!-- 全局配置参数,影响mybatis的性能 --> <!-- <settings> --> <!-- <setting name="" value=""/> --> <!-- </settings> --> <!-- 类型别名 --> <typeAliases> <!-- 单个别名定义 --> <!-- <typeAlias alias="user" type="cn.com.yves.model.UserModel" /> --> <!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) --> <package name="cn.com.yves.model" /> </typeAliases> <!-- 类型处理器 --> <!-- <typeHandlers> --> <!-- </typeHandlers> --> <!-- 对象工程 --> <!-- <objectFactory type=""> --> <!-- </objectFactory> --> <!-- 插件 --> <!-- <plugins></plugins> --> <!-- 环境集合属性对象 (和spring整合后 environments配置将废除) --> <environments default="development"> <!-- 环境子属性对象 --> <environment id="development"> <!-- 事务管理 (使用jdbc事务管理,事务控制由mybatis控制) --> <transactionManager type="JDBC" /> <!-- 数据源 (数据库连接池 ,暂时由mybatis管理) --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 映射器(加载映射文件):我这里由于是mapper.xml和mapper.java是在同一目录下,采用扫描包的方式注入映射文件 --> <mappers> <!-- 这里特别注意:是路径符号,不是转义符号 --> <package name="cn/com/yves/mapper" /> </mappers></configuration>

自动生成的Mapper接口测试

学会使用mapper自动生成的增、删、改、查方法。

/** * Filename: ItemsMapperTest.java * Copyright: Copyright (c)2016 * Company: Yves * @version: 1.0 * Create at: 2017-3-4 上午9:49:20 * Description: * * Author Yves He */package cn.com.yves.mapper;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import cn.com.yves.model.ItemsModel;import cn.com.yves.model.ItemsModelExample;import cn.com.yves.model.ItemsModelExample.Criteria;//测试类中的测试方法都会执行public class ItemsModelMapperTest { private SqlSessionFactory sqlSessionFactory; // 测试方法之前执行 @Before public void setUp() throws Exception { String mybatisConfigPath = "SqlMapConfig.xml"; InputStream inputStream = Resources .getResourceAsStream(mybatisConfigPath); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 查询数量: @Test public void testCountByExample() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModelExample example = new ItemsModelExample(); Criteria criteria = example.createCriteria(); criteria.andNameLike("%iPhone%"); int count = mapper.countByExample(example); session.close(); } // 删除byprimaryKey @Test public void testDeleteByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); mapper.deleteByPrimaryKey(4); session.commit(); session.close(); } // 新增,全量更新(这里要注意数据库中不能为空的列明,否则更新时会出错) @Test public void testInsert() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = new ItemsModel(); // iModel.setId(id); //如果id在数据中设置了自动增长,这里不需要设定id的值,设置了也不会生效 iModel.setName("iPhone6s"); iModel.setPrice(4800f); iModel.setCreatetime(new Date()); mapper.insert(iModel); session.commit(); session.close(); } // 查询:自定义条件查询(用得最多),这里类似那种自己封装的filterBean来过滤查询条件 @Test public void testSelectByExample() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); /* 创造过滤条件 */ ItemsModelExample example = new ItemsModelExample(); // 通过criteria来构造条件 Criteria criteria = example.createCriteria(); criteria.andNameEqualTo("笔记本"); List<ItemsModel> listResult = mapper.selectByExample(example); session.close(); System.out.println(listResult); } // 查询: 通过primaryKey查询单条记录 @Test public void testSelectByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = mapper.selectByPrimaryKey(1); session.close(); System.out.println(iModel); } // 更新:字段不为null就更新,通常在批量更新的时候使用此方法(因为每条纪录要更新的内容可以能不相同) @Test public void testUpdateByPrimaryKeySelective() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = new ItemsModel(); iModel.setId(1); iModel.setCreatetime(new Date()); mapper.updateByPrimaryKeySelective(iModel); session.commit(); session.close(); } // 更新:全量更新 @Test public void testUpdateByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); // 全量查询的切记要先查询出原来的数据在做更新 ItemsModel itemsModel = mapper.selectByPrimaryKey(1); itemsModel.setName("yves"); mapper.updateByPrimaryKey(itemsModel); session.commit(); session.close(); }}

逆向工程注意事项

1.单独生成代码后,再拷贝到工程,而不是直接在工程中生成. XXXMapper.xml文件已经存在时,如果进行重新生成则mapper.xml文件内容不被覆盖而是进行内容追加,结果导致mybatis解析失败。 解决方法:删除原来已经生成的mapper xml文件再进行生成。 Mybatis自动生成的po及mapper.java文件不是内容而是直接覆盖没有此问题。2.关于针对oracle数据库表生成代码的schema问题 Schma即数据库模式,oracle中一个用户对应一个schema,可以理解为用户就是schema。 当Oralce数据库存在多个schema可以访问相同的表名时,使用mybatis生成该表的mapper.xml将会出现mapper.xml内容重复的问题,结果导致mybatis解析错误。 解决方法:在table中填写schema,如下: <table schema="XXXX" tableName=" " > XXXX即为一个schema的名称,生成后将mapper.xml的schema前缀批量去掉,如果不去掉当oracle用户变更了sql语句将查询失败。 快捷操作方式:mapper.xml文件中批量替换:“from XXXX.”为空 Oracle查询对象的schema可从dba_objects中查询,如下: select * from dba_objects

心得: 如果要做代理开发,加载mapper.xml映射文件时采用扫描包的方法,在自动生成mapper.java和mapper.xml时要配置在同一目录下,且文件名相同.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表