Mybatis实现增删改查

在测试方法中,读取配置文件,生产 SqlSession,释放资源等等,在每一测试方法的时候,都是重复的,所以我们完全可以提出出这一部分,防止大量的重复代码

 @Before
     public  void init() throws Exception{
         //读取配置文件
         inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
         //创建SqlSessionFactory工厂
         SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
 ​
         //使用工厂生产SqlSession对象
         sqlSession= factory.openSession();
         //使用SqlSession创建Mapper接口的代理对象
         userMapper = sqlSession.getMapper(UserMapper.class);
     }
  @After
     public void destroy() throws Exception{
         sqlSession.close();
         inputStream.close();
     }

在这两个方法上增加 @Before 和 @Aftrer 注解,就可以保证,init() 和 destory() 这两个方法,分别在我们真正被测试的方法的前后执行

(一) 增添操作

(1) 编写代码

首先,在 UserMapper 接口中 增加对应的方法

 public interface UserMapper {
     /**
      * 增加用户
      * @param user
      */
     void addUser(User user);
 }

接着,在SQL映射文件中,增加新增的映射配置,这些有关内容放在 <insert></insert>标签对中,具体代码如下

 <insert id="addUser" parameterType="cn.ideal.domain.User">
     insert into                          user(username,telephone,birthday,gender,address)values(#{username},#   {telephone},#{birthday},#{gender},#{address})
 </insert>

(2) 说明:

1、id 属性,自然是对应的方法名,而由于这里,我们并不需要拿到返回信息,所以这里并没有返回参数 resultType,而方法中的参数又为一个 JavaBean 类,也就是User实体类,所以需要在标签属性中,添加一个 parameterType 属性,其中需要指定这个实体类

2、在文本中书写插入的SQL语句,由于实体类中已经快捷生成了对应的 get set 方法,所一可以使用 #{}的方式代表对应的值

3、提示,数据库中id为自增,所以并不需要设置 id

(3) 注意:

由于添加是更新类的语句,所以在执行插入语句后,需要提交事务,也就是执行对应的 commit方法,以提交更新操作,若没有这一句,即使不会报错,也无法正常存入,会被回滚,且这个id被占用

(4) 测试代码:

 /**
      * 测试新增用户
      * @throws Exception
      */
     @Test
     public void testUpdateUser() throws Exception{
         User user = new User();
         user.setId(17);
         user.setUsername("修改");
         user.setTelephone("18899999999");
         user.setBirthday(new Date());
         user.setGender("女");
         user.setAddress("广州");
 ​
         //执行方法
         userMapper.updateUser(user);
 ​
     }

(5) 执行结果:

控制台:

(6) 获取新增用户的id值

首先对于 MySQL自增主键来说,在执行 insert语句之前,MySQL 会自动生成一个自增主键,insert执行后,通过 SELECT LAST_INSERT_ID() 可以获取这条刚插入记录的自增主键

在 SQL 映射配置文件中,需要借助 <selectKey></selectKey> 标签,有一个属性比较特殊,order 属性,它代表着相对于插入操作的执行时间,before-之前,after-之后

注:该标签插入到 <select></select>

 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
     SELECT LAST_INSERT_ID();
 </selectKey>

测试一下

 @Test
 public void testAddUser() throws Exception{
     User user = new User();
     user.setUsername("增加");
     user.setTelephone("12266660000");
     user.setBirthday(new Date());
     user.setGender("男");
     user.setAddress("珠海");
     System.out.println("执行插入前" + user);
     //执行方法
     userMapper.addUser(user);
     System.out.println("执行插入后" + user);
 }

执行效果

(二) 修改操作

(1) 编写代码

在 UserMapper 接口中增加修改方法

 public interface UserMapper {
     /**
      * 更新用户
      * @param user
      */
     void updateUser(User user);
 }

在 SQL 映射文件中增加语句,内容包括在 <update></update> 中,需要注意的基本与添加操作是一致的

 <update id="updateUser" parameterType="cn.ideal.domain.User">
     update user set username=#{username},telephone=#{telephone},birthday=#{birthday},gender=#{gender},address=#{address} where id=#{id}
 </update>

(2) 测试代码

/**
     * 测试新增用户
     * @throws Exception
     */
    @Test
    public void testAddUser() throws Exception{
        User user = new User();
        user.setUsername("增加");
        user.setTelephone("12266668888");
        user.setBirthday(new Date());
        user.setGender("女");
        user.setAddress("成都");

        //执行方法
        userMapper.addUser(user);

    }

(3) 执行效果

(三) 删除操作

(1) 编写代码

接口中增加删除方法

public interface UserMapper {
    /**
     * 删除用户
     * @param uid
     */
    void deleteUser(Integer uid);
}

在SQL映射文件中,使用 <delete></delete> 标签对进行内容的书写,需要注意的是,由于我们传入的参数是一个 Integer类型的用户id,所以参数类型的值为 parameterType

<delete id="deleteUser" parameterType="java.lang.Integer">
	delete from user where id=#{id}
</delete>

(2) 测试代码

/**
 * 测试删除用户
 * @throws Exception
 */
@Test
public void testDeleteUser() throws Exception{
    //执行方法
    userMapper.deleteUser(17);
}

(3) 执行效果

(四) 模糊查询

由于查询全部非常简单,这里就不展示了,基本流程都是一样的

(1) 编写代码

在 UserMapper 接口中编写方法

public interface UserMapper {
    /**
     * 通过姓名模糊查询
     * @param username
     * @return
     */
    List<User> findByName(String username);
}

在 SQL 映射文件中新增查询语句

<select id="findByName" parameterType="java.lang.String" resultType="cn.ideal.domain.User">
	select * from user where username like #{username}
</select>

(2) 测试代码

/**
 * 测试模糊查询
 * @throws Exception
 */
@Test
public void testFindByName() throws Exception{
	List<User> users = userMapper.findByName("%张%");
	for (User user : users){
    	System.out.println(user);
    }
}

(3) 注意

在使用模糊查询的时候,我们需要在查询条件的两侧拼接两个 “%” 字符串,这个时候有两种解决方案,一种就是像在我上述代码中,在测试时将字符串补充完整,还有一种方式就是 使用 ${} ,它在 SQL配置文件中代表一个 “拼接符号” ,也就是说可以这样写 SQL语句

select * from user where username like '%{value}'

可接受的类型有,普通类型(此情况下{}内部只能写value),JavaBean,HashMap

但是使用%{} 拼接字符串的时候,会引起 SQL注入,所以不是很推荐使用

(4) 执行效果

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值