上一篇: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秒
版权归原作者 JiaIYzzz 所有, 如有侵权,请联系我们删除。