Mybatis逆向工程
针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码
Maven导入依赖
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency>
如果生成的路径中有相同的文件,那么就会覆盖原来的文件,这样会有风险。所以开发中一般都会新建一个java工程来生成
逆向工程配置文件
mybatis逆向工程生成代码需要一个配置文件,然后mybatis会根据这个配置文件中的配置,生成相应的代码,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> <!--是否自动生成注解--> <property name="suppressAllComments" value="true"/> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="admin" password="admin"> </jdbcConnection> <!--默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析 为java.math.BigDecimal--> <javaTypeResolver> <property name="forceBigdEcimals" value="false"/> </javaTypeResolver> <!--targetProject:生成的PO类的位置--> <javaModelGenerator targetPackage="mybatis.domain" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\src"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!--targetPackage:mapper接口生成的位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.mapper" targetProject=".\src"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应,不能写错! --> <table tableName="user"></table> </context> </generatorConfiguration>
<?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> <!--是否自动生成注解--> <property name="suppressAllComments" value="true"/> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="admin" password="admin"> </jdbcConnection> <!--默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析 为java.math.BigDecimal--> <javaTypeResolver> <property name="forceBigdEcimals" value="false"/> </javaTypeResolver> <!--targetProject:生成的PO类的位置--> <javaModelGenerator targetPackage="mybatis.domain" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\src"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!--targetPackage:mapper接口生成的位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.mapper" targetProject=".\src"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应 --> <table tableName="user"></table> </context> </generatorConfiguration>
执行程序
package mybatis.reverse; 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; import java.io.File; import java.util.ArrayList; import java.util.List; public class GeneratorSqlmap { public void gernerator() throws Exception { List<String> warnings = new ArrayList<>(); boolean overwrite=true; File configFile = new File("generatorConfig.xml"); //这个是相对于工程目录 ConfigurationParser configParse = new ConfigurationParser(warnings); Configuration config = configParse.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings); myBatisGenerator.generate(null); } public static void main(String[] args){ GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap(); try { generatorSqlmap.gernerator(); } catch (Exception e) { e.printStackTrace(); } } }
多了一个东西,就是xxxExample.java
@Test public void testUserByCriteria(){ SqlSession sqlSession=null; try{ sqlSession = SqlSessionFactoryUtil.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserExample userExample = new UserExample(); UserExample.Criteria criteria = userExample.createCriteria(); criteria.andUsernameEqualTo("jim"); List<User> users = (List<User>) userMapper.selectByExample(userExample); System.out.println(users); }finally { if (sqlSession!=null) sqlSession.close(); } }
测试
@Test public void testUserByCriteria(){ SqlSession sqlSession=null; try{ sqlSession = SqlSessionFactoryUtil.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserExample userExample = new UserExample(); UserExample.Criteria criteria = userExample.createCriteria(); criteria.andUsernameEqualTo("jim"); List<User> users = (List<User>) userMapper.selectByExample(userExample); System.out.println(users); }finally { if (sqlSession!=null) sqlSession.close(); } }
问题:在Maven进行测试时,出现Invalid bound statement (not found)?
由于xml文件在编译的时候,不一定总能立即从源目录复制到class文件的编译目录,有时候源目录中的xml文件已经修改好,而class所在的目录里面还是旧的。因此真正确定有效的方式是将正确的xml文件复制到class输出目录。
Jenkins通过maven把项目打成war包,或者Eclipse通过使用maven命令tomcat7:deploy远程自动部署项目打成的war包,war包里面缺少Mapper对应的xml文件,就是没有把xml文件打包进去。解决办法是,在pom.xml文件中的build标签中添加如下代码,显示的强制将xml文件打到war包中:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
参考:
https://blog.csdn.net/eson_15/article/details/51694684
立志如山 静心求实
浙公网安备 33010602011771号