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