接口内方法改动
第一步: 修改Mapper接口,如添加方法、删除方法、修改方法等操作,如再添加一个根据ID查询用户的方法
public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据ID查询用户
List<User> getUserById(int id);
}
第二步:在对应的Mapper.xml中实现Mapper接口新增的方法
<?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.feng.dao.UserMapper">
<select id="getUserList" resultType="com.feng.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" resultType="com.feng.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
</mapper>
第三步:利用sqlSession工具操作数据
@Test
public void getUserByIdTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userById = userMapper.getUserById(2);
for (User user : userById) {
System.out.println(user);
}
sqlSession.close();
}
测试结果
增删改方法改动,同上步骤(区别:增删改需要提交事务)
第一步:修改接口内方法
public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据ID查询用户
List<User> getUserById(int id);
//添加一个用户
int addUser(User user);
//修改用户
int modifyUser(User user);
//删除用户
int deleteUser(int id);
}
第二步:实现接口方法
<?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.feng.dao.UserMapper">
<select id="getUserList" resultType="com.feng.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" resultType="com.feng.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
<!-- 对象中的属性可以直接取出来 -->
<insert id="addUser" parameterType="com.feng.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="modifyUser" parameterType="com.feng.pojo.User">
update mybatis.user
set name = #{name},pwd = #{pwd}
where id = #{id};
</update>
<delete id="deleteUser" parameterType="int">
delete
from mybatis.user
where id = #{id};
</delete>
</mapper>
第三步:利用sqlSession操作数据
public class UserMapperTest {
@Test
public void getUserListTest(){
// 第一步:获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 第二步:执行sql
/*
* 1. 从sqlSession里执行sql,如何获取sql?
* 2. 通过getMapper获取UserMapper接口,使用面向接口编程
* 因为xml是UserMapper具体实现,因此只需要获取接口即可。
* 3. 获取接口userMapper后,即可通过接口调用接口提供方法。
* */
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
// 第三步:关闭sqlSession
sqlSession.close();
}
@Test
public void getUserByIdTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userById = userMapper.getUserById(2);
for (User user : userById) {
System.out.println(user);
}
sqlSession.close();
}
//增删改需要提交事务
@Test
public void addUserTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int num = userMapper.addUser(new User(4, "丰", "123456"));
if(num>0){
System.out.println("插入成功!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void modifyUserTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.modifyUser(new User(1,"疯疯","123456"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteUserTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(2);
sqlSession.commit();
sqlSession.close();
}
}
测试结果
总结
- 在静态配置完成后,动态修改第一步修改Mapper接口;第二步:修改实现接口的对应Mapper.xml;第三步利用sqlSession操作数据。
此外,要确保对应的Mapper.xml在mybatis-config.xml中得到注册 - 对数据库的增、删、改操作需要提交事务sqlSession.commit(),才能生效。当然为了避免每次都写上这一句重复的代码,可以在sqlSessionFactory打开sqlSession的时候,让sqlSession每次都自动提交事务。openSession是多态方法,传入boolean值可以实现自动提交事务。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
接口下的方法openSession(boolean var1);DefaultsqlSessionManager实现了该方法,调用底层代码如下:
public SqlSession openSession(boolean autoCommit) {
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, autoCommit);
}