Mybatis--------------------增删改查、主键返回

本文介绍了Mybatis在MySQL和ORACLE环境下处理自增主键的方法,包括MySQL的LAST_INSERT_ID()函数用于获取自增ID,以及ORACLE中通过sequence获取主键的方式。
摘要由CSDN通过智能技术生成
import com.dong.model.User;
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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class TestDemo {
    SqlSession sqlSession;

    @Before
    public void before() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession();

    }

    @After
    public void after() throws IOException {
        sqlSession.close();

    }
    //根据id查询数据
    @Test
    public void Test01(){
        User user= sqlSession.selectOne("findUserById",10);
        System.out.println(user);
    }
    //根据username模糊查询数据
    @Test
    public void Test02(){
        List<User> user = sqlSession.selectList("findUserByName", "张");
        System.out.println(user);
    }
    //增
    @Test
    public void Test03(){
        User user=new User("dong","男",new Date(),"深圳");

      int rownum = sqlSession.insert("InsertUser", user);
      sqlSession.commit();
        System.out.println("受影响的行:"+rownum);
    }
    //改
    @Test
    public void Test04(){
        User user=new User();
        user.setSex("2");
     user.setId(28);
        int rownum = sqlSession.update("UpdateUser", user);
        sqlSession.commit();
        System.out.println("受影响的行:"+rownum);
    }
    //删

    @Test
    public void Test05(){

        int rownum = sqlSession.delete("deleuser", 28);
        sqlSession.commit();
        System.out.println("受影响的行:"+rownum);
    }

    //返回最后插入的id

    @Test
    public void Test06(){

        User user=new User("dong","男",new Date(),"深圳");

        int rownum = sqlSession.insert("InsertUser2", user);
        sqlSession.commit();
        System.out.println("id:"+user.getId());
    }
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离
   注意:使用mapper代理开发时,namespace有特殊且重要的作用
 -->
<mapper namespace="test">
    <!--
        [id]:statement的id,要求在命名空间内唯一
        [parameterType]:入参的java类型
        [resultType]:查询出的单条结果集对应的java类型
        [#{}]: 表示一个占位符?
        [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义
     -->
    <select id="findUserById" parameterType="int" resultType="com.dong.model.User">
      SELECT * FROM USER WHERE id = #{id}
   </select>


    <select id="findUserByName" parameterType="String" resultType="com.dong.model.User">
      SELECT * FROM USER WHERE username like '%${value}%'
   </select>

    <insert id="InsertUser" parameterType="com.dong.model.User">
      insert into user(username,birthday,sex,address)
      value (#{username},#{birthday},#{sex},#{address})
   </insert>

    <update id="UpdateUser" parameterType="com.dong.model.User">
      update user set sex= #{sex} where id=#{id}
   </update>

    <delete id="deleuser" parameterType="int">
      delete from user where id=#{id}
   </delete>

    <!--
            [selectKey标签]:通过select查询来生成主键
            [keyProperty]:指定存放生成主键的属性
            [resultType]:生成主键所对应的Java类型
            [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句
            [last_insert_id]:MySQL的函数,要配合insert语句一起使用 -->

    <insert id="InsertUser2" parameterType="com.dong.model.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select last_insert_id()
        </selectKey>
        insert into user(username,birthday,sex,address)
        value (#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

 

 

主键返回之MySQL自增主键 

思路:

  • MySQL自增主键,是指在insert之前MySQL会自动生成一个自增的主键。
  • 我们可以通过MySQL的函数获取到刚插入的自增主键:

LAST_INSERT_ID()

  • 这个函数是在insert语句之后去调用。

 

<insert id="insertUser" parameterType="com.gyf.domain.User">

       <!--

           [selectKey标签]:通过select查询来生成主键

           [keyProperty]:指定存放生成主键的属性

           [resultType]:生成主键所对应的Java类型

           [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句

           [last_insert_id]:MySQL的函数,要配合insert语句一起使用 -->

       <selectKey keyProperty="id" resultType="int" order="AFTER">

           SELECT LAST_INSERT_ID()

       </selectKey>

       <!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给ID赋值 -->

       INSERT INTO USER (username,sex,birthday,address)

       VALUES(#{username},#{sex},#{birthday},#{address})

</insert>

 

主键返回之MySQL自增UUID

<insert id="insertUser" parameterType="com.gyf.domain.User">

       <selectKey keyProperty="id" resultType="String" order="BEFORE">

           SELECT UUID()

       </selectKey>

       INSERT INTO USER (username,sex,birthday,address)

       VALUES(#{username},#{sex},#{birthday},#{address})

</insert>

 

ORCLE主键

SELECT user_seq.nextval() FROM dual

 

小结:

parameterType和resultType

parameterType指定输入参数的java类型,可以填写别名或Java类的全限定名。

resultType指定输出结果的java类型,可以填写别名或Java类的全限定名。

 

#{}和${}

#{}:相当于预处理中的占位符?。

#{}里面的参数表示接收java输入参数的名称。

#{}可以接受HashMap、POJO类型的参数。

当接受简单类型的参数时,#{}里面可以是value,也可以是其他。

#{}可以防止SQL注入。

${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

${}会引起SQL注入,所以要谨慎使用。

${}可以接受HashMap、POJO类型的参数。

当接受简单类型的参数时,${}里面只能是value。

 

selectOne和selectList

selectOne:只能查询0或1条记录,大于1条记录的话,会报错:

selectList:可以查询0或N条记录

 

### 回答1: 在使用Mybatis-Plus框架进行增、删、改、查操作,获取主键的方式有多种。 1.自动生成主键 Mybatis-Plus框架提供了主键生成策略,可以自动生成主键值,并将其赋给实体类属性。如: ``` User user = new User(); user.setName("张三"); user.setAge(20); user.setEmail("zhangsan@163.com"); // 插入,自动生成主键 userMapper.insert(user); // 获取主键值 Long id = user.getId(); ``` 2.手动设置主键 在实体类中添加@Id注解,指定主键属性。手动设置主键,需要在插入记录设置主键值。如: ``` @Table(value = "user") public class User { @Id private Long id; private String userName; private Integer age; private String email; // getter、setter方法 } // 在增加记录手动设置主键值 User user = new User(); user.setId(1001L); user.setUsername("张三"); user.setAge(20); user.setEmail("zhangsan@163.com"); // 插入记录,手动设置主键 userMapper.insert(user); // 获取主键值 Long id = user.getId(); ``` 3.使用MySQL自增主键 在实体类的@Id注解中设置@GeneratedValue注解的strategy属性为GenerationType.IDENTITY,表示使用数据库的自增主键。如: ``` @Table(value = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // MySQL自增主键 private Long id; private String userName; private Integer age; private String email; // getter、setter方法 } // 插入记录,返回自动生成的主键值 User user = new User(); user.setUserName("张三"); user.setAge(20); user.setEmail("zhangsan@163.com"); // 插入自动生成主键 userMapper.insert(user); // 获取主键值 Long id = user.getId(); ``` 以上是使用MyBatis-Plus框架获取主键的三种方法。 ### 回答2: mybatis-plus 是基于 MyBatis 的增强工具,它提供了很多方便的功能。它的主键自动生成方式分为两种:自增主键和UUID主键,获取主键的方法也有所不同。 对于自增主键,使用insert方法,可以通过返回值的方式获取自增生成的主键MyBatis-Plus提供了三种方法来获取自增主键:insert、insertBatch和insertBatchSomeColumn。 1. insert方法 在使用insert方法,通过返回值获取自增生成的主键,如下: ```java User user = new User(); user.setName("test"); user.setAge(18); int success = userMapper.insert(user); if (success == 1) { System.out.println("插入成功,主键ID为:" + user.getId()); } ``` 当插入成功,可以通过user.getId()获取自增生成的主键。 2. insertBatch方法 在使用insertBatch方法,传入的是一个List对象。如果这个List里面的元素的id属性为空,那么MyBatis-Plus会自动生成一个主键,并将此id赋值给List中的元素,如下: ```java List<User> userList = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setName("test" + i); user.setAge(18 + i); userList.add(user); } int success = userMapper.insertBatch(userList); if (success == userList.size()) { for (User user : userList) { System.out.println("插入成功,主键ID为:" + user.getId()); } } ``` 当插入成功,可以通过每个元素的user.getId()获取自增生成的主键。 3. insertBatchSomeColumn方法 在使用insertBatchSomeColumn方法,需要在传入的DTO中指定需要生成主键的列,并且要将这些列的值都设置为null。接下来的操作与insertBatch方法类似,只是在DTO中指定需要生成主键的列,如下: ```java List<User> userList = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setName("test" + i); user.setAge(18 + i); user.setId(null); userList.add(user); } int success = userMapper.insertBatchSomeColumn(userList); if (success == userList.size()) { for (User user : userList) { System.out.println("插入成功,主键ID为:" + user.getId()); } } ``` 当插入成功,可以通过每个元素的user.getId()获取自增生成的主键。 对于UUID主键,使用insert方法,在插入数据后,可以通过获取实体类Id属性的值来获取UUID主键,如下: ```java User user = new User(); user.setName("test"); user.setAge(18); userMapper.insert(user); System.out.println("插入成功,主键ID为:" + user.getId()); ``` 当插入成功,可以通过user.getId()获取UUID主键。 综上所述,mybatis-plus 获取主键是非常方便的,而且还支持多种不同的主键生成方式。对于业务开发中常用的自增主键和UUID主键mybatis-plus都提供了对应的获取主键的方式。 ### 回答3: Mybatis-plus是一个基于Mybatis的开源框架,提供了很多Mybatis的扩展功能,其中获取主键就是其中之一。在使用Mybatis-plus进行数据库操作,获取主键的方法有多种,具体如下: 1.自增类型的主键 如果数据表中的主键是通过自增方式生成的,那么在插入新数据主键会自动增加,Mybatis-plus会将新增的主键返回给我们。 示例代码: ```java User user = new User(); user.setName("张三"); user.setAge(18); user.setGender("男"); userMapper.insert(user); System.out.println("新增用户的主键为:" + user.getId()); ``` 2.非自增类型的主键 如果数据表中的主键不是自增类型,我们需要自己为其指定主键Mybatis-plus提供了一个IdWorker工具类,可以生成各种类型的主键。 示例代码: ```java Long id = IdWorker.getId(); //生成主键 User user = new User(); user.setId(id); user.setName("张三"); user.setAge(18); user.setGender("男"); userMapper.insert(user); System.out.println("新增用户的主键为:" + id); ``` 3.仅返回新增主键 如果我们只需要获取新增数据的主键,而不需要获取其他字段的值,可以使用insert(…)方法的返回值进行获取。 示例代码: ```java User user = new User(); user.setName("张三"); user.setAge(18); user.setGender("男"); int result = userMapper.insert(user); if(result > 0){ System.out.println("新增用户的主键为:" + user.getId()); } ``` 4.使用注解返回主键 如果我们在实体类中通过注解指定了主键字段,那么在插入数据主键会自动赋值,可通过实体类对象获取主键。 示例代码: ```java public class User{ @TableId(type = IdType.AUTO) //指定主键,type为主键类型,AUTO为自增 private Long id; private String name; private Integer age; private String gender; //省略get/set方法 } User user = new User(); user.setName("张三"); user.setAge(18); user.setGender("男"); userMapper.insert(user); System.out.println("新增用户的主键为:" + user.getId()); ``` 以上是Mybatis-plus获取主键的几种方法,选择哪种方法取决于实际需求,一般情况下我们可以通过自增类型的主键或IdWorker工具类进行获取主键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值