Mybatis系列文章
1. 添加操作
1.1 在 UserMapper 接口中新增 saveUser()
方法
public interface UserMapper {
/**
* 查询所有用户
*
* @return
*/
List<User> listAllUsers();
/**
* 添加用户
* @param user
* @return 成功返回1,失败返回0
*/
int saveUser(User user);
}
1.2 在 Mapper 映射文件 UserMapper.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="cn.ykf.mapper.UserMapper">
<!-- 配置查询所有用户 -->
<select id="listAllUsers" resultType="cn.ykf.pojo.User">
SELECT * FROM user
</select>
<!-- 添加用户 -->
<insert id="saveUser" parameterType="cn.ykf.pojo.User">
INSERT INTO user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
- 温馨提示
- 在编写映射文件的时候,可以先在 MySQL 客户端写好可以正常运行的 SQL 语句,然后将其搬运到映射文件中,并把原本的实际参数都替换为 Mybatis 的参数符号
parameterType
表示将会传入这条语句的参数类的完全限定名或别名。- 其中的参数符号
#{username}
,#{birthday}
,#{birthday}
,#{sex}
,#{address}
必须和User类的每个属性名一一对应,不可以乱写。
- 属性名是实体类的
getXxx()/setXxx()
中Xxx
部份,大多数情况下就是成员变量名,也有少数情况不是成员变量名,也就是说成员变量和属性不能等同。- 关于配置文件的相关说明,可以查看官网文档:Mybatis的XML映射文件
1.3 测试添加操作
public class MybatisTest {
private InputStream is;
private SqlSession sqlSession;
private UserMapper mapper;
/**
* 测试之前执行,用于初始化
*/
@Before
public void init() throws Exception {
// 1. 读取配置文件
is = Resources.getResourceAsStream("mybatis-config.xml");
// 2. 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
// 3. 获取SqlSession对象
sqlSession = factory.openSession();
// 4. 使用SqlSession创建Mapper的代理对象
mapper = sqlSession.getMapper(UserMapper.class);
}
/**
* 测试结束执行,用于提交事务和释放资源
*/
@After
public void destroy() throws Exception {
// 6. 提交事务
sqlSession.commit();
// 7. 释放资源
sqlSession.close();
is.close();
}
/**
* 测试添加用户
*/
@Test
public void testSaveUser() {
User user = new User();
user.setUsername("鱼开饭");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("广东");
// 调用mapper完成添加
int count = mapper.saveUser(user);
System.out.println("添加条数为 : " + count);
}
}
- 这里有一点需要注意,如果在
destory()
方法中没有通过sqlSession.commit();
来提交事务的话,那么添加的记录不会写入到数据库中。- 因为我们在调用
openSession()
时并没有设置事务自动提交,所以最终事务会自动回滚,导致记录没有写入到数据库中。见下图
openSession()
的重载方法如下图,因此,如果需要自动提交事务,只需factory.openSession(true);
即可。
1.4 测试结果
2. 删除操作
2.1 在 UserMapper 接口中新增 removeUserById()
方法
/**
* 根据id删除用户
*
* @param userId
* @return 成功返回1,失败返回0
*/
int removeUserById(Integer userId);
2.2 在 Mapper 映射文件 UserMapper.xml
中配置删除操作
<!-- 删除用户 -->
<delete id="removeUserById" parameterType="java.lang.Integer">
DELETE FROM user WHERE id = #{uid}
</delete>
- 这里有两点需要注意一下!
- 第一点,如果参数是基本类型或者基本类型的包装类,且只有一个参数,那么参数符号可以随便写 。也就是说,虽然 Mapper 接口中的方法声明为
int removeUserById(Integer userId)
,但是映射文件中既可以写#{userId}
,也可以写#{aaaa}
。- 第二点,
parameterType
写int
、INT
、INTEGER
、integer
、java.lang.Integer
都可以。原因可以看 6.2 typeAliases 标签
2.3 测试删除操作
/**
* 测试删除用户
*/
@Test
public void testremoveUserById(){
// 这里传的id为自己数据库中存在的id值