上一篇: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秒