CGB2107-Day03-mybatis

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<DemoUser> 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<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个
       */
      @Test
      public 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对象封装
*/
@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<DemoUser> 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<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> map
            sex=女  age=18
        规则: 如果参数是一个map集合,则通过#{key}获取数据.
    -->
    <select id="findBySA3" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where sex= #{sex} and age > #{age}
    </select>

2.3 #号和$符用法

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

#号语法:
在这里插入图片描述
$符语法:
在这里插入图片描述

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接口atis 常规CURD操作

在这里插入图片描述

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

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

3.3.3 编辑测试类
 /**
     * 需求: 查询age> 18 and age< 100 的用户信息.
     * 规则: 如果不能使用对象封装,则一般使用Map集合
     */
    @Test
    public 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.4 编辑Mapper接口文件

在这里插入图片描述

3.3.5 编辑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>
     */
    @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 编辑接口方法

img

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 编辑测试案例
@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接口

img

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岁,性别女
     *
     */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

管程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值