JAVA框架-Mybatis下(注解开发和逆向工程)

注解开发

Emmmm........

感觉注解这种方式还是硬编码呀,等以后用到的时候再仔细看看吧,感觉不太重要呢.....

逆向工程

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

配置

首先我们在maven中导入插件:

<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>

可以看到,插件中出现了该接口:

随后我们需要建立配置文件generatorConfig.xml(在resource目录下面)

<?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="${driver}" connectionURL="${url}" userId="${username}" password="${password}">
        </jdbcConnection>


        <!--Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
        targetPackage 指定生成的model生成所在的包名
        targetProject 指定在该项目下所在的路径 -->
        <javaModelGenerator targetPackage="Bean" 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="mapper"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

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


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

这里我们把jdbc的配置文件单独拿了出来,建立jdbc.properties

username = root
url = jdbc:mysql:///mybatisdb?serverTimezone=Asia/Shanghai&characterEncoding=utf8
password = 3692512
# jdbc驱动jar包路径
driver = com.mysql.cj.jdbc.Driver
location = C:/Users/17390/.m2/repository/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar

这样我们就配置好了,下面可以点击maven中的generator插件来生成我们的 代理对象,mapper,和Bean,生成之后我的目录是这个样子的(圈出的是生成出来的,其他的是上个博客我建立的):

可以看到生成了两个Bean对象,那个Example对象是辅助我们在查询时添加条件的,具体用法看下面的代码。

使用

如果看过前面的博客,这里就很简单了,直接上代码就好了,需要注意的地方加上了注释:

import Bean.Kuser;
import Bean.KuserExample;
import Bean.User;
import mapper.KuserMapper;
import mapper.UserMapper;
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;

/**
 * Created by Jeason Luna on 2020/6/22 20:38
 */
public class GeneratorTest {

    private SqlSessionFactory factory;

    @Before
    public  void init() throws IOException {
        //获取的工厂构造器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //加载配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
        //获得会话工厂
        factory = builder.build(stream);
    }

    @Test
    public void test1(){
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            Kuser kuser = mapper.selectByPrimaryKey(3);
            System.out.println(kuser.getUsername());
        }
    }

    @Test
    public void test2(){
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            List<Kuser> kusers = mapper.selectByExample(null);
            System.out.println(kusers);
        }
    }

    @Test
    public void test3(){
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            Kuser kuser = new Kuser();
            kuser.setUsername("项羽");
            kuser.setAddress("楚国");
            mapper.insert(kuser);
        }
    
    }


    @Test
    public void test4(){
        //Example的使用----模糊查询
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            //得到一个KuserExample对象
            KuserExample kuserExample = new KuserExample();
            //得到一个条件对象
            KuserExample.Criteria criteria = kuserExample.createCriteria();
            //添加条件
            criteria.andUsernameLike("%森%");
    
            List<Kuser> kusers = mapper.selectByExample(kuserExample);
            System.out.println(kusers);
    
        }
    }


    @Test
    public void test5(){
        //Example的使用    多个and条件
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            //得到一个KuserExample对象
            KuserExample kuserExample = new KuserExample();
            //得到一个条件对象
            KuserExample.Criteria criteria = kuserExample.createCriteria();
            //添加条件
            criteria.andUsernameLike("%森%");
            criteria.andAddressEqualTo("黑龙江");
    
            List<Kuser> kusers = mapper.selectByExample(kuserExample);
            System.out.println(kusers);
    
        }
    }
    
    @Test
    public void test6(){
        //Example的使用    or条件
        try(SqlSession session = factory.openSession(true)){
            KuserMapper mapper = session.getMapper(KuserMapper.class);
            //得到一个KuserExample对象
            KuserExample kuserExample = new KuserExample();
            //得到一个条件对象
            KuserExample.Criteria criteria = kuserExample.createCriteria();
            //添加条件
            criteria.andAddressEqualTo("黑龙江");
            //或者地址为日本的
            KuserExample.Criteria or = kuserExample.or();
            or.andAddressEqualTo("日本");
    
            List<Kuser> kusers = mapper.selectByExample(kuserExample);
            System.out.println(kusers);
    
        }
    }

}

注意:重新生成的Mapper文件时不会不会覆盖之前的Mapper,而是会直接在里面添加sql导致id冲突,所以重新生成mapper时一定要手动删除已存在的mapper

原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232696.html