SpringBoot项目中对数据库的基本操作+批量插入数据的优化

上一篇:Maven的安装配置+SpringBoot项目的创建+SpringBoot项目中mybatis的配置+示例:如何查询表中数据

本篇文章:SpringBoot项目中对数据库的基本操作+批量插入数据的优化

一、user表的基本信息

其中的id字段自动递增
在这里插入图片描述

二、SpringBoot项目中对数据库的基本操作

首先在mapper目录下新建UserMapper.xml文件(这里使用的是自己创建的模板文件,具体如何创建可以看上一篇博客)
在这里插入图片描述
文件内容

<?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">
<mapper namespace="">

</mapper>

2.1 插入单条数据

配置mapper层

在xml文件中写入insert语句,这里我传入的参数为com.example.springboot2024.entity.User

<insert id="insertUser" parameterType="com.example.springboot2024.entity.User">

    insert into user (name,password,phone,age) values (#{name},#{password},#{phone},#{age})

</insert>

在这里插入图片描述

配置dao层

在dao包下的UserDao接口中,加入insertUser方法,这里的方法名需要跟UserMapper.xml中insert语句中的id名保持一致

在这里插入图片描述

在这里插入图片描述

配置controller层

在controller包下的UserController类中加入如下内容

@RequestMapping("/insertUser")
@ResponseBody
public int insertUser(User user){
    userDao.insertUser(user);
    return 1;
}

在这里插入图片描述

在这里插入图片描述

查看效果

启动项目,在浏览器中输入localhost:8080/user/insertUser?name=LiMing&password=123&age=18&phone=1234567890

效果如下

在这里插入图片描述

2.2 删除数据

配置mapper层

在mapper中的UserMapper.xml文件中写入删除语句,传入的参数类型为Integer

<delete id="delete" parameterType="java.lang.Integer">
     delete from user where id = #{id}
</delete>
配置dao层

在dao包下的UserDao接口中写入delete方法

int delete(Integer id);

在这里插入图片描述

配置controller层

在controller包下的UserController类中加入如下代码

    @RequestMapping("/delete")
    @ResponseBody
    public int delete(Integer id){
        userDao.delete(id);
        return 1;
	}
查看效果

重新启动项目,浏览器地址栏输入想要删除的id,可以查看数据库中指定的数据已被删除

在这里插入图片描述

2.3 修改数据

配置mapper层

在mapper目录下的UserMapper.xml文件中写入update语句,传入的参数类型为User

    <update id="update" parameterType="com.example.springboot2024.entity.User" >
        update user set name=#{name},age=#{age},password=#{password},phone=#{phone} where id =#{id}
    </update>
配置dao层

在dao包下的UserDao接口中加入方法

int update(User user);
配置controller层

在controller包下的UserController类中加入以下代码

    @RequestMapping("/update")
    @ResponseBody
    public int update(User user){
        userDao.update(user);
        return 1;
    }

查看效果
重新启动项目,浏览器输入
在这里插入图片描述
更新前
在这里插入图片描述
更新后
在这里插入图片描述

2.4 查询数据

查询数据----参数类型相同

比如按照id查询,传入的参数类型为Integer
在UserMapper.xml中写入语句

    <select id="findById" resultType="com.example.springboot2024.entity.User" parameterType="java.lang.Integer">
        select * from user where id = #{id}
    </select>

在UserDao中写入方法

User findById(Integer id);

在UserController中加入

    @RequestMapping("/findById")
    @ResponseBody
    public User findById(Integer id){
        return userDao.findById(id);
    }

重新启动项目,打开浏览器输入http://localhost:8080/user/findById?id=10010009
在这里插入图片描述

查询数据----参数类型不同

这里跟上一种不一样的地方在于修改查询语句,将传入的参数类型修改为User

    <!--  多个参数,类型不同  -->
    <select id="findByNameAndAge" resultType="com.example.springboot2024.entity.User" parameterType="com.example.springboot2024.entity.User">
        select * from user where name = #{name} and age = #{age}
    </select>

在UserDao中写入

    List<User> findByNameAndAge(String name,Integer age);

在UserController中加入

    @RequestMapping("/findByNameAndAge")
    @ResponseBody
    public List<User> findByNameAndAge(String name,Integer age){
        return userDao.findByNameAndAge(name,age);
    }

查看效果

重新启动项目,浏览器输入localhost:8080/user/findByNameAndAge?name=张三&age=18
在这里插入图片描述

三、批量插入数据的优化

批量插入1000条数据(一千条)

首先在UserMapper.xml文件中写好insert语句

    <insert id="insertUser" parameterType="com.example.springboot2024.entity.User">

        insert into user (name,password,phone,age) values (#{name},#{password},#{phone},#{age} )

    </insert>

打开test包下的测试类
在这里插入图片描述
在SpringBoot2024ApplicationTests类中写入以下代码

class SpringBoot2024ApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void contextLoads() {
        System.out.println("开始插入======");
        long start = System.currentTimeMillis();
        int count = 1000;
        for(int i = 0; i < count; i++){
            User user = new User();
            user.setName("san" + i);
            user.setAge(18);
            user.setPassword("123");
            user.setPhone("123");
            userDao.insertUser(user);
        }
        
        System.out.println("共插入"+count+"条数据,耗时:"+(System.currentTimeMillis()-start));
    }


}

然后运行这个类,相当于是插入单条数据,插入1000次,运行时间大概43秒
在这里插入图片描述

批量插入10000条数据(一万条)

修改参数count改为一万,运行结束之后发现时间非常长,这里测试将近六分钟,接着安照这种方式插入一百万条,批量插入就报错了
在UserMapper.xml中重新写入insert语句

    <insert id="batchInsert" parameterType="java.util.List">
        insert into user(name ,password,age,phone) values
        <foreach collection="users" item="user" index="index" separator=",">
            (
             #{user.name},
            #{user.password},
            #{user.age},
            #{user.phone}
            )
        </foreach>
    </insert>

在UserDao中加入batchInsert方法

void batchInsert(@Param("users") List<User> users);

在SpringBoot2024ApplicationTests类中修改代码

    void contextLoads() {
        System.out.println("开始插入======");
        long start = System.currentTimeMillis();
        int count = 10000;

        List<User> users = new ArrayList<User>(count);
        for(int i = 0; i < count; i++){
            User user = new User();
            user.setName("san" + i);
            user.setAge(18);
            user.setPassword("123");
            user.setPhone("123");
            users.add(user);

        }
        userDao.batchInsert(users);
        System.out.println("共插入"+count+"条数据,耗时:"+(System.currentTimeMillis()-start));
    }

此时插入1000条数据仅需0.7秒
在这里插入图片描述
修改参数count=10000,插入一万条,耗时2.3秒
在这里插入图片描述
但是插入一百万条数据还是会报错,接下来尝试优化程序,使其能够满足我们的要求

批量插入1000000数据(一百万条)

在SpringBoot2024ApplicationTests类中修改代码

    void contextLoads() {
        System.out.println("开始插入======");
        long start = System.currentTimeMillis();
        int count = 1000000;

        List<User> users = new ArrayList<User>(count);
        int tempCount = 0;
        for(int i = 0; i < count; i++){

            if(tempCount == 9999){
                userDao.batchInsert(users);
                tempCount = 0;
                users.clear();
            }

            User user = new User();
            user.setName("san" + i);
            user.setAge(18);
            user.setPassword("123");
            user.setPhone("123");
            users.add(user);
            tempCount ++;
        }
        userDao.batchInsert(users);
        System.out.println("共插入"+count+"条数据,耗时:"+(System.currentTimeMillis()-start));
    }

其中count为插入数据的总条数,这里设置的是一百万,tempCount是每到一万条数据,就往数据库中插入,一百万条数据结束耗时39秒
在这里插入图片描述
这样的结果比单条插入1000条数据还要快,相对于插入一万条数据耗时也非常快,如果修改参数tempCount,其实还可以收到意想不到的效果
修改参数tempCount为3万,此时插入一百万条数据耗时31秒
在这里插入图片描述

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值