在上一章中,使用接口的方式实现了数据的查询。在本章中,主要说明如何使用Mybatis对数据进行增删查改。
1、修改接口
在接口中添加以下方法:
public interface UserMapper {
public User selectUserByID(int id);
public List<User> viewByUsername(String username);
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(int id);
}
在这里,我们设置了一共五个方法,分别为:
1、根据ID查找用户;
2、根据用户名查找用户;
3、添加用户;
4、更新用户信息;
5、删除用户;
2、修改配置文件
根据前两章中所了解到的内容,即不用编写接口的实现类,只要在xml文件中配置即可。
修改xml文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dfz.mybatis.mapper.UserMapper">
<resultMap id="resultListUser" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="address" property="address"/>
</resultMap>
<select id="selectUserByID" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
<select id="viewByUsername" parameterType="string" resultMap="resultListUser">
SELECT * FROM USER WHERE username like #{username}
</select>
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user(username, password, address) values (#{username}, #{password}, #{address})
</insert>
<update id="updateUser" parameterType="User">
update user set username=#{username}, password=#{password}, address=#{address} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE from user where id=#{id}
</delete>
</mapper>
其中,resultMap是用于返回List<User>的;
同时注意到viewByUsername的返回类型不再是resultType="",而是resultMap=""
如果使用mysql等支持主键自增的数据库时,可以在添加方法上设置useGeneratedKeys="true"来指定某一个字段自增。
修改测试代码:
private SqlSessionFactory sqlSessionFactory;
private Reader reader;
@Before
public void before() {
try {
//读取mybatis参数
reader = Resources.getResourceAsReader("mybatis-config.xml");
//建立session factory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test() {
//打开session
System.out.println("------------查询方法测试开始------------");
SqlSession session = sqlSessionFactory.openSession();
//使用接口方式调用查找方法
List<User> users = session.getMapper(UserMapper.class).viewByUsername("zhang");
System.out.println(users);
session.close();
System.out.println("------------插入方法测试开始------------");
session = sqlSessionFactory.openSession();
User u1 = new User();
u1.setUsername("li");
u1.setPassword("password2");
u1.setAddress("Beijing");
session.getMapper(UserMapper.class).addUser(u1);
session.commit();
System.out.println(u1);
System.out.println(session.getMapper(UserMapper.class).viewByUsername("li"));
session.close();
System.out.println("------------修改方法测试开始------------");
session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User u2 = mapper.viewByUsername("li").get(0);
u2.setUsername("changedname");
mapper.updateUser(u2);
session.commit();
System.out.println(mapper.viewByUsername("changedname"));
session.close();
System.out.println("------------删除方法测试开始------------");
session = sqlSessionFactory.openSession();
mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(u1.getId());
System.out.println(mapper.viewByUsername("changedname"));
session.commit();
session.close();
}
值得一提的是,使用mybatis进行增加、修改和删除数据的过程中,如果不调用session.commit()方法,则数据变更只会在内存中进行。
测试结果如下:
3、总结
1)resultType用于返回单一类型的数据,resultMap用于返回集合类型的数据,resultMap中的数据类型需要在xml文件中进行定义;
2)对于使用自增主键的数据库,可以在添加方法中定义useGeneratedKeys="true"来指定某一个字段自增;
3)使用Mybatis进行增加、删除或更新数据时,需要调用session.commit()方法,如不调用,则只在内存中进行数据更新,不会影响数据库。