Mybatis框架学习(三)实现CRUD操作

前提操作

  1. 将测试类中重复的操作封装
    private InputStream in;
    private SqlSession session;
    private IUserDao dao;

    @Before//用于测试类调用之前
    public void init() throws Exception{
        // 第一步:读取配置文件
        in = Resources.getResourceAsStream("SqlMapConifg.xml");
        // 第二步:创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        // 第三步:创建SqlSession
        session = sqlSessionFactory.openSession();
        // 第四步:创建Dao接口的代理对象
        dao = session.getMapper(IUserDao.class);
    }

    @After//用于测试类执行之后
    public void destory()throws Exception{
        //事务提交
        session.commit();
        // 第六步:释放资源
        session.close();
        in.close();

    }

根据id查询用户

  1. 在持久层新增方法
//    根据id查询用户
    User findById(Integer userId);
  1. 在用户的映射配置文件中配置
    <!--根据id查询用户-->
    <select id="findById" resultType="com.lwb.domain.User" parameterType="int">
        SELECT * FROM USER WHERE id = #{userid}
    </select>

模糊查询

  1. 在持久层新增方法
    List<User> findByName(String name);
  1. 在用户的映射配置文件中配置(第一种)
  • 我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以 SQL 语句显示为“?”
    <!--模糊查询-->
    <select id="findByName" resultType="com.lwb.domain.User" parameterType="string">
        SELECT * FROM USER WHERE username LIKE #{name}
    </select>
        // 第五步:执行dao中的方法
       // List<User> users=  dao.findByName("%王%");
        for(User user:users) {
            System.out.println(user);
        }

在这里插入图片描述

  1. 在用户的映射配置文件中配置(第二种)
  • 我们在上面将原来的#{}占位符,改成了$ {value}。注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字
    <!--模糊查询-->
    <select id="findByName" resultType="com.lwb.domain.User" parameterType="string">
        <!--SELECT * FROM USER WHERE username LIKE #{name}-->
        SELECT * FROM USER WHERE username LIKE '%${value}%'
    </select>
        // 第五步:执行dao中的方法
       // List<User> users=  dao.findByName("%王%");
        List<User> users=  dao.findByName("王");
        for(User user:users) {
            System.out.println(user);
        }

在这里插入图片描述

  1. #{} 与$ {} 的区别
    • #{} 表示一个占位符号通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
    • $ {} 表示拼接 sql 串通过$ {}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, $ {}可以接收简单类型值或 pojo 属性值,如果parameterType 传输单个简单类型值,${}括号中只能是 value。
    • 模糊查询的${value}源码分析
      在这里插入图片描述

保存操作

  1. 在IUserDao接口写方法
void saveUser(User user);
  1. 在用户的映射配置文件中配置
    在这里插入图片描述
    • parameterType 属性:
      • 代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
    • sql 语句中使用#{}字符:
      • 它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
      • #{}中内容的写法:
        • 由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。它用的是 ognl 表达式。
          • ognl 表达式:它是 apache 提供的一种表达式语言,全称是:
            Object Graphic Navigation Language 对象图导航语言它是按照一定的语法格式来获取数据的。语法格式就是使用 #{对象.对象}的方式
  2. 测试方法
    @Test
    public void test2(){
        User user = new User();
        user.setUsername("zjf");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("广东");
        dao.saveUser(user);
    }

修改操作

  1. 在持久层新增方法

    void updateUser(User user);
  1. 在用户的映射配置文件中配置
    <!--更新用户-->
    <update id="updateUser" parameterType="com.lwb.domain.User">
        UPDATE USER SET username = #{username},birthday = #{birthday},sex = #{sex},address = #{address} WHERE id = #{id}
    </update>

删除操作

  1. 在持久层新增方法

    void deleteUser(Integer userId);
  1. 在用户的映射配置文件中配置
    <!--删除用户-->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER WHERE id = #{userid}
    </delete>

Mybatis 与 JDBC 编程的比较

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    • 在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
  2. Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
    • 将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
  3. 向sql语句传参数麻烦,因为sql语句的where 条件不一定,可能多也可能少,占位符需要和参数对应。
    • Mybatis自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。
  4. 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。
    • Mybatis自动将 sql执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。

猜你喜欢

转载自blog.csdn.net/qq_41816516/article/details/106661187