学习Mybatis后,学会使用dao层映射文件和Mapper,从数据库获取数据,并将数据封装为相应的对象存储。
将Mybatis框架使用到SSM项目中,实现了:视图层 + 业务逻辑层 + 数据访问层。
- 对于数据库表不多的情况,正常的使用Mybatis框架:手写pojo类文件、dao层Mapper、映射文件即可;
- 对于数据库中表比较多的情况,如果手写同上代码工作量会很大,而且容易出错,此时就需要Mybatis逆向工程帮助我们自动生成代码,怎么生成呢?
【Mybatis官方提供逆向工程可以针对 单表 自动生成执行所需要的代码:mapper.java、mapper.xml……】
先理清思路:
我要完成的项目是crm_system,这个项目中需要我手动书写很多实体类文件,mapper以及映射文件,我觉得很繁琐,也怕写错,于是现在我借助三方工具(也就是Mybatis逆向工程)去帮我写好,然后我复制粘贴到我的项目对应包下,这样就节省了很多时间,也可以避免编码错误。
mybatis逆向工程自己也是一个项目,修改它的配置文件,然后执行项目下的启动generator文件,即可在 该项目下生成所需代码文件,然后直接拷贝到要完成的原始项目即可。
步骤如下:
1. 下载逆向工程
下载链接1/方法1——完整逆向工程项目 ( generatorSqlmapCustom.zip ):
将解压后的工程generatorSqlmapCustom项目直接导入eclipse,需要的核心包工程中都包含在工程lib下,只需在genneatorConfig.xml文件中做相应配置修改,然后运行GeneratorSqlmap.java即可。
附:百度网盘下载链接: https://pan.baidu.com/s/1y_jo0Q7VcQKFcdajpQ-tQA 密码: iebb
下载链接2/方法2——(mybatis-generator-core-1.3.2-bundle.zip)
该方法适合想对mybatis逆向工程有更多了解的程序员们,因为只下载这一个包并不够,而且还需要手写一些文件,所以我选择了方法1,至于该方法具体操作请参考网络资源:https://blog.csdn.net/qr719169236/article/details/51086997
附:核心包_百度网盘链接: https://pan.baidu.com/s/1-nE0aWRB7srDKN9rHNu80g 密码: 538u
2. 修改配置文件 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/taotao" userId="root" password="root"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="com.taotao.pojo" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.taotao.mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.taotao.mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table schema="" tableName="tb_content"></table> <table schema="" tableName="tb_content_category"></table> <table schema="" tableName="tb_item"></table> <table schema="" tableName="tb_item_cat"></table> <table schema="" tableName="tb_item_desc"></table> <table schema="" tableName="tb_item_param"></table> <table schema="" tableName="tb_item_param_item"></table> <table schema="" tableName="tb_order"></table> <table schema="" tableName="tb_order_item"></table> <table schema="" tableName="tb_order_shipping"></table> <table schema="" tableName="tb_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"> <!--javaBean 实现序列化接口 --> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin> <!-- 生成entity时,生成toString --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin> <!-- 自定义查询指定字段 --> <plugin type="org.mybatis.generator.plugins.field.FieldsPlugin"></plugin> <commentGenerator type="org.mybatis.generator.plugins.comment.MyCommentGenerator"> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <!-- <property name="suppressAllComments" value="true" /> --> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:XE" userId="temp" password="temp"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="com.briup.crm.common.bean" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.briup.crm.dao" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.briup.crm.dao" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 指定数据库表 --> <table schema="" tableName="cst_activity"> <columnOverride column="atv_cust_id" javaType="java.lang.Long" /> <columnOverride column="atv_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="cst_customer"> <columnOverride column="cust_id" javaType="java.lang.Long" /> <columnOverride column="cust_manager_id" javaType="java.lang.Integer" /> <columnOverride column="cust_level" javaType="java.lang.Integer" /> <columnOverride column="cust_satisfy" javaType="java.lang.Integer" /> <columnOverride column="cust_credit" javaType="java.lang.Integer" /> <columnOverride column="cust_bankroll" javaType="java.lang.Long" /> <columnOverride column="cust_turnover" javaType="java.lang.Long" /> </table> <table schema="" tableName="cst_linkman"> <columnOverride column="lkm_id" javaType="java.lang.Long" /> <columnOverride column="lkm_cust_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="cst_log"> <columnOverride column="log_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="cst_service"> <columnOverride column="svr_id" javaType="java.lang.Long" /> <columnOverride column="svr_satisfy" javaType="java.lang.Integer" /> </table> <table schema="" tableName="orders"> <columnOverride column="odr_id" javaType="java.lang.Long" /> <columnOverride column="odr_cust_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="orders_line"> <columnOverride column="odd_id" javaType="java.lang.Long" /> <columnOverride column="odd_order_id" javaType="java.lang.Long" /> <columnOverride column="odd_count" javaType="java.lang.Long" /> <columnOverride column="odd_price" javaType="java.lang.Long" /> <columnOverride column="odd_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="product"> <columnOverride column="prod_id" javaType="java.lang.Long" /> <columnOverride column="prod_price" javaType="java.lang.Long" /> </table> <table schema="" tableName="sal_chance"> <columnOverride column="chc_id" javaType="java.lang.Long" /> <columnOverride column="chc_rate" javaType="java.lang.Integer" /> </table> <table schema="" tableName="sal_plan"> <columnOverride column="pla_id" javaType="java.lang.Long" /> <columnOverride column="pla_chc_id" javaType="java.lang.Long" /> </table> <table schema="" tableName="storage"> <columnOverride column="stk_id" javaType="java.lang.Long" /> <columnOverride column="stk_count" javaType="java.lang.Integer" /> </table> <table schema="" tableName="sys_role"> <columnOverride column="role_id" javaType="java.lang.Long" /> <columnOverride column="role_flag" javaType="java.lang.Integer" /> </table> <table schema="" tableName="sys_user"> <columnOverride column="usr_id" javaType="java.lang.Long" /> <columnOverride column="usr_flag" javaType="java.lang.Integer" /> <columnOverride column="usr_role_id" javaType="java.lang.Long" /> </table> </context> </generatorConfiguration>
改动处如下:
3:运行src下的GeneratorSqlmap.java
运行完毕后右击generatorSqlmapCustom项目,选择Refresh刷新generator项目之后即可看到自动生成的包名与要完成的原始项目包名一致,且包中生成了所有的实体类文件、映射文件和mapper文件
4. 将生成的所有文件移到原始项目对应包下
到这里,逆向工程自动生成代码已全部完成,至于网上有说该逆向工程也可生成service层文件等功能,有需要再去学习,目前对此还不大了解。
最后,总结一下我在完成generator自动生成代码项目时作出的修改 + 修改后遇到的一些问题:
修改【generator项目中】:
1. 修改数据库连接配置信息
2. 修改pojo类,mapper,xxMapper.xml的包名
3. 修改要连接的数据库表名
修改后仍然遇到了问题:
1. 在配置文件中添加了配置文件,却未向项目中导入相应插件(即上图中的:可选改动项)
解决:项目中添加相应插件(下图部分,需要哪个添加哪个即可)
2.在我的原始项目pojo类中居然出现了BigDecimal类型
分析原因是:我开始没有在配置文件中指定数据库表中number字段转换后的java类型。
解决: 添加指定转换类型代码。具体代码见上文中的完整配置代码最后部分(指定数据库表)
若文中出现不妥之处,欢迎路过的各路大虾们指出来,灰常感谢。