Mybatis框架篇章十一
【摘要】 添加数据并返回主键添加数据就是常规操作了。我们需要返回主键的用途举个例子就是当用户提交订单的时候,我们需要返回一个订单号。(订单号作为主键) void add(Brand brand);然后映射文件 <insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (br...
添加数据并返回主键
添加数据就是常规操作了。我们需要返回主键的用途举个例子就是当用户提交订单的时候,我们需要返回一个订单号。(订单号作为主键)
void add(Brand brand);
然后映射文件
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
==对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID==
测试代码
public static void testAdd() throws IOException {
int status = 1;
String companyName = "波导手机";
String brandName = "波导";
String description = "手机中的战斗机";
int orderd = 100;
Brand brand = new Brand();
brand.setStatus(status);
// brand.setCompanyName(companyName);
// brand.setDescription(description);
// brand.setOrdered(orderd);
// brand.setBrandName(brandName);
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// SqlSession sqlSession1 = sqlSessionFactory.openSession(true);这样也可以设置为事务自动提交
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
brandMapper.add(brand);
Integer id = brand.getId();
System.out.println(id);
//提交事务
sqlSession.commit();
sqlSession.close();
}
修改数据
之前我们主要是在查询方面做相关得操作。现在我们进行一个添加数据的操作。
先在接口中写一个方法
// 完成一个修改的功能
int update(Brand brand);
然后再映射文件中编写具体的sql语句
<update id="update">
update tb_brand
<set>
<if test="brandName != null and brandName != ''">
brand_name = #{brandName},
</if>
<if test="companyName != null and companyName !=''">
company_name = #{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标签
==当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值==
然后测试代码
public static void testupdate() throws IOException {
int status = 1;
String companyName = "波导手机";
String brandName = "波导";
String description = "波导手机手机中的战斗机";
int orderd = 200;
int id = 5;
Brand brand = new Brand();
brand.setStatus(status);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setOrdered(orderd);
brand.setBrandName(brandName);
brand.setId(id);
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// SqlSession sqlSession1 = sqlSessionFactory.openSession(true);这样也可以设置为事务自动提交
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
// brandMapper.add(brand);
int count = brandMapper.update(brand);
//获取到影响的行数
// Integer id = brand.getId();
// System.out.println(id);
//提交事务
sqlSession.commit();
sqlSession.close();
}
如果我们不手动设置事务提交的话,那么是添加不成功的,默认的话,mybatis会默认为手动提交方式,如果不手动提交,mybatis会回滚事务。
根据id删除数据
首先我们在接口中定义一个这样的方法
void deleteById(int id);
然后在sql映射文件操作sql语句
<!-- 根据id删除-->
<delete id="deleteById">
delete from tb_brand where id = #{id};
</delete>
然后在测试方法当中
public static void testDeleteByID() throws IOException {
int id = 7;
// 封装对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = build.openSession(true);
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
mapper.deleteById(id);
sqlSession.close();
}
批量删除数据
如果我们要一次性删除多个,动态批量删除数据怎么做呢?
还是在接口中先定义这个方法
void deleteByIds(@Param("ids") int[] ids);
我们传入一个id的数组
然后在映射文件当中的sql语句
<!-- 批量删除-->
<!-- mybatis会将数组参数,封装为一个集合-->
<!-- 默认:array=数组-->
<!-- 可以使用Param注解来改变map集合当中的默认key的名称-->
<!-- separator代表指定分割符-->
<delete id="deleteByIds">
delete from tb_brand where id
in
# open和close代表包围foreach的前后符号
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
# 这个会根据集合中的id数动态生成多个id,id之间得1分割符为,号
</foreach>
;
</delete>
然后在测试类
public static void testDeleteByIds() throws IOException {
//接收参数
int[] ids = {5,7,8};//删除的集合
String resources = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resources);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
mapper.deleteByIds(ids);
sqlSession.commit();
sqlSession.close();
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)