GVKun编程网logo

mybatis-@Mapper接口用法(mybatis mapper接口)

26

如果您对mybatis-@Mapper接口用法和mybatismapper接口感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mybatis-@Mapper接口用法的各种细节,并对mybatis

如果您对mybatis-@Mapper接口用法mybatis mapper接口感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mybatis-@Mapper接口用法的各种细节,并对mybatis mapper接口进行深入的分析,此外还有关于mybatis 3.3 , import tk.mybatis.mapper.mapperhelper.SqlHelper; 类不生成实体类某个字段、Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring、mybatis mapper学习1-mapper.xml映射文件生成:Mybatis Generator的下载-安装-配置-运行、mybatis mapper学习4-MyBatis的Mapper接口以及Example的实例函数及详解的实用技巧。

本文目录一览:

mybatis-@Mapper接口用法(mybatis mapper接口)

mybatis-@Mapper接口用法(mybatis mapper接口)

mybatis支持的映射方式有基于xml的mapper.xml文件、基于java的使用Mapper接口class,简单学习一下mybatis使用接口来配置映射的方法。

接口方法注解主要是四个:@Insert、@Delete、@Update、@Select

具体代码

package com.example.springbootspringmvcdemo.mapper;

import com.example.springbootspringmvcdemo.entity.User;
import org.apache.ibatis.annotations.*;

@Mapper
public interface MapperDemo {
    /**
     * 插入记录,手动分配主键
     * @param user
     * @return
     */
    @Insert("INSERT INTO tb_user (id, username,password) values (#{id},#{username},#{password})")
    int addUser(User user);

    /**
     * 插入记录,数据库生成主键
     * useGeneratedKeys: 表示要使用自增主键
     * keyProperty: 用来指定主键字段名
     * @param user
     * @return
     */
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into tb_user (username,password) values (#{username},#{password})")
    int addUserGenerateKey(User user);

    /**
     * 删除记录
     * @param id
     * @return
     */
    @Delete("DELETE FROM tb_user WHERE id = #{id}")
    int delete(String id);

    /**
     * 修改记录
     * @param user
     * @return
     */
    @Update("UPDATE tb_user set username=#{username},password=#{password} where id =#{id}")
    int update(User user);

    @Select("SELECT * FROM tb_user WHERE id=#{id}")
    User loadByIdAutoAlias(String id);

    /**
     * 使用ResultMap
     * @param id
     * @return
     */
    @Results(
            id = "userMap", value= {
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "username", property = "username"),
            @Result(column = "password",property = "password")
    }
    )
    @Select("SELECT * FROM tb_user WHERE id=#{id}")
    User loadByIdAutoAlias2(String id);
}

单元测试

package com.example.springbootspringmvcdemo.mapper;

import com.alibaba.fastjson.JSON;
import com.example.springbootspringmvcdemo.entity.User;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBoottest;
import org.springframework.boot.test.json.JsonbTester;

@SpringBoottest
public class TestMapperDemo {

    private Logger logger = LoggerFactory.getLogger(TestMapperDemo.class);

    @Autowired(required = false)
    MapperDemo mapperDemo;

    @Test
    public void addUser() {
        User user = new User();
        user.setId(6);
        user.setUsername("hahahah");
        user.setPassword("99999");
        mapperDemo.addUser(user);
    }

    @Test
    public void addUserGenerateKey() {
        User user = new User();
        user.setUsername("ewrewrwefsd");
        user.setPassword("ieruwe222222");
        mapperDemo.addUserGenerateKey(user);
    }

    @Test
    public void delete() {
        mapperDemo.delete("8");
    }

    @Test
    public void update() {
        User user = new User();
        user.setId(5);
        user.setUsername("22211122222222222");
        user.setPassword("333333333333333");
        mapperDemo.update(user);
    }

    @Test
    public void loadByIdAutoAlias() {
        User user = mapperDemo.loadByIdAutoAlias("41");
        if (user != null) {
            String string = JSON.toJSON(user).toString();
            logger.info(string);
        } else {
            logger.info("没有查询到数据!");
        }

    }

    @Test
    public void loadByIdAutoAlias2() {
        User user = mapperDemo.loadByIdAutoAlias2("4");
        if (user != null) {
            String string = JSON.toJSON(user).toString();
            logger.info(string);
        } else {
            logger.info("没有查询到数据!");
        }
    }
}

使用的依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>

 

 

 

 

mybatis 3.3 , import tk.mybatis.mapper.mapperhelper.SqlHelper; 类不生成实体类某个字段

mybatis 3.3 , import tk.mybatis.mapper.mapperhelper.SqlHelper; 类不生成实体类某个字段

mybatis 3.3 , import tk.mybatis.mapper.mapperhelper.SqlHelper; 类不生成实体类某个字段,在线等  ji

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如

<bean id="userMapper" >
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

    MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。

   上面的配置有一个很大的缺点,就是系统有很多的配置文件时 全部需要手动编写,所以上述的方式已经不用了。

    没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。

    要创建 MapperScannerConfigurer,可以在 Spring 的配置中添加如下代码:

<bean >
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

    basePackage 属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。

注 意 , 没 有 必 要 去 指 定 SqlSessionFactory 或 SqlSessionTemplate , 因 为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配。但是,如果你使 用了一个 以上的 DataSource ,那 么自动 装配可 能会失效 。这种 情况下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名 称来使用。这就是它如何来配置的,注意 bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的 ref: 

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

    MapperScannerConfigurer 支 持 过 滤 由 指 定 的 创 建 接 口 或 注 解 创 建 映 射 器 。 annotationClass 属性指定了要寻找的注解名称。 markerInterface 属性指定了要寻找的父 接口。如果两者都被指定了,加入到接口中的映射器会匹配两种标准。默认情况下,这两个 属性都是 null,所以在基包中给定的所有接口可以作为映射器加载。

    被发现的映射器将会使用 Spring 对自动侦测组件(参考 Spring 手册的 3.14.4)默认的命 名策略来命名。也就是说,如果没有发现注解,它就会使用映射器的非大写的非完全限定类 名。但是如果发现了@Component 或 JSR-330 的@Named 注解,它会获取名称。注意你可以 配 置 到 org.springframework.stereotype.Component , javax.inject.Named(如果你使用 JSE 6 的话)或你自己的注解(肯定是自我注解)中,这 样注解将会用作生成器和名称提供器。

    接下来让我们看一下MapperScannerConfigurer类的源码 看看是如何自动扫描的。

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    if (this.processPropertyPlaceHolders) {
      processPropertyPlaceHolders();
    }
    ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
    scanner.setAddToConfig(this.addToConfig);
    scanner.setAnnotationClass(this.annotationClass);
    scanner.setMarkerInterface(this.markerInterface);
    scanner.setSqlSessionFactory(this.sqlSessionFactory);
    scanner.setSqlSessionTemplate(this.sqlSessionTemplate);
    scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);
    scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);
    scanner.setResourceLoader(this.applicationContext);
    scanner.setBeanNameGenerator(this.nameGenerator);
    scanner.registerFilters();
    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
  }

    把Mapper接口转换成MapperFactoryBean的代码在地17行这个方法里,让我们跟踪进去看一下。

@Override
  public Set<BeanDefinitionHolder> doScan(String... basePackages) {
    Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);
    if (beanDefinitions.isEmpty()) {
      logger.warn("No MyBatis mapper was found in ''" + Arrays.toString(basePackages) + "'' package. Please check your configuration.");
    } else {
      for (BeanDefinitionHolder holder : beanDefinitions) {
        GenericBeanDefinition definition = (GenericBeanDefinition) holder.getBeanDefinition();
        if (logger.isDebugEnabled()) {
          logger.debug("Creating MapperFactoryBean with name ''" + holder.getBeanName() 
              + "'' and ''" + definition.getBeanClassName() + "'' mapperInterface");
        }
        // the mapper interface is the original class of the bean
        // but, the actual class of the bean is MapperFactoryBean
        //把接口的类型设置进去
        definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName());
        //设置Bean的真实类型MapperFactoryBean 
        definition.setBeanClass(MapperFactoryBean.class);
        //是否把Mapper接口加入到Mybatis的Config当中去
        definition.getPropertyValues().add("addToConfig", this.addToConfig);
        boolean explicitFactoryUsed = false;
        //如果sqlSessionFactoryBeanName的名字不为空 则在Spring容器中查询
        //适合多数据源
        if (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {
          definition.getPropertyValues().add("sqlSessionFactory", new RuntimeBeanReference(this.sqlSessionFactoryBeanName));
          explicitFactoryUsed = true;
        } else if (this.sqlSessionFactory != null) {
          definition.getPropertyValues().add("sqlSessionFactory", this.sqlSessionFactory);
          explicitFactoryUsed = true;
        }
        //如果sqlSessionTemplateBeanName的名字不为空 则在Spring容器中查询
        //适合多数据源
        if (StringUtils.ha
        if (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {
          if (explicitFactoryUsed) {
            logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");
          }
          definition.getPropertyValues().add("sqlSessionTemplate", new RuntimeBeanReference(this.sqlSessionTemplateBeanName));
          explicitFactoryUsed = true;
        } else if (this.sqlSessionTemplate != null) {
          if (explicitFactoryUsed) {
            logger.warn("Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.");
          }
          definition.getPropertyValues().add("sqlSessionTemplate", this.sqlSessionTemplate);
          explicitFactoryUsed = true;
        }
        if (!explicitFactoryUsed) {
          if (logger.isDebugEnabled()) {
            logger.debug("Enabling autowire by type for MapperFactoryBean with name ''" + holder.getBeanName() + "''.");
          }
          definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
        }
      }
    }
    //这个集合返回以后 Spring容器会将里面的所有内容注册到容器中
    return beanDefinitions;
  }

mybatis mapper学习1-mapper.xml映射文件生成:Mybatis Generator的下载-安装-配置-运行

mybatis mapper学习1-mapper.xml映射文件生成:Mybatis Generator的下载-安装-配置-运行

mybatis3系列文章目录链接


 

1.下载eclipse

点击eclipse mars.1 下载eclipse mars.1版本 

 

2.下载Mybatis Generator 插件

 

1)在线安装

在eclipse中 marketplace搜索Mybatis Generator 插件install安装

 

 2)离线安装

在这个页面下载generator-mybatis-generator-1.3.3.zip(与eclipse 4.5.1匹配),

把features和plugins拷贝到eclipse安装目录下dropins文件夹中,

重启eclipse。

 

 

 

 

 

3.准备数据库连接

准备好数据库地址,库名,用户名密码,编辑入generatorConfig.xml(如何编辑见第4步注释说明)

 

 点击mysql jdbc 驱动(java) 5.1.44 最新版下载jar包

 

在generatorConfig.xml中编辑jar包位置

<classPathEntry location="C:\mysql-connector-java-5.1.38.jar" />

 

 

4.编辑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>
<!-- 可以用于加载配置项或者配置文件,在整个配置文件中就可以使用${propertyKey}的方式来引用配置项
    resource:配置资源加载地址,使用resource,MBG从classpath开始找,比如com/myproject/generatorConfig.properties        
    url:配置资源加载地质,使用URL的方式,比如file:///C:/myfolder/generatorConfig.properties.
    注意,两个属性只能选址一个;
    
    另外,如果使用了mybatis-generator-maven-plugin,那么在pom.xml中定义的properties都可以直接在generatorConfig.xml中使用
<properties resource="" url="" />
 -->
 
 <!-- 在MBG工作的时候,需要额外加载的依赖包
    location属性指明加载jar/zip包的全路径
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
  -->
  
<!-- 
    context:生成一组对象的环境 
    id:必选,上下文id,用于在生成错误时提示
    defaultModelType:指定生成对象的样式
        1,conditional:类似hierarchical;
        2,flat:所有内容(主键,blob)等全部生成在一个对象中;
        3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)
    targetRuntime:
        1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
        2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
    introspectedColumnImpl:类全限定名,用于扩展MBG
-->
<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >

    <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
        一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖
     -->
    <property name="autoDelimitKeywords" value="false"/>
    <!-- 生成的Java文件的编码 -->
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 格式化java代码 -->
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    <!-- 格式化XML代码 -->
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
    
    <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
    
    <!-- 必须要有的,使用这个配置链接数据库
        @TODO:是否可以扩展
     -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///pss" userId="root" password="admin">
        <!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 -->
    </jdbcConnection>
    
    <!-- java类型处理器 
        用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
        注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型; 
    -->
    <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
        <!-- 
            true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
            false:默认,
                scale>0;length>18:使用BigDecimal;
                scale=0;length[10,18]:使用Long;
                scale=0;length[5,9]:使用Integer;
                scale=0;length<5:使用Short;
         -->
        <property name="forceBigDecimals" value="false"/>
    </javaTypeResolver>
    
    
    <!-- java模型创建器,是必须要的元素
        负责:1,key类(见context的defaultModelType);2,java类;3,查询类
        targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
        targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
     -->
    <javaModelGenerator targetPackage="com._520it.mybatis.domain" targetProject="src/main/java">
        <!--  for MyBatis3/MyBatis3Simple
            自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;
         -->
        <property name="constructorBased" value="false"/>
        
        <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
        <property name="enableSubPackages" value="true"/>
        
        <!-- for MyBatis3 / MyBatis3Simple
            是否创建一个不可变的类,如果为true,
            那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类
         -->
        <property name="immutable" value="false"/>
        
        <!-- 设置一个根对象,
            如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项
            注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括:
                1,属性名相同,类型相同,有相同的getter/setter方法;
         -->
        <property name="rootClass" value="com._520it.mybatis.domain.BaseDomain"/>
        
        <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
        <property name="trimStrings" value="true"/>
    </javaModelGenerator>
    
    
    <!-- 生成SQL map的XML文件生成器,
        注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),
            或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置
        targetPackage/targetProject:同javaModelGenerator
     -->
    <sqlMapGenerator targetPackage="com._520it.mybatis.mapper" targetProject="src/main/resources">
        <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
        <property name="enableSubPackages" value="true"/>
    </sqlMapGenerator>
    
    
    <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口 
        targetPackage/targetProject:同javaModelGenerator
        type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
            1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
            2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
            3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
        注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
    -->
    <javaClientGenerator targetPackage="com._520it.mybatis.mapper" type="ANNOTATEDMAPPER" targetProject="src/main/java">
        <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
        <property name="enableSubPackages" value="true"/>
        
        <!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查
        <property name="rootInterface" value=""/>
         -->
    </javaClientGenerator>
    
    <!-- 选择一个table来生成相关文件,可以有一个或多个table,必须要有table元素
        选择的table会生成一下文件:
        1,SQL map文件
        2,生成一个主键类;
        3,除了BLOB和主键的其他字段的类;
        4,包含BLOB的类;
        5,一个用户生成动态查询的条件类(selectByExample, deleteByExample),可选;
        6,Mapper接口(可选)
    
        tableName(必要):要生成对象的表名;
        注意:大小写敏感问题。正常情况下,MBG会自动的去识别数据库标识符的大小写敏感度,在一般情况下,MBG会
            根据设置的schema,catalog或tablename去查询数据表,按照下面的流程:
            1,如果schema,catalog或tablename中有空格,那么设置的是什么格式,就精确的使用指定的大小写格式去查询;
            2,否则,如果数据库的标识符使用大写的,那么MBG自动把表名变成大写再查找;
            3,否则,如果数据库的标识符使用小写的,那么MBG自动把表名变成小写再查找;
            4,否则,使用指定的大小写格式查询;
        另外的,如果在创建表的时候,使用的""把数据库对象规定大小写,就算数据库标识符是使用的大写,在这种情况下也会使用给定的大小写来创建表名;
        这个时候,请设置delimitIdentifiers="true"即可保留大小写格式;
        
        可选:
        1,schema:数据库的schema;
        2,catalog:数据库的catalog;
        3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
        4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
        5,enableInsert(默认true):指定是否生成insert语句;
        6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
        7,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;
        8,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);
        9,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete);
        10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;
        11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
        12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
        13,modelType:参考context元素的defaultModelType,相当于覆盖;
        14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
        15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性
        
        注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写;
     -->
    <table tableName="userinfo" >
        
        <!-- 参考 javaModelGenerator 的 constructorBased属性-->
        <property name="constructorBased" value="false"/>
        
        <!-- 默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema; -->
        <property name="ignoreQualifiersAtRuntime" value="false"/>
        
        <!-- 参考 javaModelGenerator 的 immutable 属性 -->
        <property name="immutable" value="false"/>
        
        <!-- 指定是否只生成domain类,如果设置为true,只生成domain类,如果还配置了sqlMapGenerator,那么在mapper XML文件中,只生成resultMap元素 -->
        <property name="modelOnly" value="false"/>
        
        <!-- 参考 javaModelGenerator 的 rootClass 属性 
        <property name="rootClass" value=""/>
         -->
         
        <!-- 参考javaClientGenerator 的  rootInterface 属性
        <property name="rootInterface" value=""/>
        -->
        
        <!-- 如果设置了runtimeCatalog,那么在生成的SQL中,使用该指定的catalog,而不是table元素上的catalog 
        <property name="runtimeCatalog" value=""/>
        -->
        
        <!-- 如果设置了runtimeSchema,那么在生成的SQL中,使用该指定的schema,而不是table元素上的schema 
        <property name="runtimeSchema" value=""/>
        -->
        
        <!-- 如果设置了runtimeTableName,那么在生成的SQL中,使用该指定的tablename,而不是table元素上的tablename 
        <property name="runtimeTableName" value=""/>
        -->
        
        <!-- 注意,该属性只针对MyBatis3Simple有用;
            如果选择的runtime是MyBatis3Simple,那么会生成一个SelectAll方法,如果指定了selectAllOrderByClause,那么会在该SQL中添加指定的这个order条件;
         -->
        <property name="selectAllOrderByClause" value="age desc,username asc"/>
        
        <!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate -->
        <property name="useActualColumnNames" value="false"/>
        
        
        <!-- generatedKey用于生成生成主键的方法,
            如果设置了该元素,MBG会在生成的<insert>元素中生成一条正确的<selectKey>元素,该元素可选
            column:主键的列名;
            sqlStatement:要生成的selectKey语句,有以下可选项:
                Cloudscape:相当于selectKey的SQL为: VALUES IDENTITY_VAL_LOCAL()
                DB2       :相当于selectKey的SQL为: VALUES IDENTITY_VAL_LOCAL()
                DB2_MF    :相当于selectKey的SQL为:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
                Derby     :相当于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
                HSQLDB    :相当于selectKey的SQL为:CALL IDENTITY()
                Informix  :相当于selectKey的SQL为:select dbinfo(''sqlca.sqlerrd1'') from systables where tabid=1
                MySql     :相当于selectKey的SQL为:SELECT LAST_INSERT_ID()
                SqlServer :相当于selectKey的SQL为:SELECT SCOPE_IDENTITY()
                SYBASE    :相当于selectKey的SQL为:SELECT @@IDENTITY
                JDBC      :相当于在生成的insert元素上添加useGeneratedKeys="true"和keyProperty属性
        <generatedKey column="" sqlStatement=""/>
         -->
        
        <!-- 
            该元素会在根据表中列名计算对象属性名之前先重命名列名,非常适合用于表中的列都有公用的前缀字符串的时候,
            比如列名为:CUST_ID,CUST_NAME,CUST_EMAIL,CUST_ADDRESS等;
            那么就可以设置searchString为"^CUST_",并使用空白替换,那么生成的Customer对象中的属性名称就不是
            custId,custName等,而是先被替换为ID,NAME,EMAIL,然后变成属性:id,name,email;
            
            注意,MBG是使用java.util.regex.Matcher.replaceAll来替换searchString和replaceString的,
            如果使用了columnOverride元素,该属性无效;
            
        <columnRenamingRule searchString="" replaceString=""/>
         -->
         
         
         <!-- 用来修改表中某个列的属性,MBG会使用修改后的列来生成domain的属性;
            column:要重新设置的列名;
            注意,一个table元素中可以有多个columnOverride元素哈~
          -->
         <columnOverride column="username">
            <!-- 使用property属性来指定列要生成的属性名称 -->
            <property name="property" value="userName"/>
            
            <!-- javaType用于指定生成的domain的属性类型,使用类型的全限定名
            <property name="javaType" value=""/>
             -->
             
            <!-- jdbcType用于指定该列的JDBC类型 
            <property name="jdbcType" value=""/>
             -->
             
            <!-- typeHandler 用于指定该列使用到的TypeHandler,如果要指定,配置类型处理器的全限定名
                注意,mybatis中,不会生成到mybatis-config.xml中的typeHandler
                只会生成类似:where id = #{id,jdbcType=BIGINT,typeHandler=com._520it.mybatis.MyTypeHandler}的参数描述
            <property name="jdbcType" value=""/>
            -->
            
            <!-- 参考table元素的delimitAllColumns配置,默认为false
            <property name="delimitedColumnName" value=""/>
             -->
         </columnOverride>
         
         <!-- ignoreColumn设置一个MGB忽略的列,如果设置了改列,那么在生成的domain中,生成的SQL中,都不会有该列出现 
            column:指定要忽略的列的名字;
            delimitedColumnName:参考table元素的delimitAllColumns配置,默认为false
            
            注意,一个table元素中可以有多个ignoreColumn元素
         <ignoreColumn column="deptId" delimitedColumnName=""/>
         -->
    </table>
    
</context>

</generatorConfiguration>

作者:叩丁狼教育
链接:https://www.jianshu.com/p/e09d2370b796
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

5.我的配置,生成Mapper接口和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>
    <classPathEntry location="C:\mysql-connector-java-5.1.38.jar" />
    <context id="context1">
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter"
            value="org.mybatis.generator.api.dom.DefaultXmlFormatter" />
        <jdbcConnection
            connectionURL="jdbc:mysql://xxx.com:3306/db"
            driverClass="com.mysql.jdbc.Driver" password="root" userId="root" />
        <javaModelGenerator targetPackage="entity"
            targetProject="test/src" />
        <sqlMapGenerator targetPackage="entity" targetProject="test/src" />
        <javaClientGenerator targetPackage="entity" type="XMLMAPPER"
            targetProject="test/src" />
       <table schema="db" tableName="wp_posts" domainObjectName="Wpost" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <property name="useActualColumnNames" value="false" /> <columnOverride column="post_content" javaType="java.lang.String" jdbcType="VARCHAR" /> <columnOverride column="post_title" javaType="java.lang.String" jdbcType="VARCHAR" /> <columnOverride column="post_excerpt" javaType="java.lang.String" jdbcType="VARCHAR" /> <columnOverride column="to_ping" javaType="java.lang.String" jdbcType="VARCHAR" /> <columnOverride column="pinged" javaType="java.lang.String" jdbcType="VARCHAR" /> <columnOverride column="post_content_filtered" javaType="java.lang.String" jdbcType="VARCHAR" /> </table> </context> </generatorConfiguration>

 

运行和生成结果

 

 

 

mybatis mapper学习4-MyBatis的Mapper接口以及Example的实例函数及详解

mybatis mapper学习4-MyBatis的Mapper接口以及Example的实例函数及详解

mybatis3系列文章目录链接


mybatis能够自动生成sql语句,也能够添加自定义sql语句

使用mybatis generator生成XX.java,XXExample.java,XXmapper.java,XXmapper.xml四个数据库表映射文件,

 

一、Example实例解析

mybatis的逆向工程中会生成实例及实例对应的XXExample.java,XXExample.java包含了对象的常用查询方法

XXExample有三个内部类,GeneratedCriteria,Criteria,Criterion

创建内部类Criteria用于查询,代码示例如下看表达:

XXExample example = new  XXExample();//新建XX对象的example对象进行查询,XXExample继承XX
XXExample.Criteria  c = example.Criteria();//new一个当前example的内部类Criteria
c.andXXIsNull();//设置查询条件,某值为空
c.andXXIsNotNull();//设置查询条件,某值不空
//使用mapper进行查询
List<XX> data = new XXMapper.selectByExample(example);

 

方法 说明
example.setOrderByClause(“字段名 ASC”); 添加升序排列条件,DESC为降序
example.setDistinct(false) 去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull 添加字段xxx为null的条件
criteria.andXxxIsNotNull 添加字段xxx不为null的条件
criteria.andXxxEqualTo(value) 添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value) 添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value) 添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value) 添加xxx字段大于等于value条件
criteria.andXxxLessThan(value) 添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value) 添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>) 添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>) 添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”) 添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”) 添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2) 添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2) 添加xxx字段值不在value1和value2之间条件
 

二、mapper接口中的方法解析

mapper.java的函数及方法,按命名的字面意思理解用途。

countByExample,带example的一般都是使用example查询条目数。selectByPrimaryKey使用id查询结果集

 

mapper中的方法和xml中的sql语句是对应的,

如果在mapper中传入example对象,xml中会解析example的值,取值拼写sql语句进行查询

传入String类型的key,id等,xml直接取值拼写sql进行查询 

方法 功能说明
int countByExample(UserExample example) thorws SQLException 按条件计数
int deleteByPrimaryKey(Integer id) thorws SQLException 按主键删除
int deleteByExample(UserExample example) thorws SQLException 按条件查询
String/Integer insert(User record) thorws SQLException 插入数据(返回值为ID)
User selectByPrimaryKey(Integer id) thorws SQLException 按主键查询
ListselectByExample(UserExample example) thorws SQLException 按条件查询
ListselectByExampleWithBLOGs(UserExample example) thorws SQLException 按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。
int updateByPrimaryKey(User record) thorws SQLException 按主键更新
int updateByPrimaryKeySelective(User record) thorws SQLException 按主键更新值不为null的字段
int updateByExample(User record, UserExample example) thorws SQLException 按条件更新
int updateByExampleSelective(User record, UserExample example) thorws SQLException 按条件更新值不为null的字段

三、XML文件解析

举例一个xml文件中的一条语句

<select id="countByExample" parameterType="com.ctvit.cportal.core.config.entity.XXExample" resultType="java.lang.Integer" >
    select count(*) from t_app_second_config_item
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </select>

语句的id与mapper.java中的方法名对应,

parameterType是传入参数的类型,resultType是返回结果的类型,传参和返回有很多种情况,另开文章讲

这样对照起来的话,我们可以自主在mapper.java和mapper.xml中增加或删除相应的查询语句,以供调用

比如增加一条新增版本批量复制语句“copyBatchByVersion”

mapper.java中增加方法

int copyBatchByVersion(String old_version,String new_version) thorws SQLException;
/*根据旧版本号old_version查找记录
复制记录
同时将其中的old_version替换为new_version
返回值为复制成功的条数
*/

mapper.xml中增加语句

<insert id="copyBatchByVersion">
    insert into t_xx
    (XX_id,xx_value,xx_version)
    (select
    XX_id,xx_value,#{1})
    from t_xx where xx_version = #{0})
  </insert>

其中#{0},#{1}代表输入的第1,2个参数

 

四、应用举例

1.查询

① selectByPrimaryKey()

User user = XxxMapper.selectByPrimaryKey(100); //相当于select * from user where id = 100    

② selectByExample() 和 selectByExampleWithBLOGs()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
criteria.andUsernameIsNull();
example.setOrderByClause("username asc,email desc");
List<?>list = XxxMapper.selectByExample(example);
//相当于:select * from user where username = ''wyw'' and  username is null order by username asc,email desc

注:在iBator逆向工程生成的文件XxxExample.Java中包含一个static的内部类Criteria,Criteria中的方法是定义SQL 语句where后的查询条件。

2.插入数据

①insert()

User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("admin");
user.setPassword("admin")
user.setEmail("wyw@163.com");
XxxMapper.insert(user);
//相当于:insert into user(ID,username,password,email) values (''dsfgsdfgdsfgds'',''admin'',''admin'',''wyw@126.com'');

3.更新数据

①updateByPrimaryKey()

User user =new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("wyw");
user.setPassword("wyw");
user.setEmail("wyw@163.com");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set username=''wyw'', password=''wyw'', email=''wyw@163.com'' where id=''dsfgsdfgdsfgds''

②updateByPrimaryKeySelective()

User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setPassword("wyw");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set password=''wyw'' where id=''dsfgsdfgdsfgds''

③ updateByExample() 和 updateByExampleSelective()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
User user = new User();
user.setPassword("wyw");
XxxMapper.updateByPrimaryKeySelective(user,example);
//相当于:update user set password=''wyw'' where username=''admin''

updateByExample()更新所有的字段,包括字段为null的也更新,建议使用 updateByExampleSelective()更新想更新的字段

4.删除数据

①deleteByPrimaryKey()

XxxMapper.deleteByPrimaryKey(1);  //相当于:delete from user where id=1

②deleteByExample()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
XxxMapper.deleteByExample(example);
//相当于:delete from user where username=''admin''

5.查询数据数量

①countByExample()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
int count = XxxMapper.countByExample(example);
//相当于:select count(*) from user where username=''wyw''

countByExample

关于mybatis-@Mapper接口用法mybatis mapper接口的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于mybatis 3.3 , import tk.mybatis.mapper.mapperhelper.SqlHelper; 类不生成实体类某个字段、Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring、mybatis mapper学习1-mapper.xml映射文件生成:Mybatis Generator的下载-安装-配置-运行、mybatis mapper学习4-MyBatis的Mapper接口以及Example的实例函数及详解的相关信息,请在本站寻找。

本文标签: