MyBatis 实战-使用 maven 构建(3)- 基本增删改查的实现

MyBatis 实战-使用 maven 构建(3)- 基本增删改查的实现

注意事项:

(1)增删改都要提交事务。

session.commit();

(2)增删改在接口中可以设置返回值。注意:增加、修改方法的参数是一个对象。

/**
     * 增加、删除、修改都可以设置返回值的数量
     * 注意,这里的参数是一个类型为 User 的对象
     * @param user
     * @return
     */
    int addUser(User user);
    int updateUser(User user);
    int deleteUser(int id);

观察对应的映射文件:

<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    insert into user(userName,userAge,userAddress)
    values(#{userName},#{userAge},#{userAddress})
</insert>

<update id="updateUser" parameterType="User">
    update 
        user 
    set 
        userName=#{userName},
        userAge=#{userAge},
        userAddress=#{userAddress}
    where id=#{id}
</update>

<delete id="deleteUser" parameterType="int">
    delete from user where id=#{id}
</delete>

(3) insert 方法可以获得自动增长的主键

id 和 parameterType 分别与 UserMapper 接口中的 addUser 方法的名字和 参数类型一致。以 #{userName } 的形式引用 User 参数的 userName 属性值, MyBatis 将使用【反射】读取 User 参数的这个属性。 #{userName} 中 userName 大小写敏感。引用其他的 userAge 等属性与此一致。
seGeneratedKeys 设置 为 “true” 表明要 MyBatis 获取由数据库自动生成的主键; keyProperty=”id” 指定把获取到的主键值注入到 User 的 id 属性。

<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    insert into user(userName,userAge,userAddress)
    values(#{userName},#{userAge},#{userAddress})
</insert>

以下为原博客内容:


Mybatis实战教程(mybatis in action)之三:实现数据的增删改查
前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在 User.xml 的配置文件中,

mapper namespace="com.liwei.mybatis.inter.IUserOperation" 

命名空间非常重要,不能有错,必须与我们定义的 package 和接口一致。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1、用 mybatis 查询数据,包括列表;
2、用 mybatis 增加数据;
3、用 mybatis 更新数据;
4、用 mybatis 删除数据;

查询数据,前面已经讲过简单的,下面我们介绍如何查询出一个 List 列表。

查询出列表,也就是返回 list, 在我们这个例子中也就是 List<User> ,这种方式返回数据,需要在 User.xml 里面配置返回的类型 resultMap, 注意不是 resultType,而这个 resultMap 所对应的应该是我们自己配置的 resultMap 的 id 属性值。
这里写图片描述

配置 User.xml 文件的片段:

<!-- 为了返回 list 类型而定义的 returnMap -->
    <resultMap type="User" id="resultListUser">
        <id column="id" property="id"/>
        <result column="userName" property="userName" />
        <result column="userAge" property="userAge" />
        <result column="userAddress" property="userAddress" />
    </resultMap>

    <!-- 返回 list 的 select 语句,注意 resultMap 的值指向前面定义好的 resultMap 的 id 值-->
    <select id="selectUsers" parameterType="string" resultMap="resultListUser">
        select * from user where userName like #{userName}
    </select>

然后,我们在接口中新增一个方法:

package com.liwei.mybatis.inter;

import java.util.List;

import com.liwei.mybatis.model.User;

public interface IUserOperation {
    User selectUserByID(int id);
    List<User> selectUsers(String userName);
}

可以看到,结果成功查询出来。如果是查询单个数据的话,用第二讲用过的方法就可以了。

底层依赖的 SQL 语句是:

SELECT * FROM USER WHERE userName LIKE '%e%'

结果集:
这里写图片描述

下面,我们编写测试代码,这一节我们开始引入 jUnit 测试框架:

package com.liwei.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

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 org.junit.Before;
import org.junit.Test;

import com.liwei.mybatis.inter.IUserOperation;
import com.liwei.mybatis.model.User;

public class TestMybatis {


    private SqlSessionFactory sqlSessionFactory;
    private Reader reader;

    @Before
    public void befort(){
        try {
            reader = Resources.getResourceAsReader("Configuration.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

    @Test
    public void testList(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            List<User> users = userOperation.selectUsers("%mm%");
            for(User user:users){
                System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            session.close();
        }
    }

}

可以看到,结果成功查询出来。如果是查询单个数据的话,用第二讲用过的方法就可以了。

用 mybatis 增加数据(注意提交事务)

在 IUserOperation 接口中增加方法:

public void addUser(User user);

在 User.xml 中配置

<!--    执行增加操作的SQL语句。 id 和 parameterType 分别与 IUserOperation 接口中的 addUser 方法的名字和  
            参数类型一致。以 #{name} 的形式引用 User 参数的 userName 属性值, MyBatis 将使用【反射】读取 User 参数的这个属性。
            #{userName} 中 userName 大小写敏感。引用其他的 userAge 等属性与此一致。 
            seGeneratedKeys 设置 为 "true" 表明要 MyBatis 获取由数据库自动生成的主键;
            keyProperty="id" 指定把获取到的主键值注入到 User 的 id 属性--> 
    <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> 
        insert into user(userName,userAge,userAddress)  
             values(#{userName},#{userAge},#{userAddress})  
    </insert>

这里要特别注意:insert 的操作一定和事务有关联,所以我们要设置事务,只须要下面一句话就可以了。

session.commit();

测试代码:

@Test
    public void testAdd(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = new User("wudi", "26", "fujian,fuzhou");
            userOperation.addUser(user);
            session.commit();
            // 测试获得自动增长的主键值
            System.out.println("测试获得自动增长的主键值:" + user.getId());
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            session.close();
        }
    }

用Mybatis 更新数据(注意提交事务)

经过上面几个例子,环境也搭建好了。我们下面要做的就那么几件事:
(1)在 User.xml 中配置 SQL 语句;
(2)在 IUserOperation 接口中增加方法;
(3)编写测试代码。

配置 SQL 语句:

    <update id="updateUser" parameterType="User" >
        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} 
            where id=#{id}
    </update>

接口中增加的方法:

void updateUser(User user);

编写测试代码:

    @Test
    public void testUpdate(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(5);
            user.setUserName("软件工程师");
            user.setUserAge("30");
            user.setUserAddress("美丽的深圳");
            userOperation.updateUser(user);
            // 注意:这里须要提交事务
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            session.close();
        }
    }

用 Mybatis 删除数据(也要记得提交事务)

按照上面的三个步骤来写,你一定也会了。
User.xml 代码片段:

     <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
     </delete>

接口新增方法:

    void deleteUser(int id);

测试代码:

    @Test
    public void testDelete(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            userOperation.deleteUser(4);
            // 注意:这里须要提交事务
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            session.close();
        }
    }

这样,所有增删改查都完成了,注意在增加,更改,删除的时候要调用 session.commit(),这样才会真正对数据库进行操作,否则是没有提交的。
到此为止,简单的单表操作,应该都会了,接下来的时间了,我们介绍多表联合查询,以及结果集的选取(这一部分是很重要的内容)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值