如果对于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):
<?xml version="1.0" encoding="UTF-8" ?>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后面的语句加上条件,确保唯一
insert用来映射更新语句。以下就是一个undate标签的全部二级标签:
<update
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”
statementType=“PREPARED”
timeout=“20”
databaseId=“mysql”
lang=“”>
这里的标签除了少了useGeneratedKeys,keyProperty和keyColumn三个标签之外,其余的和insert,update一样。
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。
如下是一个最简单的例子:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
架构学习资料
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
大家的负担。**
[外链图片转存中…(img-oeUTAozL-1710745028441)]
[外链图片转存中…(img-7OlT3ij7-1710745028442)]
[外链图片转存中…(img-teOiCeqy-1710745028442)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-IDTh9Y6x-1710745028443)]
架构学习资料
[外链图片转存中…(img-frz8vR2E-1710745028443)]
[外链图片转存中…(img-5SkMdpqx-1710745028444)]
[外链图片转存中…(img-K5gV6hWQ-1710745028444)]
[外链图片转存中…(img-qeBURaIi-1710745028444)]
[外链图片转存中…(img-5C31pIhb-1710745028445)]
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!