1、添加
如上图是我们平时在添加数据时展示的页面,而我们在该页面输入想要的数据后添加 提交 按钮,就会将这些数据添加到数
据库中。接下来我们就来实现添加数据的操作。
1.1 编写接口方法
参数:除了id之外的所有的数据。id对应的是表中主键值,而主键我们是 自动增长 生成的。
1.2 编写SQL语句
<insert id="add">
insert into tb_brand (brand_name,company_name,ordered,description,status)
values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
1.3 编写测试方法并执行
@Test
public void add() throws Exception {
// 0.传参数
int status = 1;
String companyName = "波波手机";
String brandName = "波波";
String description = "手机中的战斗机";
int ordered = 100;
// 封装brand对象
Brand brand = new Brand();
brand.setStatus(status);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setBrandName(brandName);
brand.setOrdered(ordered);
//1、加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";//相对路径,基于resources
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSession sqlSession = sqlSessionFactory.openSession(true); //设置自动提交事务,这种情况不需要手动提交事务了
//3.执行sql获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
// 添加数据
brandMapper.add(brand);
// 提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
注意:记得最后提交事务。sqlSession.commit();
执行结果如下:
2、添加-主键返回
在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)。
比如:添加订单和订单项,如下图就是京东上的订单
订单数据存储在订单表中,订单项存储在订单项表中。
- 添加订单数据
明白了什么时候 主键返回 。接下来我们简单模拟一下,在添加完数据后打印id属性值,能打印出来说明已经获取到了。
我们将上面添加品牌数据的案例中映射配置文件里 statement 进行修改,如下
在 insert 标签上添加如下属性:
**useGeneratedKeys:**是够获取自动增长的主键值。true表示获取
keyProperty :指定将获取到的主键值封装到哪儿个属性里
比如上面我们把 主键 封装到PoJo类的属性 id中去。就可以通过Java语句获取属性id
3、修改数据
如图所示是修改页面,用户在该页面书写需要修改的数据,点击 提交 按钮,就会将数据库中对应的数据进行修改。注意一
点,如果哪儿个输入框没有输入内容,我们是将表中数据对应字段值替换为空白还是保留字段之前的值?答案肯定是保留之
前的数据。这就要用到SQL中的if语句来判断输入的内容是否为空
3.1 编写接口方法
在 BrandMapper 接口中定义修改方法。
/**
* 修改
*/
void update(Brand brand);
上述方法参数 Brand 就是封装了需要修改的数据,而id肯定是有数据的,这也是和添加方法的区别。
3.2 编写SQL语句
在 BrandMapper.xml 映射配置文件中编写修改数据的 statement
<update id="update">
update tb_brand
<set>
<if test = "brandName != null and brandName !=''">
brand_name = #{brandName},
</if>
<if test="companyName!=null and companyName !=''">
companyName = #{companyName},
</if>
<if test="ordered!=null ">
ordered = #{ordered},
</if>
<if test="description!=null and description !=''">
description = #{description},
</if>
<if test="status!=null ">
status = #{status},
</if>
</set>
where id = #{id};
</update>
set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。
3.3 编写测试方法
在 test/java 下的 com.itheima.mapper 包下的 MybatisTest类中 定义测试方法
@Test
public void update() throws Exception {
// 0.传参数
int status = 0;
String companyName = "波波手机";
String brandName = "波波";
String description = "手机中的战斗机";
int ordered = 200;
// 封装brand对象
Brand brand = new Brand();
brand.setStatus(status);
// brand.setCompanyName(companyName);
// brand.setDescription(description);
// brand.setBrandName(brandName);
brand.setOrdered(ordered);
brand.setId(7); //修改主键为7的数据
//1、加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";//相对路径,基于resources
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
// 修改数据
brandMapper.update(brand);
// 提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
执行测试方法结果如下:
从结果中SQL语句可以看出,只修改了 status 和ordered 字段值,因为我们给的数据中只给Brand实体对象的 status 和ordered属性设置值了。这就是== set== 标签的作用。
4、删除一行数据
如上图所示,每行数据后面都有一个 删除 按钮,当用户点击了该按钮,就会将改行数据删除掉。那我们就需要思考,这种
删除是根据什么进行删除呢?是通过主键id删除,因为id是表中数据的唯一标识。
4.1 编写接口方法
4.1 编写测试方法
@Test
public void deleteByid() throws Exception {
// 0.传参数
int id =7;
//1、加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";//相对路径,基于resources
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
// 修改数据
brandMapper.deleteById(id);
// 提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
运行过程只要没报错,直接到数据库查询数据是否还存在。
5、批量删除数据
如上图所示,用户可以选择多条数据,然后点击上面的 删除 按钮,就会删除数据库中对应的多行数据。
5.1 编写接口方法
在 BrandMapper 接口中定义删除多行数据的方法
// 批量删除
void deleteByIds( int[] ids);
参数是一个数组,数组中存储的是多条数据的id
5.2 编写sql语句
在 BrandMapper.xml 映射配置文件中编写删除多条数据的 statement 。
编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach 标签供我们使用
foreach 标签
用来迭代任何可迭代的对象(如数组,集合)。
collection 属性:
mybatis会将数组参数,封装为一个Map集合。
默认:array = 数组
使用@Param注解改变map集合的默认key的名称
item 属性:本次迭代获取到的元素。
separator 属性:集合项迭代之间的分隔符。 foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加
分隔符。
open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
<delete id="deleteByIds">
delete from tb_brand where id
in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
;
</delete>
假如数组中的id数据是{1,2,3},那么拼接后的sql语句就是:
delete from tb_brand where id in (1,2,3);
我们如果不想使用array
我们可以使用注解
在接口方法中使用param
并修改xml映射文件中的名字
注解的作用就是将map中默认的键 array修改成你想要的。这里我们修改成ids,那么对应的sql映射文件的值也要修改成ids
5.3 编写测试方法
// 批量删除数据
@Test
public void deleteByids() throws Exception {
// 0.传参数
int[] ids ={3,6};
//1、加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";//相对路径,基于resources
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.有了工厂对象,就要获取SqlSession对象,执行SQL语句。
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
// 批量删除数据
brandMapper.deleteByIds(ids);
// 提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
结果:id 为3和6的数据没了。