每次对数据库添加和删除数据,都是单条数据进行操作是不是很麻烦?
接下来,我们来对数据库的数据进行一个批量操作,完成批量的添加和修改!
实现其实也是非常简单的,主要是用到Mybatis的动态sql。众所周知,MyBatis一个强大的特性之一通常是它的动态 SQL 能力。那现在我们就用这个特性去完成数据的批量操作。
实现过程
- 第一步 准备数据库和对应的实体类‘
public class Product {
private Long id;
private String name;
private BigDecimal price;
public Product(String name, BigDecimal price) {
this.name = name;
this.price = price;
}
public Product() {
}
注意:实体类应该遵循javabean规范,提供有参和无参构造,并提供对应字段的get和set方法
2.第二步 创建MyBatisUtils工具类
public class MybatisUtils {
private static SqlSessionFactory sessionFactory ;
static{
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//根据io流创建SqlSessionFactory对象
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSession(){
if (sessionFactory != null) {
return sessionFactory.openSession();
}
return null;
}
}
- 第三步 准备接口编写批量操作的方法
public interface ProductMapper {
/*添加多条数据*/
void add(List<Product> products);
/*删除多条数据*/
void delete(List<Long> ids);
}
- 第四步 xml文件中编写spl语句
<?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的内容就是ProductMapper接口的全限定名-->
<mapper namespace="cn.itstudy._01_batch.mapper.ProductMapper">
<!--id的值保证ProductMapper接口的方法名一值-->
<!-- /*添加多条数据*/
void add(List<Product> products);
-->
<!--批量添加
mybatis或把集合或者数组放在map中
如果返回是集合: key默认是list
如果返回是数组:key默认是array
item:每次遍历的结果
separator:没遍历一次用什么作为分隔
-->
<insert id="add">
INSERT into product (name,price) VALUES
<foreach collection="list" item="p" separator=",">
(#{p.name},#{p.price})
</foreach>
</insert>
<!--/*删除多条数据*/
void delete(List<Long> ids);-->
<!--批量删除
-->
<delete id="delete">
DELETE FROM product WHERE id IN
/*遍历id*/
/*open : 拼接sql以什么开始 close: 拼接字符串以什么结束*/
<foreach collection="list" item="p_id" separator="," open="(" close=")">
#{p_id}
</foreach>
</delete>
</mapper>
- 第五步 测试
通过封装的Mybatis工具类 ,获取到映射对象
@Test
public void testAdd(){
//获取session
SqlSession session = MybatisUtil.openSession();
//获取映射对象 代理模式
ProductMapper mapper = session.getMapper(ProductMapper.class);
ArrayList<Product> list = new ArrayList();
list.add(new Product("热干面",new BigDecimal(36)));
list.add(new Product("酥油面",new BigDecimal(40)));
list.add(new Product("干脆面",new BigDecimal(55)));
//批量添加到数据库
mapper.add(list);
//提交事物
session.commit();
}
增删改,只要是数据库的数据发生了变化,一定要记得提交事物!!!
配置文件主要是连接数据库
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载jdbc.properties-->
<properties resource="jdbc.properties"/>
<!--申明操作数据库的环境-->
<environments default="MYSQL">
<environment id="MYSQL">
<!--使用jdbc的事务-->
<transactionManager type="JDBC"/>
<!--支持连接池-->
<dataSource type="POOLED">
<!--自动补全结构:ctrl+shift+回车-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
<property name="driver" value="${jdbc.driverClassName}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载mapper.xml文件 这里引入sql语句的xml文件-->
</mappers>
</configuration>