mybatis向mysql中插入数据返回自增id 注解+xml方式

介绍

当我们准备向两张有关联的表中(父、子)插入完整数据时,就需要在第一次插入父表数据后获取自增id,之后在子表中关联此id

返回的自增id会设置为原对象的id,也就是插入之前用户id为null或者0,插入之后该用户的id为自增id

注解方式

说明

@SelectKey(keyProperty = "id"//对应要返回的实体属性
		,keyColumn = "id"//对应数据库中的自增列名称
		,before = false//在更新语句执行之前返回还是之后返回
		,resultType = Integer.class//和id类型相匹配
		,statement = "select last_insert_id()")//查询插入后的自增id

还有一个属性为 statementType,默认值为StatementType.PREPARED
也就是预编译PreparedStatement

使用

UserDao

	@Insert("insert into user values(null,#{username},#{password})")
    @SelectKey(keyProperty = "id",keyColumn = "id",before = false,resultType = Integer.class,statement = "select last_insert_id()")
    int addUserTest(User user);

    @Select("select * from user")
    List<User> getUsers();

测试类

	@Test
    public void testSelectUser(){
        List<User> user = userDao.getUsers();
        System.out.println("lastUser = " + user);//数据库中上一个用户
        User user1=new User();
        user1.setUsername("小明");
        user1.setPassword("123456");
        System.out.println("userBeforeInsert = " + user1);//插入之前的用户
        userDao.addUserTest(user1);
        System.out.println("userAfterInsert = " + user1);//插入之后的用户
    }

为了便于结果比较,数据库在插入之前只有一条数据

在这里插入图片描述

xml方式

说明

useGeneratedKeys 只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回至原对象。

使用

UserDao

	int addUserTest(User user);
	
    @Select("select * from user")
    List<User> getUsers();

UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--引入DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.ahy.dao.UserDao">
    <insert id="addUserTest" useGeneratedKeys="true" keyProperty="id" parameterType="com.ahy.pojo.User">
        insert into user values(null,#{username},#{password})
    </insert>
</mapper>

测试结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于如何在Spring Boot应用实现多数据源动态切换,使用的技术包括Spring Boot、MyBatisMySQL、Oracle、Druid数据源连接池、自定义注解和切面,并且配置文件使用application.yml格式。 首先,需要在pom.xml文件添加相应的依赖: ```xml <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <!--Oracle--> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <!--Druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 接下来,需要在application.yml文件配置数据源和MyBatis相关的属性,例如: ```yaml spring: datasource: druid: # 数据源1 db1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root # 数据源2 db2: driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:ORCL username: scott password: tiger # 默认数据源 url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity ``` 然后,需要定义一个自定义注解,用于标识哪些方法需要使用哪个数据源: ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { String value() default "db1"; } ``` 在数据源切换的时候,我们需要获取注解上指定的数据源名称,因此需要定义一个切面: ```java @Aspect @Component public class DataSourceAspect { @Around("@annotation(ds)") public Object around(ProceedingJoinPoint point, DataSource ds) throws Throwable { String dataSourceName = ds.value(); DynamicDataSource.setDataSource(dataSourceName); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 最后,需要定义一个动态数据源,用于实现数据源的切换: ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>(); @Override protected Object determineCurrentLookupKey() { return dataSourceHolder.get(); } public static void setDataSource(String dataSourceName) { dataSourceHolder.set(dataSourceName); } public static void clearDataSource() { dataSourceHolder.remove(); } } ``` 至此,多数据源动态切换的配置就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值