MyBatis的增删改、抽取重复代码写成Util工具类

116 阅读4分钟

Mybatis

增-删-改-Util工具类

增加

  • 新增一个user对象,并在控制台输出对象保存到数据之后的主键值

接口

  • 修改UserMapper在保存方法上添加添加返回主键的注解@Options
//操作那个表就对应的起名 xxxMapper, 注意这是个接口
public interface UserMapper {

    //声明一个保存用户的方法, 然后在方法上使用@Insert声明方法对应的sql语句
    //后面只要一执行方法,mybatis就会帮我们把sql语句发送到数据库中去

    //#{}中的内容
    //1. 当方法参数是一个对象时, #{}里面写的是对象中的属性名

    //主键返回
    //useGeneratedKeys=true  告诉mybatis,当执行完保存操作之后,需要将数据库中新增记录的主键查询回来
    //keyProperty = "id"      查询回来的主键值需要封装到方法参数对象的哪个属性上
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into user values (null,#{name},#{age},#{gender},#{phone})")
    void save(User user);
}

测试

public class UserMapperTest {
    @Test
    public void testSave() throws IOException {
        //0. 准备一个User对象
        User user = new User();
        user.setName("张三");
        user.setAge(18);
        user.setGender(1);
        user.setPhone("13800138000");

        //1. 使用mybatis将user对象保存到数据库(步骤不重要, 不用记)
        //1-1 读取配置文件,读成一个输入流
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        //1-2 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //1-3 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //1-4 获取UserMapper对象,调用方法
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.save(user);

        //保存之后,打印出user中得id
        System.out.println(user);

        //1-5 提交事务
        sqlSession.commit();

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

修改

  • 根据id修改其它列

接口

public interface UserMapper {
    //根据id更新
    @Update("update user set name = #{name},age = #{age}, gender = #{gender},phone=#{phone} where id = #{id} ")
    void update(User user);
}

测试

@Test
public void testUpdate() throws IOException {
    //1. 使用mybatis将user对象保存到数据库(步骤不重要, 不用记)
    //1-1 读取配置文件,读成一个输入流
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //1-2 创建SqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //1-3 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //1-4 获取UserMapper对象,调用方法
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //准备一个User对象,必须包含id
    User user = new User();
    user.setName("李四");
    user.setAge(20);
    user.setGender(1);
    user.setPhone("13700137000");
    user.setId(1);
    userMapper.update(user);

    //1-5 提交事务
    sqlSession.commit();

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

删除

  • 根据id删除

接口

//#{}中的内容
//1. 当方法参数是一个对象时, #{}里面写的是对象中的属性名
//2. 当方法参数是一个简单类型参数(8种基本 + 8种包装 + Stringg)时, #{}里面可以随便写,但是推荐写方法形参
//删除
@Delete("delete from user where id = #{id}")
void delete(Integer id);

测试

@Test
public void testDelete() throws IOException {
    //1. 使用mybatis将user对象保存到数据库(步骤不重要, 不用记)
    //1-1 读取配置文件,读成一个输入流
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //1-2 创建SqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //1-3 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //1-4 获取UserMapper对象,调用方法
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    userMapper.delete(1);

    //1-5 提交事务
    sqlSession.commit();

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

抽取工具类 util类

上面所有重复代码都可以直接调用工具类,较少代码的重复性

package com.itheima.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    //静态代码块
    static {
        try {
            //读取配置文件,读成数据流
            InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

            //创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取sqlSession
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

    //提交事务和释放资源
    public static void close(SqlSession sqlSession) {
        if (sqlSession != null) {
            //提交事务(mybatis默认情况下是不会自动提交事务)
            sqlSession.commit();

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

利用工具类增删改一起写在一个测试类里

package com.itheima.test;

import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import com.itheima.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class UserMapperTest {
    
    /**
    *添加数据
    */
    @Test
    public void testSave() {
        //获取sqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();

        //获取UserMapper对象,调用方法
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //准备一个User对象,保存
        User user = new User();
        user.setName("张三");
        user.setAge(18);
        user.setGender(1);
        user.setPhone("13800138000");
        userMapper.save(user);

        //保存之后,打印出user中得id
        System.out.println(user);

        //提交事务,释放资源
        MyBatisUtil.close(sqlSession);
    }

    /**
    *修改数据
    */
    @Test
    public void testUpdate() {
        //获取sqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();

        //获取UserMapper对象,调用方法
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //准备一个User对象,必须包含id
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        user.setGender(1);
        user.setPhone("13700137000");
        user.setId(1);
        userMapper.update(user);

        //提交事务,释放资源
        MyBatisUtil.close(sqlSession);
    }

    /**
    *修改数据
    */
    @Test
    public void testDelete() {
        //获取sqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();

        //获取UserMapper对象,调用方法
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.delete(1);

        //提交事务,释放资源
        MyBatisUtil.close(sqlSession);
    }
}