【SSM 4】Mybatis逆向生成工具
在上一篇博客中说到,Mybatis是灵活的SQL语句应用,不想Hibernate一样有其封装好的方法,那么,当我们用Mybatis的时候(Hibernate),我们都需要编写其实体类,和配置文件。本篇博客,就介绍一下Mybatis的逆向生成工具。
一、思路
回想一下,在最早运用EF的时候,我们首先通过可视化界面,连接数据库,然后选择要使用的表单,然后,我们就可以自动生成实体类。在运用Hibernate的时候,我们可以先编写Hibernate的配置文件,连接数据库,然后编写实体类文件,然后通过读取HIbernate的配置文件,正向生成数据库表单。然后我们也可以运用工具,从数据库表,生成HIbernate的实体。那么,到了Mybatis这儿,可以怎么做呢?思路如下:
1,连接数据库,指定表单生成
2,指定代码生成后的存放路径,以及要生成哪些代码
2,读取配置文件,生成代码
二、实现
首先是建立了一个Java project,然后引入了5个jar包,分别是:
log4j-1.2.16.jar;Mybatis-3.2.3.jar;Mybatis-generator-core-1.3.2.jar;mysal-connector-java-5.1.28-bin.jar;ojdbc14.jar
版本可以自行确定!
然后,编写mybatis.xml配置文件,代码内容如下:
- <span style="font-family:KaiTi_GB2312;font-size:18px;"><?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/Test" userId="root"
- password="Angel0626">
- </jdbcConnection>
- <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
- NUMERIC 类型解析为java.math.BigDecimal -->
- <javaTypeResolver>
- <property name="forceBigDecimals" value="false" />
- </javaTypeResolver>
- <!-- targetProject:生成PO类的位置 -->
- <javaModelGenerator targetPackage="pojo"
- targetProject=".\src">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false" />
- <!-- 从数据库返回的值被清理前后的空格 -->
- <property name="trimStrings" value="true" />
- </javaModelGenerator>
- <!-- targetProject:mapper映射文件生成的位置 -->
- <sqlMapGenerator targetPackage="mapper"
- targetProject=".\src">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false" />
- </sqlMapGenerator>
- <!-- targetPackage:mapper接口生成的位置 -->
- <javaClientGenerator type="XMLMAPPER"
- targetPackage="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>
- </span>
其次,编写实现方法,代码如下:
- <span style="font-family:KaiTi_GB2312;font-size:18px;">package test;
- 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("mybatis.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();
- }
- }
- }
- </span>
运行其main方法,即可生成相应代码。
代码示例:以TbUser表为例:
实体类:
- <span style="font-family:KaiTi_GB2312;font-size:18px;">public class TbUser {
- private Long id;
- private String username;
- private String password;
- private String phone;
- private String email;
- private Date created;
- private Date updated;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }</span>
mapper接口:
- <span style="font-family:KaiTi_GB2312;font-size:18px;">package mapper;
- import java.util.List;
- import org.apache.ibatis.annotations.Param;
- import pojo.TbUser;
- import pojo.TbUserExample;
- public interface TbUserMapper {
- int countByExample(TbUserExample example);
- int deleteByExample(TbUserExample example);
- int deleteByPrimaryKey(Long id);
- int insert(TbUser record);
- int insertSelective(TbUser record);
- List<TbUser> selectByExample(TbUserExample example);
- TbUser selectByPrimaryKey(Long id);
- int updateByExampleSelective(@Param("record") TbUser record, @Param("example") TbUserExample example);
- int updateByExample(@Param("record") TbUser record, @Param("example") TbUserExample example);
- int updateByPrimaryKeySelective(TbUser record);
- int updateByPrimaryKey(TbUser record);
- }</span>
mapper.xml实现:
- <span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="mapper.TbUserMapper" >
- <resultMap id="BaseResultMap" type="pojo.TbUser" >
- <id column="id" property="id" jdbcType="BIGINT" />
- <result column="username" property="username" jdbcType="VARCHAR" />
- <result column="password" property="password" jdbcType="VARCHAR" />
- <result column="phone" property="phone" jdbcType="VARCHAR" />
- <result column="email" property="email" jdbcType="VARCHAR" />
- <result column="created" property="created" jdbcType="TIMESTAMP" />
- <result column="updated" property="updated" jdbcType="TIMESTAMP" />
- </resultMap>
- <sql id="Example_Where_Clause" >
- <where >
- <foreach collection="oredCriteria" item="criteria" separator="or" >
- <if test="criteria.valid" >
- <trim prefix="(" suffix=")" prefixOverrides="and" >
- <foreach collection="criteria.criteria" item="criterion" >
- <choose >
- <when test="criterion.noValue" >
- and ${criterion.condition}
- </when>
- <when test="criterion.singleValue" >
- and ${criterion.condition} #{criterion.value}
- </when>
- <when test="criterion.betweenValue" >
- and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
- </when>
- <when test="criterion.listValue" >
- and ${criterion.condition}
- <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
- #{listItem}
- </foreach>
- </when>
- </choose>
- </foreach>
- </trim>
- </if>
- </foreach>
- </where>
- </sql>
- <sql id="Update_By_Example_Where_Clause" >
- <where >
- <foreach collection="example.oredCriteria" item="criteria" separator="or" >
- <if test="criteria.valid" >
- <trim prefix="(" suffix=")" prefixOverrides="and" >
- <foreach collection="criteria.criteria" item="criterion" >
- <choose >
- <when test="criterion.noValue" >
- and ${criterion.condition}
- </when>
- <when test="criterion.singleValue" >
- and ${criterion.condition} #{criterion.value}
- </when>
- <when test="criterion.betweenValue" >
- and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
- </when>
- <when test="criterion.listValue" >
- and ${criterion.condition}
- <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
- #{listItem}
- </foreach>
- </when>
- </choose>
- </foreach>
- </trim>
- </if>
- </foreach>
- </where>
- </sql>
- <sql id="Base_Column_List" >
- id, username, password, phone, email, created, updated
- </sql>
- <select id="selectByExample" resultMap="BaseResultMap" parameterType="pojo.TbUserExample" >
- select
- <if test="distinct" >
- distinct
- </if>
- <include refid="Base_Column_List" />
- from tb_user
- <if test="_parameter != null" >
- <include refid="Example_Where_Clause" />
- </if>
- <if test="orderByClause != null" >
- order by ${orderByClause}
- </if>
- </select>
- <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
- select
- <include refid="Base_Column_List" />
- from tb_user
- where id = #{id,jdbcType=BIGINT}
- </select>
- <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
- delete from tb_user
- where id = #{id,jdbcType=BIGINT}
- </delete>
- <delete id="deleteByExample" parameterType="pojo.TbUserExample" >
- delete from tb_user
- <if test="_parameter != null" >
- <include refid="Example_Where_Clause" />
- </if>
- </delete>
- <insert id="insert" parameterType="pojo.TbUser" >
- insert into tb_user (id, username, password,
- phone, email, created,
- updated)
- values (#{id,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
- #{phone,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{created,jdbcType=TIMESTAMP},
- #{updated,jdbcType=TIMESTAMP})
- </insert>
- <insert id="insertSelective" parameterType="pojo.TbUser" >
- insert into tb_user
- <trim prefix="(" suffix=")" suffixOverrides="," >
- <if test="id != null" >
- id,
- </if>
- <if test="username != null" >
- username,
- </if>
- <if test="password != null" >
- password,
- </if>
- <if test="phone != null" >
- phone,
- </if>
- <if test="email != null" >
- email,
- </if>
- <if test="created != null" >
- created,
- </if>
- <if test="updated != null" >
- updated,
- </if>
- </trim>
- <trim prefix="values (" suffix=")" suffixOverrides="," >
- <if test="id != null" >
- #{id,jdbcType=BIGINT},
- </if>
- <if test="username != null" >
- #{username,jdbcType=VARCHAR},
- </if>
- <if test="password != null" >
- #{password,jdbcType=VARCHAR},
- </if>
- <if test="phone != null" >
- #{phone,jdbcType=VARCHAR},
- </if>
- <if test="email != null" >
- #{email,jdbcType=VARCHAR},
- </if>
- <if test="created != null" >
- #{created,jdbcType=TIMESTAMP},
- </if>
- <if test="updated != null" >
- #{updated,jdbcType=TIMESTAMP},
- </if>
- </trim>
- </insert>
- <select id="countByExample" parameterType="pojo.TbUserExample" resultType="java.lang.Integer" >
- select count(*) from tb_user
- <if test="_parameter != null" >
- <include refid="Example_Where_Clause" />
- </if>
- </select>
- <update id="updateByExampleSelective" parameterType="map" >
- update tb_user
- <set >
- <if test="record.id != null" >
- id = #{record.id,jdbcType=BIGINT},
- </if>
- <if test="record.username != null" >
- username = #{record.username,jdbcType=VARCHAR},
- </if>
- <if test="record.password != null" >
- password = #{record.password,jdbcType=VARCHAR},
- </if>
- <if test="record.phone != null" >
- phone = #{record.phone,jdbcType=VARCHAR},
- </if>
- <if test="record.email != null" >
- email = #{record.email,jdbcType=VARCHAR},
- </if>
- <if test="record.created != null" >
- created = #{record.created,jdbcType=TIMESTAMP},
- </if>
- <if test="record.updated != null" >
- updated = #{record.updated,jdbcType=TIMESTAMP},
- </if>
- </set>
- <if test="_parameter != null" >
- <include refid="Update_By_Example_Where_Clause" />
- </if>
- </update>
- <update id="updateByExample" parameterType="map" >
- update tb_user
- set id = #{record.id,jdbcType=BIGINT},
- username = #{record.username,jdbcType=VARCHAR},
- password = #{record.password,jdbcType=VARCHAR},
- phone = #{record.phone,jdbcType=VARCHAR},
- email = #{record.email,jdbcType=VARCHAR},
- created = #{record.created,jdbcType=TIMESTAMP},
- updated = #{record.updated,jdbcType=TIMESTAMP}
- <if test="_parameter != null" >
- <include refid="Update_By_Example_Where_Clause" />
- </if>
- </update>
- <update id="updateByPrimaryKeySelective" parameterType="pojo.TbUser" >
- update tb_user
- <set >
- <if test="username != null" >
- username = #{username,jdbcType=VARCHAR},
- </if>
- <if test="password != null" >
- password = #{password,jdbcType=VARCHAR},
- </if>
- <if test="phone != null" >
- phone = #{phone,jdbcType=VARCHAR},
- </if>
- <if test="email != null" >
- email = #{email,jdbcType=VARCHAR},
- </if>
- <if test="created != null" >
- created = #{created,jdbcType=TIMESTAMP},
- </if>
- <if test="updated != null" >
- updated = #{updated,jdbcType=TIMESTAMP},
- </if>
- </set>
- where id = #{id,jdbcType=BIGINT}
- </update>
- <update id="updateByPrimaryKey" parameterType="pojo.TbUser" >
- update tb_user
- set username = #{username,jdbcType=VARCHAR},
- password = #{password,jdbcType=VARCHAR},
- phone = #{phone,jdbcType=VARCHAR},
- email = #{email,jdbcType=VARCHAR},
- created = #{created,jdbcType=TIMESTAMP},
- updated = #{updated,jdbcType=TIMESTAMP}
- where id = #{id,jdbcType=BIGINT}
- </update>
- </mapper></span>
三、总结
从生成的代码可以看出,生成的代码,基本上解决了对于一个实体操作的增删改查,但是,每个实体的代码都是这样的丰富,还能不能继续往上抽象一层呢?下一篇博客介绍Mybatis的底层封装思路!
【SSM 4】Mybatis逆向生成工具的更多相关文章
- 「小程序JAVA实战」Springboot版mybatis逆向生成工具(32)
转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootbanmybatisnixiangshengchenggongju32/ ...
- Springboot学习与mybatis逆向生成工具
最近H2数据库越用越觉得方便,在不同办公处无缝继续demo的感觉就是爽. 今天接上一篇Springboot简洁整合mybatis,补上sts(即eclipse)使用mybatis generato ...
- myBatis逆向生成及使用
引入数据库驱动 <!-- mybatis逆向生成包 --><dependency> <groupId>org.mybatis.generator</group ...
- Mybatis逆向生成
在已经有了数据库的表的时候,为了方便起见,我们可以逆向生成javabean,xml,dao接口等,当然,下载mybaits-generation的工具,我这里用的是eclipse插件,然后准备一 个x ...
- Mybatis逆向生成使用扩展类
1.背景介绍 用的mybatis自动生成的插件,然而每次更改数据库的时候重新生成需要替换原有的mapper.xml文件,都要把之前业务相关的sql重新写一遍,感觉十分麻烦,就想着把自动生成的作为一个基 ...
- 一步步学Mybatis-告别繁琐的配置之Mybatis配置文件生成工具 (7)
今年是2013年的杀青之日,前几天由于比较忙,没有及时更新本篇的最后一篇东西,前六篇中我们主要都是采用手动配置相关的Mybatis映射文件与相应的接口类与实体类.当然如果在真正的使用过程中,由于业务的 ...
- Mybatis逆向生成代碼
Idea 单模块 1.在pom.xml中添加依赖 <build> <plugins> <plugin> <groupId>org.mybatis.gen ...
- Mybatis Generator生成工具配置文件详解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...
- Mybatis逆向生成Mapper文件
本文参考博客 http://blog.csdn.net/for_my_life/article/details/51228098 1. 在resources根目录下添加generator.proper ...
随机推荐
- js问题
1.原型链问题 1.js中万物皆对象,但对象也分为普通对象和函数对象,Object,Function都是js自带的函数对象,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普 ...
- multithreading - Reader/Writer Locks in C++
You Only Need To Note This: only 1 single thread can acquire an upgrade_lock at one time. others are ...
- 【转】android 属性动画之 ObjectAnimator
原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里 ...
- Java高级开发工程师面试考纲 转
转 http://www.sanesee.com/article/java-engineer-interview-of-content-tree 1 Java基础 1.1 Collection和Map ...
- PHP MVC简单介绍,对PHP当前主流的MVC做了一个总结
东抄西抄,对PHP当前主流的MVC做了一个总结PPT. 希望对初学者有点帮助! PHP MVC初步.ppt
- C#将exe运行程序嵌入到自己的winform窗体中
以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:C将exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport注意:该方法只适用于com的e ...
- MySql 存储过程及调用方法
存储过程实例: DELIMITER $$drop procedure if exists ff $$CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PRO ...
- 数据库MySQL基本语法思维导图
- mysql新建表示,时间字段timetamp碰到的问题
在mysql中创建表时,在新加的字段时间上,碰到下面的问题: 建表语句如下: CREATE TABLE seckill( seckill_id bigint NOT NULL AUTO_INCREME ...
- OAF_开发系列16_实现OAF与XML Publisher整合
http://wenku.baidu.com/link?url=y2SFKHP5qqn4bl_iNeqLGjXsTvhyFuhkMraIbWZdTXbzcv0vTefrZFFBDWie0cAAKuTw ...