(4)-mybatis之逆向工程:概念,结合maven工具使用步骤,CRUD案例,example案例

上一篇总结了mybatis之注解
这一篇总结逆向工程,下面一起来学吧

什么是generator?

generator翻译为生成器,是MyBatis开源的一个插件,可以从数据库获取表信息,根据表信息自动生成Mapper.xml,POJO,以及Mapper接口

但问题是,MyBatis不可能完全清楚我们的业务需求,所以其自动生成的sql只能满足基本的CRUD操作,而无法帮助我们进行连表操作,(当然包括带有条件的CRUD)

使用步骤:

1.使用maven添加generator插件

<build>
    <plugins>
      <plugin>
      	<groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.7</version>
	      <configuration>
          			<!-- 是否覆盖已存在的接口和POJO该配置不包括Mapper  
									若为False将会生成版本记录-->
                <overwrite>true</overwrite>
        </configuration>
        </plugin>
    </plugins>
</build>

如果pom.xml有build和plugins标签,则只需把plugin标签里面内容加入plugins标签里面即可。在这里有个注意:如果你的build标签和plugins标签之间有个pluginManagement标签,则他是不下载插件的,需要把pluginManagement去掉,他就会自动下载,下载完会出现在你的maven插件里面。

2.创建配置文件,位于resource下名为generatorConfig.xml

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///student?characterEncoding=utf8&nullCatalogMeansCurrent=true
jdbc.user = root
jdbc.password = 123456
location = D:/maven/repository/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar


上面四个是数据库配置文件,location是mysql驱动的位置,如果有,只需要在文件里加入location。不要忘了双斜杠

3.创建配置文件,位于resource下名为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>
    <!--导入属性配置-->
    <properties resource="jdbc.properties"></properties>
    <!--指定特定数据库的jdbc驱动jar包的位置-->
    <classPathEntry location="${location}"/>
    <context id="default" targetRuntime="MyBatis3">
        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的数据库连接 -->
        <jdbcConnection
                driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.user}" password="${jdbc.password}">
        </jdbcConnection>

        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
        targetPackage 指定生成的model生成所在的包名
        targetProject 指定在该项目下所在的路径 -->
        <javaModelGenerator targetPackage="com.cx.pojo" targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
        <sqlMapGenerator targetPackage="com.cx.dao"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--mapper接口文件生成所在的目录 为每一个数据库的表生成对应的接口文件 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.cx.dao" targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema(数据库名称)作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>


        <!--指定需要生成的表-->
        <table  tableName="student"></table>
    </context>
</generatorConfiguration>




3.运行generator

在idea右侧的maven菜单中双击执行mybatis-generator:generate

也可利用maven命令执行:mybatis-generator:generate

4.条件查询使用pojo包,会发现每个pojo对应了一个Example。

在这里插入图片描述
generator的目标是尽可能的帮我们减少sql的编写,如果只能进行简单的增删改查那编写意义不大,于是generator使用了一套Example来帮助我们用OOP(面向对象)的方式来完成SQL中的条件拼接

其设计思想是将条件看做是一个对象,该对象包含了SQL中常见的比较,逻辑运算等…打开文件你会发现其本质就是帮我们拼接响应的sql符号和关键字

5.配置mybatis-config.xml文件

在mybatis-config.xml下要进行扫描包:

<!--    指定要加载的映射文件-->
    <mappers>
        <package name="com.cx.dao"/>
    </mappers>

6.CRUD案例

 private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void before() throws IOException {
        //加载核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }
    //查询
    @Test
    public void test1(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        Product product = mapper.selectByPrimaryKey(2);
        System.out.println(product);
    }
    //插入
    @Test
    public void test2(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        Product product = new Product();
        product.setPname("香蕉");
        product.setPrice(3d);
        product.setPdate(new Date());
        mapper.insert(product);
    }
    //更新
    @Test
    public void test3(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        Product product = mapper.selectByPrimaryKey(2);
        product.setCid("s123456");
        mapper.updateByPrimaryKey(product);
    }
    //删除
    @Test
    public void test4(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        mapper.deleteByPrimaryKey(6);
    }

7.example案例

import com.cx.dao.ProductMapper;
import com.cx.pojo.Product;
import com.cx.pojo.ProductExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Mytest3 {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void before() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }
    //and条件
    @Test
    public void test1(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        //声明对象
        ProductExample productExample = new ProductExample();
        //创建条件
        ProductExample.Criteria criteria = productExample.createCriteria();
        criteria.andPidEqualTo(1);
        criteria.andPnameLike("%河南%");
        List<Product> products = mapper.selectByExample(productExample);
        System.out.println(products);
    }
    //or条件
    @Test
    public void test2(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        //声明对象
        ProductExample productExample = new ProductExample();
        //创建一个条件对象,可以包含n个and
        ProductExample.Criteria criteria = productExample.createCriteria();
        criteria.andPnameLike("香蕉");
        ProductExample.Criteria or = productExample.or();
        or.andCidEqualTo("s123456");
        List<Product> products = mapper.selectByExample(productExample);
        //最终结果为name有香蕉或者cid为  s123456
        System.out.println(products);
    }
}

注意:重新生成的Mapper文件时不会不会覆盖之前的Mapper,而是会直接在里面添加sql导致id冲突,所以重新生成mapper时一定要手动删除已存在的mapper,否则可能会出现异常,例如:mybatis逆向工程Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains va

总结

MyBatis逆向工程,帮助我们生成实体,接口,mapper文件
配置文件需要修改的地方:JDBC参数,驱动路径,需要生成的表名称,生成文件所在的包路径

Example的使用,example主要是帮助我们实现条件查询,在今后的开发中,是逆向工程中使用较多的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值