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

来源:互联网 发布:五化深化优化强化细化 编辑:程序博客网 时间:2024/06/06 03:40

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(),这样才会真正对数据库进行操作,否则是没有提交的。
到此为止,简单的单表操作,应该都会了,接下来的时间了,我们介绍多表联合查询,以及结果集的选取(这一部分是很重要的内容)。

0 0