MyBatis 逆向工程

MyBatis

是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis Generator简介

MyBatis生成器(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为MyBatis的所有版本以及版本2.2.0之后的iBATIS生成代码。它将对一个(或多个)数据库表进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。

MyBatis Generator将生成:

与表结构匹配的Java POJO。这可能包括:

  • 一个与表的主键匹配的类(如果有主键)
  • 一个与表的非主键字段匹配的类(BLOB字段除外)
  • 一个包含表的BLOB字段的类(如果表具有BLOB字段)
  • 一个启用动态选择,更新和删除的类

这些类之间有适当的继承关系。请注意,可以将生成器配置为生成不同类型的POJO层次结构-例如,如果您愿意,可以选择为每个表生成单个域对象。

MyBatis / iBATIS兼容的SQL Map XML文件。MBG为配置中的每个表上的简单CRUD函数生成SQL。生成的SQL语句包括:

  • insert
  • update by primary key
  • update by example (using a dynamic where clause)
  • delete by primary key
  • delete by example (using a dynamic where clause)
  • select by primary key
  • select by example (using a dynamic where clause)
  • count by example

开始走代码

  1. MyBatis 逆向工程核心配置文件 : mybatis-generator.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>
    <!--mybatis-generator.xml
         targetRuntime 可以设置生成的版本
         MyBatis3Simple   标配版   只有 CRUD
         MyBatis3         豪华版   除了 CRUD 还有很多有用的查询方法
    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!-- 去掉全部的注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!-- 修改数据库的连接属性 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis_mbg"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--
            配置生成的 Javabean
            targetPackage : Javabean 的包名
            targetProject : 生成在哪个项目目录下
        -->
        <javaModelGenerator targetPackage="com.mybatis.pojo" targetProject=".\mybatis-mbg\src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--
            配置生成的 : Mapper.xml
            targetPackage : Javabean 的包名
            targetProject : 生成在哪个项目目录下
        -->
        <sqlMapGenerator targetPackage="com.mybatis.mapper"  targetProject=".\mybatis-mbg\src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!--
            配置生成的 : Mapper 接口
            targetPackage : Mapper 接口的包名
            targetProject : 生成在哪个项目目录下
        -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.mapper"  targetProject=".\mybatis-mbg\src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!--
            配置对应的数据库表 table
            tableName : 表名
            domainObjectName : 设置生成的类名
        -->
        <table tableName="t_book" domainObjectName="Book" />
        <table tableName="t_user" domainObjectName="User" />
    </context>
</generatorConfiguration>
  1. 执行 MyBatis 逆向工程 代码 MbgRunner.java
public class MbgRunner {
    public static void main(String[] args) throws InvalidConfigurationException, IOException, XMLParserException, SQLException, InterruptedException {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        // mybatis-generator.xml 配置文件的路径
        File configFile = new File("mybatis-mbg/mybatis-generator.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);
    }
}
  1. 注意 : 以上操作不会生成 Javabean 中的 toString() 及 有参 和 无参构造方法.需要手动生成

测试一下是否可用

  1. 先准备好 MyBatis 的核心配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--
        通过配置包名的方式配置所有JavaBean的别名
    -->
    <typeAliases>
        <package name="com.mybatis.pojo"/>
    </typeAliases>

    <!-- 配置数据库连接数据库连接属性 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_mbg"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 使用包名配置 [更简单] -->
    <mappers>
        <package name="com.mybatis.mapper"/>
    </mappers>
</configuration>
  1. 生成的 BookMapper.java接口 [ 简单的CRUD ]
/**
 * 标配版 只有 CRUD 
 */
public interface BookMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Book record);

    Book selectByPrimaryKey(Integer id);

    List<Book> selectAll();

    int updateByPrimaryKey(Book record);
}
  1. 生成的 BookMapper.java接口 大部分的条件查询都有 [ 豪华版 ]
  2. 其中每个 Javabean 都会对应有一个查询条件类,类似于像User 会对应 UserExample 这个条件类, 其中对每个字段都进行了条件的封装 : 具体使用方法见 : 文档
int countByExample(BookExample example);

    int deleteByExample(BookExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(Book record);

    int insertSelective(Book record);

    List<Book> selectByExample(BookExample example);

    Book selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("record") Book record, @Param("example") BookExample example);

    int updateByExample(@Param("record") Book record, @Param("example") BookExample example);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
  1. 测试类 BookMapperTest.java
public class BookMapperTest {
    static SqlSessionFactory sqlSessionFactory;

    @BeforeClass
    public static void init() throws IOException {
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    }

    @Test
    public void deleteByPrimaryKey() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            BookMapper mapper = sqlSession.getMapper(BookMapper.class);
            mapper.deleteByPrimaryKey(1);
            sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void insert() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            BookMapper mapper = sqlSession.getMapper(BookMapper.class);
            mapper.insert(new Book(null, "乔布斯传", "乔布斯", new BigDecimal(98), 1000, 100));
            sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectByPrimaryKey() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            BookMapper mapper = sqlSession.getMapper(BookMapper.class);
            System.out.println(mapper.selectByPrimaryKey(8));
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectAll() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            BookMapper mapper = sqlSession.getMapper(BookMapper.class);
            mapper.selectAll().forEach(System.out::println);
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void updateByPrimaryKey() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            BookMapper mapper = sqlSession.getMapper(BookMapper.class);
            mapper.updateByPrimaryKey(new Book(8 , "滚雪球", "周某", new BigDecimal(68), 100, 80));
            sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }
}

如果文章对你有帮助记得点赞+关注哦!
QQ交流群:1101584918,欢迎大家加入。

上一篇:MyBatis注解开发


下一篇:携程apollo window搭建记录