mybatis学习二-映射文件

先看一张图
在这里插入图片描述
不难发现, mybatis就是通过映射文件来管理sql语句的, 不再是传统的将sql语句写在代码中, 将sql和代码分开解耦了.

1. mybatis的更新操作

1.1 插入操作

注意点:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="userMapper">
    
    <insert id="save" parameterType="com.itdong.domain.User">
        /*对应User类的属性名*/
        insert into tb_user value (#{id},#{name},#{age})
    </insert>
</mapper>
    @Test
    public void test2() throws IOException {
        //模拟数据
        User user = new User();
        user.setId(3);
        user.setName("hahaha");
        user.setAge(20);


        //加载核心配置文件  Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
        //获取session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作 参数就是, namespace+id
        int insert = sqlSession.insert("userMapper.save",user);
        //测试, 打印出来数据
        System.out.println(insert);

        //mybatis的更新操作默认是不提交事务的
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

有人可能会问返回值是什么, 配置时为什么不用加resultType属性
在这里插入图片描述

1.2 修改操作

在这里插入图片描述

    <update id="update" parameterType="com.itdong.domain.User">
        update tb_user set name = #{name} , age = #{age} where id = #{id}
    </update>
    @Test
    public void test3() throws IOException {
        //模拟数据
        User user = new User();
        user.setId(3);
        user.setName("hehehe");
        user.setAge(21);


        //加载核心配置文件  Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
        //获取session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作 参数就是, namespace+id
        int num = sqlSession.update("userMapper.update",user);
        //测试, 打印出来数据
        System.out.println(num);

        //mybatis的更新操作默认是不提交事务的
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

1.3 删除操作

在这里插入图片描述

    <delete id="delete" parameterType="java.lang.Integer">
        delete from tb_user where id = #{id}
    </delete>
    @Test
    public void test4() throws IOException {

        //加载核心配置文件  Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
        //获取session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作 参数就是, namespace+id
        int num = sqlSession.delete("userMapper.delete",6);
        //测试, 打印出来数据
        System.out.println(num);

        //mybatis的更新操作默认是不提交事务的
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

1.4 小结

可见, 更新操作的返回值都是int, 表示生效的行数
如果sqlSessionFactory.openSession(); 开启事务会话
也就是默认的不自动提交
更新操作是不会自动提交到数据库的. 但是查询操作可以随表查
查询操作就是两个api, 一个是one一个是list

接下来学习映射文件深入的部份, 以上都是简单的入门

2. 映射文件深入学习

首先就要认识mybatis的映射文件真正的作用是什么, 以上的学习, 我们只知道映射文件可以写我们的sql语句, 配置好sql语句之后, 使用时可以通过namespace+id来锁定要的sql语句

mybatis是用在dao层的框架, 映射文件里配置和存放sql语句和dao层又有什么关系呢

在以前javaweb阶段我们学习到, dao层的存在是为业务层的方法提供基础

传统的方法就是, dao层的接口要我们自己写实现类来实现方法, sql语句在这个过程中也会和实现类耦合在一起, 也就是说, mybatis的存在, 可以将传统的方法改变成, 接口+映射文件的形式, 不再需要我们自己写dao层的实现类了, 这样一来不就使得代码和sql语句分开了吗, 也体现了框架面向接口和配置文件做项目的目的.

那么, 怎么实现映射文件来取代实现类, 就是我们学习的重点

2.1 代理开发模式


例如
在这里插入图片描述
说白了, 实现类不用写了, mybatis自动会给我们创建代理对象
在这里插入图片描述
也就是说, 不再是直接使用namespace+id
而是使用getMapper(接口类)获取代理对象
在通过代理对象锁定sql

2.2 动态sql

在这里插入图片描述
在这里插入图片描述
动态的sql极大的方便了sql的使用
因为当你给不同的参数
就会动态的执行不同的sql

2.2.1 if

    <select id="findByCondition" parameterType="com.itdong.domain.User" resultType="com.itdong.domain.User">
        select * from tb_user
        <where>
            <if test="id!=0">
                and id=#{id}
            </if>
            <if test="name!=null">
                and name=#{name}
            </if>
            <if test="age!=0">
                and age=#{age}
            </if>
        </where>
    </select>
    @Test
    public void test5() throws IOException {
        //模拟数据
        User user = new User();
        //user.setId(4);
        user.setName("lll");
        //user.setAge(21);

        //加载核心配置文件  Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
        //获取session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findByCondition(user);
        //测试, 打印出来数据
        System.out.println(userList);

        //mybatis的更新操作默认是不提交事务的
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

2.2.2 foreach

    <select id="findByIds" parameterType="list" resultType="com.itdong.domain.User">
        select * from tb_user
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
    @Test
    public void test6() throws IOException {
        //模拟数据
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);


        //加载核心配置文件  Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
        //获取session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findByIds(list);
        //测试, 打印出来数据
        System.out.println(userList);

        //mybatis的更新操作默认是不提交事务的
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

2.3 sql片段的抽取

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值