MyBatis(十) 逆向工程

一、MyBatis-逆向工程

  • MyBatis Generator
  • 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。
  • 官方文档地址
    http://www.mybatis.org/generator/
  • 官方工程地址
    https://github.com/mybatis/generator/releases

二、MBG使用

三、MBG配置文件


    <?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="DB2Tables" targetRuntime="MyBatis3">

            <!-- 数据库连接信息配置 -->
            <jdbcConnection 
                driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql:///mybatis" userId="root"
                password="123456">
            </jdbcConnection>

            <!--
                javaBean的生成策略 :
                    1.targetPackage:目标包名
                    2.targetProject:目标工程生成路径
            -->
            <javaModelGenerator 
                targetPackage="cn.edu.pzhu.cg.mybatis.bean"
                targetProject=".\src">
                <property name="enableSubPackages" value="true" />
                <property name="trimStrings" value="true" />
            </javaModelGenerator>

            <!--
                映射文件的生成策略 
                    1.targetPackage:目标包名
                    2.targetProject:目标工程生成路径

                .\conf:在当前工程下生成名为 conf 的源码包
            -->
            <sqlMapGenerator 
                targetPackage="mybatis.mapper"
                targetProject=".\conf">
                <property name="enableSubPackages" value="true" />
            </sqlMapGenerator>

            <!--dao接口java文件的生成策略 -->
            <javaClientGenerator 
                type="XMLMAPPER"
                targetPackage="cn.edu.pzhu.cg.dao" targetProject=".\src">
                <property name="enableSubPackages" value="true" />
            </javaClientGenerator>

            <!--数据表与javaBean的映射 -->
            <table tableName="employee" domainObjectName="Employee"></table>
            <table tableName="department" domainObjectName="Department"></table>

        </context>
    </generatorConfiguration>

四、生成器代码

  从官网上 copy 下生成器代码。mbg.xml 文件需要放在项目的根目录下。


    @Test
    public void testCreateMBG() 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);
    }

  执行完以上代码后,就会生成对应的 bean,mapper,以及 mapper 接口。其中 bean 包中还生成了额外的 xxxExample 类,这是为后面封装条件提供的。

五、测试方法

1.插入:

    @Test
    public void testInsert() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee = new Employee();
        employee.setLastName("BB");
        employee.setAge(21);
        employee.setEmail("bb@163.com");
        employee.setDeptId(1);

        mapper.insert(employee);

        sqlSession.commit();
    }
2.删除:

  将条件封装在对应的 xxxExamlpe 中,通过 Criteria 添加条件。


    @Test
    public void testDelete() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        EmployeeExample example = new EmployeeExample();
        Criteria criteria = example.createCriteria();
        criteria.andAgeLessThan(18);

        mapper.deleteByExample(example);

        sqlSession.commit();
    }
3.查询:
(1).查询所有:

    @Test
    public void testQuery() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        //xxxxExample 就是封装查询条件的,传入 null 表示查询所有
        List<Employee> emps = mapper.selectByExample(null);
        for (Employee employee : emps) {
            System.out.println(employee);
        }
    }
(2).按条件查询:

  QBC 风格的带条件查询。


    @Test
    public void testQuaeryExample() {
        //条件查询:查询出 lastName 中带有 'C' 和 age = 22 的 employee
        //1.获取对应的 mapper
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        //2.获取查询条件的 example 对象
        EmployeeExample example = new EmployeeExample();

        //3.拼凑查询条件
        Criteria criteria = example.createCriteria();
        criteria.andLastNameLike("%C%");
        criteria.andAgeEqualTo(22);

        //4.获取结果集
        List<Employee> emps = mapper.selectByExample(example);
        for (Employee employee : emps) {
            System.out.println(employee);
        }
    }
4.修改:
(1).按主键修改:

    @Test
    public void testUpdateByPrimaryKeySelective() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee = new Employee();
        employee.setId(4);//主键
        employee.setLastName("DD");
        employee.setDeptId(1);
        /*
         * updateByPrimaryKeySelective(employee):
         *  按照主键修改 employee 中不为 null 的字段
         * 
         *  sql 语句:update employee SET last_name = ?, dept_id = ? where id = ?
         */
        mapper.updateByPrimaryKeySelective(employee);
        sqlSession.commit();
    }
(2).按条件修改:

    @Test
    public void testUpdateByExample() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        //条件
        EmployeeExample example = new EmployeeExample();
        Criteria criteria = example.createCriteria();
        criteria.andDeptIdEqualTo(4);

        //要修改的内容
        Employee employee = new Employee();
        employee.setAge(26);
        employee.setEmail("@qq.com");

        /*
         * updateByExampleSelective(employee, example):
         *      1. 按照条件 example 更新 employee 中不为 null 的字段
         *      2. sql 语句:update employee SET age = ?, email = ? WHERE ( dept_id = ? )
         */
        mapper.updateByExampleSelective(employee, example);
        sqlSession.commit();
    }

注意:updateByExampleSelective 方法表示修改对应 bean 属性不为 null 的内容,而 updateByExample 方法表示修改所有字段内容,如果当前的 bean 部分属性值为 null,那么也会将数据库表对应的字段内容修改为 NULL.

5.统计:

    @Test
    public void testCount() {
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        EmployeeExample example = new EmployeeExample();
        Criteria criteria = example.createCriteria();
        criteria.andAgeBetween(18, 25);
        criteria.andDeptIdGreaterThan(2);

        Criteria criteria2 = example.createCriteria();
        criteria2.andLastNameLike("%C%");

        /*
         * example.or(criteria2):
         *      1.使用example.or() 可以将多个条件用 or 连起来
         *      2.sql 语句:select count(*) from employee WHERE ( age between ? and ? and dept_id > ? ) or( last_name like ? )
         */
        example.or(criteria2);

        int count = mapper.countByExample(example);
        System.out.println("count:" + count);
    }
完整测试代码

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    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.After;
    import org.junit.Before;
    import org.junit.Test;
    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 cn.edu.pzhu.cg.dao.EmployeeMapper;
    import cn.edu.pzhu.cg.mybatis.bean.Employee;
    import cn.edu.pzhu.cg.mybatis.bean.EmployeeExample;
    import cn.edu.pzhu.cg.mybatis.bean.EmployeeExample.Criteria;

    public class MyBatisTest {

        private SqlSession sqlSession; 

        @Before
        public void init() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            sqlSession = sqlSessionFactory.openSession();
        }   
        @After
        public void destory() {
            if(sqlSession != null) {
                sqlSession.close();
            }
        }

        @Test
        public void testCount() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            EmployeeExample example = new EmployeeExample();
            Criteria criteria = example.createCriteria();
            criteria.andAgeBetween(18, 25);
            criteria.andDeptIdGreaterThan(2);

            Criteria criteria2 = example.createCriteria();
            criteria2.andLastNameLike("%C%");

            /*
             * example.or(criteria2):
             *      1.使用example.or() 可以将多个条件用 or 连起来
             *      2.sql 语句:select count(*) from employee WHERE ( age between ? and ? and dept_id > ? ) or( last_name like ? )
             */
            example.or(criteria2);

            int count = mapper.countByExample(example);
            System.out.println("count:" + count);
        }

        @Test
        public void testUpdateByPrimaryKeySelective() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            Employee employee = new Employee();
            employee.setId(4);
            employee.setLastName("DD");
            employee.setDeptId(1);
            /*
             * updateByPrimaryKeySelective(employee):
             *  按照主键修改 employee 中不为 null 的字段
             * 
             *  sql 语句:update employee SET last_name = ?, dept_id = ? where id = ?
             */
            mapper.updateByPrimaryKeySelective(employee);
            sqlSession.commit();
        }

        @Test
        public void testUpdateByExample() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            //条件
            EmployeeExample example = new EmployeeExample();
            Criteria criteria = example.createCriteria();
            criteria.andDeptIdEqualTo(4);

            //要修改的内容
            Employee employee = new Employee();
            employee.setAge(26);
            employee.setEmail("@qq.com");

            /*
             * updateByExampleSelective(employee, example):
             *      1. 按照条件 example 更新 employee 中不为 null 的字段
             *      2. sql 语句:update employee SET age = ?, email = ? WHERE ( dept_id = ? )
             */
            mapper.updateByExampleSelective(employee, example);
            sqlSession.commit();
        }

        @Test
        public void testQuaeryExample() {
            //条件查询:查询出 lastName 中带有 'C' 和 age = 22 的 employee
            //1.获取对应的 mapper
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            //2.获取查询条件的 example 对象
            EmployeeExample example = new EmployeeExample();

            //3.拼凑查询条件
            Criteria criteria = example.createCriteria();
            criteria.andLastNameLike("%C%");
            criteria.andAgeEqualTo(22);

            //4.获取结果集
            List<Employee> emps = mapper.selectByExample(example);
            for (Employee employee : emps) {
                System.out.println(employee);
            }
        }

        @Test
        public void testQuery() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            //xxxxExample 就是封装查询条件的,传入 null 表示查询所有
            List<Employee> emps = mapper.selectByExample(null);
            for (Employee employee : emps) {
                System.out.println(employee);
            }
        }

        @Test
        public void testDelete() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            EmployeeExample example = new EmployeeExample();
            Criteria criteria = example.createCriteria();
            criteria.andAgeLessThan(18);

            mapper.deleteByExample(example);

            sqlSession.commit();
        }

        @Test
        public void testInsert() {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

            Employee employee = new Employee();
            employee.setLastName("BB");
            employee.setAge(21);
            employee.setEmail("bb@163.com");
            employee.setDeptId(1);

            mapper.insert(employee);

            sqlSession.commit();
        }

        @Test
        public void testCreateMBG() 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);
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值