0


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")@ResponseBodypublicintinsertUser(User user){
    userDao.insertUser(user);return1;}

在这里插入图片描述

在这里插入图片描述

查看效果

启动项目,在浏览器中输入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方法

intdelete(Integer id);

在这里插入图片描述

配置controller层

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

@RequestMapping("/delete")@ResponseBodypublicintdelete(Integer id){
        userDao.delete(id);return1;}
查看效果

重新启动项目,浏览器地址栏输入想要删除的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接口中加入方法

intupdate(User user);
配置controller层

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

@RequestMapping("/update")@ResponseBodypublicintupdate(User user){
        userDao.update(user);return1;}

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

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中写入方法

UserfindById(Integer id);

在UserController中加入

@RequestMapping("/findById")@ResponseBodypublicUserfindById(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")@ResponseBodypublicList<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类中写入以下代码

classSpringBoot2024ApplicationTests{@AutowiredprivateUserDao userDao;@TestvoidcontextLoads(){System.out.println("开始插入======");long start =System.currentTimeMillis();int count =1000;for(int i =0; i < count; i++){User user =newUser();
            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方法

voidbatchInsert(@Param("users")List<User> users);

在SpringBoot2024ApplicationTests类中修改代码

voidcontextLoads(){System.out.println("开始插入======");long start =System.currentTimeMillis();int count =10000;List<User> users =newArrayList<User>(count);for(int i =0; i < count; i++){User user =newUser();
            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类中修改代码

voidcontextLoads(){System.out.println("开始插入======");long start =System.currentTimeMillis();int count =1000000;List<User> users =newArrayList<User>(count);int tempCount =0;for(int i =0; i < count; i++){if(tempCount ==9999){
                userDao.batchInsert(users);
                tempCount =0;
                users.clear();}User user =newUser();
            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秒
在这里插入图片描述


本文转载自: https://blog.csdn.net/a289246/article/details/138589397
版权归原作者 JiaIYzzz 所有, 如有侵权,请联系我们删除。

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

还没有评论