文章目录

  • 1. Mybatis入门操作
    • 1.1 简化Mybatis操作
      • 1.1.1 @BeforeEach注解说明
      • 1.1.2 测试案例
    • 1.2 作业1-根据名称查询
      • 1.2.1 编辑测试类
      • 1.2.2 编辑xml映射文件
  • 2 mybatis中参数封装
    • 2.1 案例分析
      • 2.1.1 编辑测试方法
      • 2.1.2 编辑业务接口
      • 2.1.3 编辑xml映射文件
    • 2.2 关于mybatis参数问题说明
      • 2.2.1 报错说明
      • 2.2.2 常见封装策略
      • 2.2.3 编辑测试案例
      • 2.2.4 编辑xml映射文件
      • 2.2.5 参数知识点总结
    • 2.3 #号和$符用法
      • 2.3.1 规则说明
  • 3 Mybatis 常规CURD操作
    • 3.1 新增操作
      • 3.1.1 编辑测试方法
      • 3.1.2 编辑Mapper接口
      • 3.1.3 编辑xml映射文件
    • 3.2 CURD作业
    • 3.3 Mybatis中的转义标签
      • 3.3.0 xml转义语法
      • 3.3.1 需求说明
      • 3.3.2 编辑测试类
      • 3.3.3 编辑Mapper接口文件
      • 3.3.4 编辑xml文件
    • 3.4 Mybatis集合用法
      • 3.4.1 需求分析
      • 3.4.2 编辑测试方法
      • 3.4.3 编辑接口方法
      • 3.4.4 编辑xml映射文件
    • 3.5 Mybatis集合用法2
      • 3.5.1 编辑测试案例
      • 3.5.2 编辑mapper接口
      • 3.5.3 编辑xml映射文件
  • 知识小结
  • 作业

1. Mybatis入门操作

1.1 简化Mybatis操作

1.1.1 @BeforeEach注解说明

该注解的作用是在执行@Test方法前调用. 是测试方法提供的测试API.

1.1.2 测试案例

public class TestMybatis2 {//定义公共的属性private SqlSessionFactory sqlSessionFactory;/*** mybatis的核心 SqlSessionFacotry对象* @BeforeEach: 测试API中的注解 在执行@Test注解方法时,会提前执行!!!*/@BeforeEachpublic void init() throws IOException {//1.指定资源文件String resource = "mybatis/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testMybatis01(){SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);List<DemoUser> list = demoUserMapper.findAll();System.out.println(list);sqlSession.close();}
}

1.2 作业1-根据名称查询

1.2.1 编辑测试类

 /*** 作业:*      1. 查询name="王昭君"的用户*/@Testpublic void testFindByName(){//保证每个线程都能获取一个链接SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);String name = "王昭君";//如果不能保证结果唯一,则使用List集合接收数据.List<DemoUser> list = demoUserMapper.findByName(name);System.out.println(list);sqlSession.close();}

1.2.2 编辑xml映射文件

 <!--说明: parameterType其中的类型程序可以根据参数自动判断,所以可以省略不写根据名称,动态取值 使用#{}关键字--><select id="findByName" resultType="com.jt.pojo.DemoUser">select * from demo_user where name = #{name}</select>

2 mybatis中参数封装

2.1 案例分析

2.1.1 编辑测试方法

/*** 需求 :2. 查询sex=女 and age > 18岁* 条件 2个*/@Testpublic void testFindBySA(){//保证每个线程都能获取一个链接SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);//编程习惯: 面向对象DemoUser user = new DemoUser();user.setAge(18).setSex("女");List<DemoUser> list = demoUserMapper.findBySA(user);System.out.println(list);sqlSession.close();}

2.1.2 编辑业务接口

2.1.3 编辑xml映射文件

<!--查询sex=女 and age > 18岁参数: DemoUser user 意图:传递属性的规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.--><select id="findBySA" resultType="com.jt.pojo.DemoUser">select * from demo_user where sex= #{sex} and age > #{age}</select>

2.2 关于mybatis参数问题说明

2.2.1 报错说明

规则: mybatis如果遇到多值传参时,默认条件是采用下标的方式获取数据.
mybatis天生只支持单值传参,如果遇到多值的问题,则应该将多值封装为单值.

2.2.2 常见封装策略

1. 封装为实体对象   user对象
2. 更为常用的方式   Map集合
3. 如果传递的数据有多个,则可以使用注解@Param("sex") String sex 封装为Map.

2.2.3 编辑测试案例

说明: 代码中的方式 将3种常见情景进行了整理,理解参数封装的原理.

/*** 需求 :2. 查询sex=女 and age > 18岁* 方式1: User对象封装*/@Testpublic void testFindBySA(){//保证每个线程都能获取一个链接SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);//编程习惯: 面向对象DemoUser user = new DemoUser();user.setAge(18).setSex("女");List<DemoUser> list = demoUserMapper.findBySA(user);System.out.println(list);sqlSession.close();}/***    sex=女 and age > 18*    方式2: @Param方式封装.*/@Testpublic void testFindBySA2(){//保证每个线程都能获取一个链接SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);String sex = "女";int age = 18;List<DemoUser> list = demoUserMapper.findBySA2(sex,age);System.out.println(list);sqlSession.close();}/***    sex=女 and age > 18*    方式3: map集合封装*/@Testpublic void testFindBySA3(){//保证每个线程都能获取一个链接SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);Map<String,Object> map = new HashMap<>();map.put("sex","女");map.put("age",18);List<DemoUser> list = demoUserMapper.findBySA3(map);System.out.println(list);sqlSession.close();}

2.2.4 编辑xml映射文件

 <!--查询sex=女 and age > 18岁参数: DemoUser user 意图:传递属性的规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.--><select id="findBySA" resultType="com.jt.pojo.DemoUser">select * from demo_user where sex= #{sex} and age > #{age}</select><!--如果参数被@Param("sex") String sex修饰则#{参数key}即可获取数据--><select id="findBySA2" resultType="com.jt.pojo.DemoUser">select * from demo_user where sex= #{sex} and age > #{age}</select><!--Map<String, Object> mapsex=女  age=18规则: 如果参数是一个map集合,则通过#{key}获取数据.--><select id="findBySA3" resultType="com.jt.pojo.DemoUser">select * from demo_user where sex= #{sex} and age > #{age}</select>

2.2.5 参数知识点总结

  1. 如果参数采用对象封装,则可以使用#{属性}取值.
  2. 如果参数有多个,可以封装为map实现参数的传递. 可以利用#{key}获取数据
  3. 也可以使用@Param将多个参数封装为map, 利用#{key}的方式获取数据

2.3 #号和$符用法

2.3.1 规则说明

  1. 使用#{} 获取数据时,默认有预编译的效果.防止sql注入攻击.
  2. mybatis使用#{}获取数据时,默认为数据添加一对""号.
  3. 当以字段名称为参数时,一般使用${},但是这样的sql慎用. 可能出现sql注入攻击问题.
 小结: 一般条件下能用#{}号,不用${}

#号语法:

$符语法:

3 Mybatis 常规CURD操作

3.1 新增操作

3.1.1 编辑测试方法

 /*** 需求: 实现用户入库操作* 关于事务说明:*    mybatis中的"更新"操作,默认事务都是开启的,如果进行更新操作,*    则必须提交事务.*/@Testpublic void testSaveUser(){SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);//数据库主键自增,所以对象的ID可以为null.DemoUser user = new DemoUser(null,"佛媛",99,"女");int rows = demoUserMapper.saveUser(user);if(rows > 0){System.out.println("影响的行数:"+rows);//事务提交sqlSession.commit();}sqlSession.close();}

3.1.2 编辑Mapper接口

3.1.3 编辑xml映射文件

 <!--需求: 需要返回影响的行数.mybatis执行"更新"操作时,自动的返回影响的行数--><insert id="saveUser">insert into demo_user value (null,#{name},#{age},#{sex})</insert>

3.2 CURD作业

1.把id=1 的数据 name改为"守山大使" age=5000
2.将name="佛媛"的数据删除.

3.3 Mybatis中的转义标签

3.3.0 xml转义语法

     xml文件中的转义字符.&gt;  > 大于&lt;  < 小于&amp;  & 号说明:如果sql中有大量的转义字符 建议使用转义标签体语法: <![CDATA[  xxx内容 报文   ]]>

3.3.1 需求说明

查询age> 18 and age< 100 的用户信息.

3.3.2 编辑测试类

 /*** 需求: 查询age> 18 and age< 100 的用户信息.* 规则: 如果不能使用对象封装,则一般使用Map集合*/@Testpublic void testSelect01(){SqlSession sqlSession = sqlSessionFactory.openSession();DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);Map<String,Object> map = new HashMap<>();map.put("minAge",18);map.put("maxAge",100);List<DemoUser> userList = demoUserMapper.findByAge(map);System.out.println(userList);sqlSession.close();}

3.3.3 编辑Mapper接口文件

3.3.4 编辑xml文件

 <select id="findByAge" resultType="com.jt.pojo.DemoUser"><!--select * from demo_user where age > #{minAge} and age &lt; #{maxAge}--><![CDATA[  select * from demo_user where age > #{minAge} and age < #{maxAge}]]></select>

3.4 Mybatis集合用法

3.4.1 需求分析

要求批量的删除数据库中的记录.
例如: 删除id=232/233/234的数据?

3.4.2 编辑测试方法

/*** 例如: 删除id=232/233/234的数据?*  Sql: delete from demo_user where id in (232,233,234)* 规则: 如果遇到相同的多个数据,则一般采用集合的方式封装数据.* 封装方式:*      1. array*      2. list*      3. map<List>*/@Testpublic void testDeleteIds(){SqlSession sqlSession = sqlSessionFactory.openSession(true);DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);//将数据封装为数组int[] ids = {232,233,234};demoUserMapper.deleteIds(ids);System.out.println("删除操作成功!!!");}

3.4.3 编辑接口方法

3.4.4 编辑xml映射文件

   <!--需求: 批量删除多个数据难点: 如果使用#{集合}获取的是集合对象的整体.删除无效.思路: 将数组拆分为单个数据. 可以通过遍历的方式操作语法: mybatis为了参数取值方便,特意封装了遍历的标签 foreach关于标签参数说明:<foreach collection=""></foreach>1.如果传递的参数是数组,     则collection="array"2.如果传递的参数是list集合, 则collection="list"3.如果传递的参数是Map集合,  则collection="map中的key"标签属性说明:1.collection 集合的名称2.item 每次遍历的数据的形参变量3.open 循环的开始标签4.close 循环的结束标签5.index 循环遍历下标 一般不用6.separator 循环遍历的分割符--><delete id="deleteIds">delete from demo_user where id in (<foreach collection="array" item="id" separator=",">#{id}</foreach>)</delete>

3.5 Mybatis集合用法2

根据上述操作,练习mybatis集合的用法. 下列代码主要练习list/map的用法

3.5.1 编辑测试案例

@Testpublic void testDeleteList(){SqlSession sqlSession = sqlSessionFactory.openSession(true);DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);List list = new ArrayList();list.add(232);list.add(233);list.add(234);demoUserMapper.deleteList(list);System.out.println("删除操作成功!!!");}/** 说明: 有时业务需求导致需要使用map封装list集合*/@Testpublic void testDeleteMap(){SqlSession sqlSession = sqlSessionFactory.openSession(true);DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);List list = new ArrayList();list.add(232);list.add(233);list.add(234);HashMap map = new HashMap();map.put("ids",list);demoUserMapper.deleteMap(map);System.out.println("删除操作成功!!!");}

3.5.2 编辑mapper接口

3.5.3 编辑xml映射文件

<!--删除List集合中的数据--><delete id="deleteList">delete from demo_user where id in (<foreach collection="list" item="id" separator=",">#{id}</foreach>)</delete><!--删除List集合中的数据 如何是map,则写map中的key--><delete id="deleteMap">delete from demo_user where id in (<foreach collection="ids" item="id" separator=",">#{id}</foreach>)</delete>

知识小结

  1. 抽取生成SqlSessionFactory的方法 @BeforeEach

  2. 利用Mybatis查询数据时,如果返回值结果确定唯一则使用POJO对象接收.如果不能确定.使用List集合接收.

  3. mybatis默认支持单值传参.如果遇到多值,需要将多值转化为单值.
    策略: 1.利用POJO对象封装
    2.利用万能的Map集合
    3.如果参数一定使用多值操作,则使用@Param(“sex”) String sex

  4. #号 和 $符用法
    #号有预编译效果, 为数据添加一对""号
    $符 没有预编译的效果, 一般以字段名称为参数时使用.

  5. mybatis原生条件下 做"更新"操作时,需要手动提交事务.
    //自动提交事务
    sqlSessionFactory.openSession(true);

  6. xml中常见的转义字符

  7. Mybatis 中循环遍历写法 foreach

作业

 /*** 作业:*  1.整理bug集,收集Mybatis中常见报错,并且持续维护 20%*  2.mybatis案例练习*    2.1 查询age<100岁的女性用户.*    2.2 查询name中包含"精"的数据.并且按照年龄降序排列*    2.3 查询age位于100-300的数据*    2.4 将name为小乔/大乔/王昭君的年龄改为18岁,性别女**/

CGB2107-Day03-mybatis相关推荐

  1. Mybatis的一、二级缓存的原理与使用、禁止指定方法的二级缓存与刷新缓存、Mybatis整合Ehcache、二级缓存的使用场景与局限性-day03

    目录 第一节 Mybatis的缓存 1.1 Mybatis的缓存理解 1.2 一级缓存 原理 使用与测试 1.3 二级缓存 原理 使用与测试 禁用指定方法的二级缓存 刷新缓存 总结 1.4 整合ehc ...

  2. MyBatis-学习笔记12【12.Mybatis注解开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  3. MyBatis-学习笔记11【11.Mybatis的缓存】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  4. MyBatis-学习笔记09【09.Mybatis的多表操作】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  5. MyBatis-学习笔记06【06.使用Mybatis完成DAO层的开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  6. MyBatis-学习笔记05【05.使用Mybatis完成CRUD】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  7. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  8. MyBatis-学习笔记03【03.自定义Mybatis框架】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  9. MyBatis-学习笔记02【02.Mybatis入门案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  10. day03【后台】管理员维护

    day03[后台]管理员维护 1.分页 1.1.思路 1.2.导入依赖 在component工程中导入PageHelper的依赖 <!-- MyBatis 分页插件 --> <dep ...

最新文章

  1. 2017-10-6Linux基础知识(4)安装Linux及设置语言环境
  2. 一生应该感谢的十种人
  3. impinj固定式阅读器数据解析中Rfid筛选器实现
  4. linux服务器 远程桌面,Linux 远程桌面的两种方式
  5. 从十四五规划看 物联网(NB-IoT、Cat.1、5G)将何去何从?
  6. 七种实现左侧固定,右侧自适应两栏布局的方法
  7. Swing-JTree树模型的操作
  8. qtextedit改变单个字的颜色_孩子从“妈妈”叫到“妈”,称呼少了一个字,暗示孩子三方面变化...
  9. mysql innodb启动失败_关于mysql innodb启动失败无法重启的处理方法讲解
  10. windows_xp_sp3下的php环境安装配置
  11. 实例学习SSIS(三)--使用包配置
  12. 总结:如何使用ClearCase进行开发工作
  13. 51单片机入门(第二讲)
  14. 王道操作系统2.1.7课后习题--解答题
  15. matlab条形图标注数据,matlab条形图怎样标注
  16. android版本9是什么,安兔兔:81.9%的用户升级到了Android 9,你的手机是什么版本呢?...
  17. sublime text3 字体样式_Sublime Text3 Github最受欢迎主题字体推荐!
  18. HDOJ 1859 最小长方形
  19. ssm毕设项目基于Javaweb的宠物救助网站s6a19(java+VUE+Mybatis+Maven+Mysql+sprnig)
  20. vba 跳出for循环_ExcelVBA的三重FOR循环退出

热门文章

  1. 《查漏补缺》基础知识篇
  2. 长安二中计算机学院,最新!第一波中考录取分数线出炉!长安区12所高中录取分数线正式公布!...
  3. Cadence allegro小技巧总结
  4. YOLOX升级 | 阿里巴巴提出YOLOX-PAI,1ms内精度无敌!
  5. Oracle查询语句及实例
  6. jquery 自动表单赋值
  7. 【软件工程】软件工程知识点提纲8
  8. 数字平原maya制作写实科幻场景
  9. P1287 盒子与球
  10. 空腹不能吃的东西,可不仅仅是香蕉和柿子