【躲坑】:
- 注意数据库中字段名(列名)要与实体类中的字段名(属性名)完全一致
- 解决办法:在逆向工程生成 pojo 后,
手动将 实体类的属性名+Mapper.xml的属性名 修改为完全一致
,避免 N 多映射问题。
即:数据库字段名
、实体类字段名
、前端页面标签中的 name 属性值
,三者必须完全一致。
原因:
数据库中使用小驼峰命名时,如 className,逆向工程生成 pojo 实体类属性名会变成 classname;
数据库中使用下划线命名时,如 class_name,逆向工程生成 pojo 实体类属性名会变成 className;
1. 概念
逆向工程,有的人也叫反求工程,英文是reverse engineering,大意是根据已有的东西和结果,通过分析来推导出具体的实现方法。
说白点,就是 生成指定代码
。
如 Mybatis 的逆向工程生成器,可以帮我们生成 pojo 实体类 + dao 接口 + dao 实现类 Mapper.xml
2. 官网入门
官方网站:http://mybatis.org/generator/
3. 开发步骤(简化)
3.1 创建 JavaEE 项目
其实 使用 JavaSE、或者 通过 Maven 创建 SpringMVC 的web工程也可以(pom导入依赖很方便),此处单独拷贝的 jar 包。
3.2 GeneratorSqlmap
唯一的一个 Java 文件,也是主要的代码生成文件。放在 src 下。无需修改
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 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;
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("src/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(); } } }
|
3.3 generatorConfig.xml
唯一的一个配置文件。放在 src 下。只需要修改 数据库名 + 指定数据表的名字(可以多个)即可
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| <?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/videos" userId="root" password="123456"> </jdbcConnection>
<javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver>
<javaModelGenerator targetPackage="com.demo.pojo" targetProject=".\src"> <property name="enableSubPackages" value="false" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="com.demo.dao" targetProject=".\src"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.dao" targetProject=".\src"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <table schema="" tableName="admin"></table> <table schema="" tableName="course"></table> <table schema="" tableName="speaker"></table> <table schema="" tableName="subject"></table> <table schema="" tableName="user"></table> <table schema="" tableName="video"></table>
</context> </generatorConfiguration>
|
3.4 log4j.properties
没啥说的,为了看日志。
1 2 3 4 5 6 7 8 9 10
| log4j.rootLogger=DEBUG, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
|
3.5 测试生成(图)
3.6 检查确认
检查实体类属性名是否与数据库的字段名完全一致,不一致时及时修改(实体类属性 + mapper.xml
)。
后续使用 lombok 注解生成实体类构造和方法、mybatis 映射、springMVC 映射页面 name 到控制器参数才可以正常。
4. text 大文本显示
当数据库中存在 text
类型的文本字段(非 VARCHAR)时,在逆向工程中生成的并没有进行属性映射,需要手动将该 result
标签放在 resultMap 映射中,才能生效。
如图: