栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【MyBatis系列3】收藏,深信服java社招面试

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【MyBatis系列3】收藏,深信服java社招面试

  • lang

  • insert

    • useGeneratedKeys
  • keyProperty

  • keyColumn

  • 获取自增主键

  • 通过selectKey获取自定义列

  • update

  • delete

  • sql

  • cache

    • type
  • eviction

  • flushInterval

  • readOnly

  • size

  • cache-ref

  • resultMap

  • parameterMap

  • 总结

前言

===============================================================

MyBatis的强大之处就在于它的映射器文件,而这也正是MyBatis的魔力所在,对于任何MyBatis的使用者来说,MyBatis的映射文件是必须要掌握的。

Mapper文件标签

=======================================================================

Mapper中一个提供了9个顶层标签,除了1个已经过期的我们不需要去了解,另外8个都是必须要掌握的,只要熟练掌握了标签的使用,使用MyBatis才能如鱼得水。接下来我们就一个个来分析一下这些标签的使用。

select


select用来映射查询语句,是我们使用最多的一种标签,也是最复杂的一种标签。比如下面就是一个简单的select标签的使用:

select user_id,user_name from lw_user where user_name=#{userName}

select标签内,提供了一些二级标签,下面就列举出了全部的二级标签:

id=“selectPerson”

parameterType=“int”

parameterMap=“deprecated”

resultType=“hashmap”

resultMap=“personResultMap”

flushCache=“false”

useCache=“true”

timeout=“10000”

fetchSize=“256”

statementType=“PREPARED”

resultSetType=“FORWARD_ONLY”

databaseId=“mysql”

resultOrdered=“false”

resultSets=“xxx,xxx”

lang="">

id

必选标签。同一个命名空间里面的唯一标识符,如果需要被外部接口调用,则需要和Mapper接口中的方法名保持一致。

parameterType

可选标签。参数类的完全限定名或别名,上面示例中的表示我们传入的参数是一个String类型(关于别名如果不清楚的可以点击这里)。如果不写这个属性的话,MyBatis在解析xml文件的时候会默认设为unset,然后根据TypeHandler推断出参数类型。如果有多个参数的情况下建议还是不写这个参数,否则可能会出现参数类型转换错误

parameterMap

这是一个过期的属性,我们不做讨论。

resultType

非必选标签。注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。主要是用来定义一个返回结果集对象的全限定名或者别名。如果接收参数是一个集合,那么这里定义的就是集合中可以包含的类型,而并不是集合本身。

比如示例中的写法,那么对应Mapper接口中,适用于以下两种语句:

LwUser listUserByUserName(@Param(“userName”) String userName);

List listUserByUserName(@Param(“userName”) String userName);

resultMap

非必选标签。注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。resultMap类型的结果集映射,是MyBatis最强大的特性,在这里我们不展开,过两天会有一篇单独介绍MyBatis一对一和一对多等复杂查询时候会单独介绍该属性。感兴趣的可以先关注我,留意后面的文章。

flushCache

可选标签。设置为 true时,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。

useCache

可选标签。设置为 true时将会导致本条语句的结果被二级缓存,对 select 标签语句默认值为true,对insert,delete,update等语句默认是false。

timeout

可选标签。这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。

fetchSize

可选标签。这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。注意这个只是尝试,假如把fetchSize设置为10万,而数据库驱动最高只支持到5w,那么也会只能返回5w数据

statementType

可选标签。可以选择:STATEMENT,PREPARED 或 CALLABLE 中的一个,这会让 MyBatis 分别使用Statement,PreparedStatement 或 CallableStatement,默认值是PREPARED,也就是使用预编译PreparedStatement 语句。

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

resultSetType

可选标签。可以选择以下三种类型中的一个,默认为unset(依赖驱动)。

  • FORWARD_ONLY:只允许游标向前访问

  • SCROLL_SENSITIVE:允许游标双向滚动,但不会及时更新数据,也就是说如果数据库中的数据被修改过,并不会在resultSet中体现出来

  • SCROLL_INSENSITIVE:许游标双向滚动,如果数据库中的数据被修改过,会及时更新到resultSet

上面的解释可能有些人还是看不明白,我们先来看一段JDBC读取结果集的操作:

而MyBatis只是把这些操作封装了,底层实际上还是这个操作,rs.next()游标向前滚,其实还有一个rs.previous()表示游标可以向后滚。

所以FORWARD_ONLY只允许向前滚,访问过的数据就会释放内存,在某些场景中可以提升性能。

后面那两个都是允许双向滚动,所以即使访问过得数据,内存也不能释放。这两个的区别就是一个对数据敏感,一个对数据不敏感。

  • 对数据不敏感 就是说当我们查询出结果之后,会将整个结果集都缓存在内存中,假如有一条数据还没读取到(还在while循环中)这时候有另外一个线程修改了这条数据,那么当我们后面读取这条数据的时候,还是读取到修改之前的。

  • 对数据敏感 就是说当我们查询出结果之后,只会缓存一个rowid,而并不会缓存整条数据,假如有一条数据还没读取到(还在while循环中)这时候有另外一个线程修改了这条数据,那么当我们后面读取这条数据的时候,会根据rowid去查询数据,查询到的就是最新的数据。不过需要注意的是,因为delete的时候数据其实还在,只是打了个标记,所以如果一条数据被删除了,是体现不出来的。同理,insert也不影响,因为查询出来的数据不包含insert数据的rowid。

如果对于MySQL的InnoDB引擎的MVCC机制,那么数据肯定是不会敏感的,因为其他事务改了当前事务也看不到。

databaseId

可选标签。数据库厂商id,详细了解,可以点击这里。

resultOrdered

可选标签。这个设置仅针对嵌套结果 select 语句适用。如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值: false 。

resultSets

可选标签。这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。

lang

自定义语言,这个我也没用过,所以就不介绍了

insert


insert用来映射插入语句。以下就是一个insert标签的全部二级标签:

id=“insertLwUser”

parameterType=“lwUser”

parameterMap=“deprecated”

flushCache=“true”

statementType=“PREPARED”

keyProperty=""

keyColumn=""

useGeneratedKeys=""

timeout=“20”

databaseId=“mysql”

lang="">

有一些标签和select语句是重复的就不在重复介绍,主要来关注一下其他标签。

useGeneratedKeys

可选标签。配置为true时,MyBatis会使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值为false。

keyProperty

可选标签。唯一标记一个属性,MyBatis会将通过getGeneratedKeys 的返回值或者通过insert 语句的selectKey 子元素设置它的键值,默认值是unset 。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表

keyColumn

通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是

逗号分隔的属性名称列表

获取自增主键

获取自增主键,可以通过keyProperty来映射

定义一个实体类:

package com.lonelyWolf.mybatis.model;

public class UserAddress {

private int id;

private String address;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

定义一个UserAddressMapper.java接口:

package com.lonelyWolf.mybatis.mapper;

import com.lonelyWolf.mybatis.model.UserAddress;

import org.apache.ibatis.annotations.Param;

public interface UserAddressMapper {

int insert(UserAddress userAddress);

}

注意:这里参数如果直接只有一个的话可以不适用@Param注解,这样在xml文件中可以直接使用JavaBean内的属性名。如果使用了@Param注解,如下:

int insert(@Param(“userAddress”) UserAddress userAddress);

那么xml文件中就可以使用#{userAddress.属性名}来获取属性JavaBean内的属性

定义一个UserAddressMapper.xml映射文件(keyProperty="id"表示把主键的值设置到参数UserAddress类中的属性id):

insert into lw_user_address (address) values (#{address})

mybatis-config.xml中要新增mapper映射文件配置:

然后写一个测试类:

package com.lonelyWolf.mybatis;

import com.lonelyWolf.mybatis.mapper.UserAddressMapper;

import com.lonelyWolf.mybatis.model.UserAddress;

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 java.io.IOException;

import java.io.InputStream;

public class TestMyBatisInsert {

public static void main(String[] args) throws IOException {

String resource = “mybatis-config.xml”;

//读取mybatis-config配置文件

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建SqlSessionFactory对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//创建SqlSession对象

SqlSession session = sqlSessionFactory.openSession();

try {

UserAddress userAddress = new UserAddress();

userAddress.setAddress(“广东深圳”);

UserAddressMapper userAddressMapper = session.getMapper(UserAddressMapper.class);

int i = userAddressMapper.insert(userAddress);

session.commit();

System.out.println(“插入成功数:” + i);

System.out.println(“插入数据的主键为:” + userAddress.getId());

}finally {

session.close();

}

}

}

输出结果(成功获取到了插入数据的主键):

插入成功数:1

插入数据的主键为:1

通过selectKey获取自定义列

假如有些数据库不支持自增主键,或者说我们想插入自定义的主键,而又不想在业务代码中编写逻辑,那么就可以通过MyBatis的selectKey来获取。

UserAddressMapper.java中新建一个方法:

int insert2(UserAddress userAddress);

然后在UserAddressMapper.xml中对应新增一个insert2语句:

select uuid() from lw_user_address

insert into lw_user_address (address) values (#{address})

然后修改测试类:

try {

UserAddress userAddress = new UserAddress();

UserAddressMapper userAddressMapper = session.getMapper(UserAddressMapper.class);

int i = userAddressMapper.insert2(userAddress);

session.commit();

System.out.println(“插入成功数:” + i);

System.out.println(“插入数据的address为:” + userAddress.getAddress());

}finally {

session.close();

}

输出结果如下,成功获得了我们自定义的address:

插入成功数:1

插入数据的address为:097dfc8b-f043-11ea-97c4-00163e12524a

selectKey中的order属性有2个选择:BEFORE和AFTER。

  • BEFORE:表示先执行selectKey的语句,然后将查询到的值设置到JavaBean对应属性上,然后再执行insert语句。

  • AFTER:表示先执行AFTER语句,然后再执行selectKey语句,并将selectKey得到的值设置到JavaBean中的属性。上面示例中如果改成AFTER,那么插入的address就会是空值,但是返回的JavaBean属性内会有值。

PS:selectKey中返回的值只能有一条数据,如果满足条件的数据有多条会报错,所以一般都是用于生成主键,确保唯一,或者在selectKey后面的语句加上条件,确保唯一

update


insert用来映射更新语句。以下就是一个undate标签的全部二级标签:

id=“UpdateLwUser”

parameterType=“lwUser”

parameterMap=“deprecated”

flushCache=“true”

statementType=“PREPARED”

keyProperty=""

keyColumn=""

useGeneratedKeys=""

timeout=“20”

databaseId=“mysql”

lang="">

这个标签和insert基本一致,就不重复解释了。

delete


delete用来映射删除语句。以下就是一个delete标签的全部二级标签:

id=“insertLwUser”

parameterType=“lwUser”

parameterMap=“deprecated”

flushCache=“true”

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678455.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号