zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL语言
    数组的指针
    Java泛型
    python面向对象(下)
    Java枚举类enum
    理解Java的GC日志
    python生成器
    Java并发编程之ThreadLocal类
    python面向对象(上)
    Java并发编程之闭锁简介
  • 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232696.html
Copyright © 2011-2022 走看看