学习经历|cgb2107-第三阶段-day03-Mybatis入门

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注解方法时,会提前执行!!! */ @BeforeEach public void init() throws IOException { //1.指定资源文件 String resource = "mybatis/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }@Test public void testMybatis01(){ SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); List list = demoUserMapper.findAll(); System.out.println(list); sqlSession.close(); } }

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

1.2.2 编辑xml映射文件
select * from demo_user where name = #{name}

【学习经历|cgb2107-第三阶段-day03-Mybatis入门】2 mybatis中参数封装
2.1 案例分析
2.1.1 编辑测试方法
/** * 需求 :2. 查询sex=女 and age > 18岁 * 条件 2个 */ @Test public void testFindBySA(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); //编程习惯: 面向对象 DemoUser user = new DemoUser(); user.setAge(18).setSex("女"); List list = demoUserMapper.findBySA(user); System.out.println(list); sqlSession.close(); }

2.1.2 编辑业务接口
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

2.1.3 编辑xml映射文件
id="findBySA" resultType="com.jt.pojo.DemoUser"> select * from demo_user where sex= #{sex} and age > #{age}

2.2 关于mybatis参数问题说明
2.2.1 报错说明
规则: mybatis如果遇到多值传参时,默认条件是采用下标的方式获取数据.
mybatis天生只支持单值传参,如果遇到多值的问题,则应该将多值封装为单值.
学习经历|cgb2107-第三阶段-day03-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对象封装 */ @Test public void testFindBySA(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); //编程习惯: 面向对象 DemoUser user = new DemoUser(); user.setAge(18).setSex("女"); List list = demoUserMapper.findBySA(user); System.out.println(list); sqlSession.close(); }/** *sex=女 and age > 18 *方式2: @Param方式封装. */@Test public void testFindBySA2(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); String sex = "女"; int age = 18; List list = demoUserMapper.findBySA2(sex,age); System.out.println(list); sqlSession.close(); }/** *sex=女 and age > 18 *方式3: map集合封装 */@Test public void testFindBySA3(){ //保证每个线程都能获取一个链接 SqlSession sqlSession = sqlSessionFactory.openSession(); DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class); Map map = new HashMap<>(); map.put("sex","女"); map.put("age",18); List list = demoUserMapper.findBySA3(map); System.out.println(list); sqlSession.close(); }

2.2.4 编辑xml映射文件
="findBySA" resultType="com.jt.pojo.DemoUser"> select * from demo_user where sex= #{sex} and age > #{age} ="findBySA2" resultType="com.jt.pojo.DemoUser"> select * from demo_user where sex= #{sex} and age > #{age} ="findBySA3" resultType="com.jt.pojo.DemoUser"> select * from demo_user where sex= #{sex} and age > #{age}

2.2.5 参数知识点总结
如果参数采用对象封装,则可以使用#{属性}取值.
如果参数有多个,可以封装为map实现参数的传递. 可以利用#{key}获取数据
也可以使用@Param将多个参数封装为map, 利用#{key}的方式获取数据
2.3 #号和KaTeX parse error: Expected 'EOF', got '#' at position 18: …法 2.3.1 规则说明 使用#?{} 获取数据时,默认有预编译…{},但是这样的sql慎用. 可能出现sql注入攻击问题.
小结: 一般条件下能用#{}号,不用${}
#号语法:
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

$符语法:
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

3 Mybatis 常规CURD操作
3.1 新增操作
3.1.1 编辑测试方法
/** * 需求: 实现用户入库操作 * 关于事务说明: *mybatis中的"更新"操作,默认事务都是开启的,如果进行更新操作, *则必须提交事务. */ @Test public 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接口
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

3.1.3 编辑xml映射文件
insert into demo_user value (null,#{name},#{age},#{sex})

3.2 CURD作业
1.把id=1 的数据 name改为"守山大使" age=5000
2.将name="佛媛"的数据删除.
3.3 Mybatis中的转义标签
3.3.0 xml转义语法
xml文件中的转义字符. > > 大于 < < 小于 & & 号 说明:如果sql中有大量的转义字符 建议使用转义标签体 语法:

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

3.3.3 编辑Mapper接口文件
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

3.3.4 编辑xml文件
id="findByAge" resultType="com.jt.pojo.DemoUser"> #{minAge} and age < #{maxAge}]]>

3.4 Mybatis集合用法
3.4.1 需求分析
要求批量的删除数据库中的记录.
例如: 删除id=232/233/234的数据?
/** * 例如: 删除id=232/233/234的数据? *Sql: delete from demo_user where id in (232,233,234) * 规则: 如果遇到相同的多个数据,则一般采用集合的方式封装数据. * 封装方式: *1. array *2. list *3. map */ @Test public 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 编辑接口方法
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

3.4.4 编辑xml映射文件
delete from demo_user where id in ( #{id} )

3.5 Mybatis集合用法2
根据上述操作,练习mybatis集合的用法. 下列代码主要练习list/map的用法
3.5.1 编辑测试案例
@Test public 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集合 */ @Test public 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接口
学习经历|cgb2107-第三阶段-day03-Mybatis入门
文章图片

3.5.3 编辑xml映射文件
delete from demo_user where id in ( #{id} ) delete from demo_user where id in ( #{id} )

知识小结
  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

    推荐阅读