分析数据库中数据表,自动生成JavaBean(与数据库表对应的实体类)、dao 接口(数据访问层接口,定义了访问数据的方法)、SQLMap (sql 语句映射文件,与dao层接口类一一对应)
该配置文件定义了如何生成这些代码,详细说明可看代码注释。
<?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> <!-- 在maven中配置了依赖这个就可以注释掉了--> <!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />--> <context id="DB2Tables" targetRuntime="MyBatis3"> <!--数据库连接信息--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://10.10.10.10:3306/meeting?useUnicode=true&characterEncoding=utf-8&serverTimezone=CTT" userId="root" password="root"> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--JavaBean 实体类--> <javaModelGenerator targetPackage="top.crxk.MyBatisGenerator.entity" targetProject="./src/main/java"> <property name="enableSubPackages" value="false" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--SQL映射文件--> <sqlMapGenerator targetPackage="mapping" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!--Mapper接口--> <javaClientGenerator type="XMLMAPPER" targetPackage="top.crxk.MyBatisGenerator.dao" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!--配置所要生成代码的表--> <table schema="DB2ADMIN" tableName="task" domainObjectName="Task" > </table> </context> </generatorConfiguration>
用于配置生成的代码要放在哪个包里面, 这个如果没有的话Mybatis Generator会自动创建。
官方定义是
This is used to specify a target project for the generated objects.
用最直白的语句解释就是:targetPackage所在的目录,也就是targetPackage的父目录。
这个目录是一定要有的,如果没有的话Mybatis generator不会自动创建。
这里的路径可以写绝对路径,也可以写相对路径,相对路径是相对于这个xml配置文件的!
最坑的一点:
关于为什么Mybatis generator程序运行成功以后,并没有代码文件生成的问题,是因为:
mac和windows有些不一样
mac下路径要这样写./src
windows下的路径是这样写.src
这个是很坑的,mbg不会给出错误提示!
Mybatis Generator官方提供了很多种方式来生成代码,但最好用最灵活的是直接写一段Java代码,读取配置文件,来生成目标代码。
package top.crxk.MyBatisGenerator; 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 TestMbg { public static void main(String[] args) throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; // 从这里加载配置文件,此时要注意路径 // 其他的代码不用动,直接运行即可 File configFile = new File("mbg.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); } }
Mybatis Generator生成的代码提供了非常强大的对于单表的 增删改查的操作。
每一个表mbg会生成四个文件,以task表为例,分别是
使用 TaskExample.java 这个类可动态地定义出各种条件查询子句,满足对于单个表的各种增删改查的操作,如果不涉及到其他的表,基本上不用和其他文件打交道了。
举个例子:
@Controller @ResponseBody @RequestMapping("/test") public class testMbgController { @Autowired TaskMapper taskMapper; @Autowired TaskExample taskExample; @RequestMapping("/countByExample") public long countByExample(int id) { taskExample.or().andIdEqualTo(id); return taskMapper.countByExample(taskExample); } @RequestMapping("/selectByExample") public List<Task> selectByExample() { taskExample.or().andIdEqualTo(12); return taskMapper.selectByExample(taskExample); } }
TaskExample.Criteria 主要就是定义各种查询条件的,是TaskExample的核心。
taskExample.or()
调用taskExample的or()方法,会返回一个Criteria,Criteria定义了与数据表中各个字段相关的方法,调用这些方法来设置条件,可以链式调用以添加多个条件。
taskExample.or().andIdEqualTo(12).andDeviceIdIsNull();
所包含的条件