MyBatis基础④

网友投稿 278 2022-09-06

MyBatis基础④

文章目录

​​配置文件完成增删改查​​

​​添加​​

​​主键返回​​

​​修改​​

​​修改全部字段​​​​修改动态字段​​

​​删除​​

​​删除一个​​​​批量删除​​

配置文件完成增删改查

添加

步骤:

详解: ①编写接口方法

/** * 添加 */void add(Brand brand);

②编写SQL语句

insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});

③编写测试方法

public class Try4 { public static void main(String[] args) throws Exception { //获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //此处填写相对于resources的路径 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //用SqlSessionFactory对象制造SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession();// //用SqlSession对象来执行sql语句// List users = sqlSession.selectList("test.selectAll"); BrandMapper mapper = sqlSession.getMapper(BrandMapper.class); Brand brand = new Brand(); brand.setBrandName("小米"); brand.setCompanyName("小米公司"); brand.setOrdered(50); brand.setDescription("小米为发烧而生"); brand.setStatus(1); mapper.add(brand); sqlSession.commit(); sqlSession.close(); }}

注意:

使用openSession是默认开启事务的,如果不提交事务的话,数据库不会发生变化。在这里有两种解决办法:

主键返回

有时候我们需要返回添加数据的主键 比如:添加订单和订单项

添加订单添加订单项,订单项中需要设置所属订单的id

做法: 在 insert 标签上添加如下属性:

useGeneratedKeys:是够获取自动增长的主键值。true表示获取keyProperty :指定将获取到的主键值封装到哪儿个属性里

例如上面的添加的例子中:

insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});

再直接用对象的get方法就可以得到当前的主键值了

修改

修改全部字段

这个方法也可以返回一个int型,表示受影响的行数

①编写接口方法

Integer setAll(Brand brand);

②编写sql语句

update mybatis.tb_brand set brand_name = #{brandName}, company_name = #{companyName}, ordered = #{ordered}, description = #{description}, status = #{status} where id = #{id};

③执行方法

public static void main(String[] args) throws Exception { //获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //此处填写相对于resources的路径 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //用SqlSessionFactory对象制造SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession();// //用SqlSession对象来执行sql语句// List users = sqlSession.selectList("test.selectAll"); BrandMapper mapper = sqlSession.getMapper(BrandMapper.class); Brand brand = new Brand(); brand.setId(4); brand.setBrandName("诺基亚"); brand.setCompanyName("诺加亚公司"); brand.setOrdered(50); brand.setDescription("让每个人都拥有一台手机"); brand.setStatus(1); mapper.setAll(brand); sqlSession.commit(); sqlSession.close(); }

修改动态字段

也就是说我们将来要修改哪个字段是不固定的。那么我们的sql语句就不能写死了。这个时候如果我们仍然按照老办法,那么本不需要修改的那些值会被修改为null。

我们的基本思路就是用if标签去包含每一项。

这个地方我们又会遇到前面遇到过问题,就是如果用户什么都没有修改,那么只有一个set在那里肯定会报错。或者用户修改的其中一项而尾部有一个逗号,那么也会报错。这个时候我们就需要用到MyBatis给我们提供的set标签set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。

我们可以将sql语句改写为:

update tb_brand brand_name = #{brandName}, company_name = #{companyName}, ordered = #{ordered}, description = #{description}, status = #{status} where id = #{id};

删除

删除一个

思路:

①编写接口方法

void deleteOne(int id);

②编写sql语句

delete from mybatis.tb_brand where id = #{id};

③执行方法

public static void main(String[] args) throws Exception { //获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //此处填写相对于resources的路径 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //用SqlSessionFactory对象制造SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession();// //用SqlSession对象来执行sql语句// List users = sqlSession.selectList("test.selectAll"); BrandMapper mapper = sqlSession.getMapper(BrandMapper.class); mapper.deleteOne(1); sqlSession.commit(); sqlSession.close(); }

批量删除

也就是删除多个数据

基本思路:

步骤详解:

①编写接口方法

/** * 批量删除 */void deleteByIds(int[] ids);

②编写sql语句 批量删除我们不知道要删除几个,所以编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 ​​​foreach​​ 标签供我们使用。

foreach 标签

用来迭代任何可迭代的对象(如数组,集合)。

collection 属性:要遍历的可迭代对象

mybatis会将数组参数,封装为一个Map集合。

默认:array = 数组使用@Param注解改变map集合的默认key的名称

item 属性:本次迭代获取到的元素。separator 属性:集合项迭代之间的分隔符。​​foreach​​ 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次

delete from tb_brand where id in #{id} ;

假如数组中的id数据是{1,2,3},那么拼接后的sql语句就是:delete from tb_brand where id in (1,2,3);

③编写测试方法

@Testpublic void testDeleteByIds() throws IOException { //接收参数 int[] ids = {5,7,8}; //1. 获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //SqlSession sqlSession = sqlSessionFactory.openSession(true); //3. 获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //4. 执行方法 brandMapper.deleteByIds(ids); //提交事务 sqlSession.commit(); //5. 释放资源 sqlSession.close();}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:营销最前线:“中国最牛校企”倒了:负债3000亿,内斗堪比电视剧!
下一篇:函数高级① -- (函数的prototype、原型、原型链)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~