Mybatis学习笔记 - 02(更新中)


1. 添加操作


1.1 在 UserMapper 接口中新增 insertUser() 方法

public interface UserMapper {
    /**
     * 查询所有用户
     *
     * @return
     */
    List<User> listAllUsers();

    /**
     * 添加用户
     * @param user
     * @return 成功返回1,失败返回0
     */
    int insertUser(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="insertUser" 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 destory() throws Exception {
        // 6. 提交事务
        sqlSession.commit();
        // 7. 释放资源
        sqlSession.close();
        is.close();
    }

    /**
     * 测试添加用户
     */
    @Test
    public void testInsertUser() {
        User user = new User();
        user.setUsername("鱼开饭");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("广东");

        // 调用mapper完成添加
        int count = mapper.insertUser(user);
        System.out.println("添加条数为 : " + count);
    }
}
  • 这里有一点需要注意,如果在destory()方法中没有通过sqlSession.commit();来提交事务的话,那么添加的记录不会写入到数据库中。
  • 因为我们在调用openSession()时并没有设置事务自动提交,所以最终事务会自动回滚,导致记录没有写入到数据库中。见下图
    添加操作的回滚
  • openSession()的重载方法如下图,因此,如果需要自动提交事务,只需factory.openSession(true);即可。
    openSession()的重载

1.4 测试结果

添加操作运行结果


2. 删除操作

2.1 在 UserMapper 接口中新增 deleteUserById() 方法

/**
 * 根据id删除用户
 *
 * @param userId
 * @return 成功返回1,失败返回0
 */
int deleteUserById(Integer userId);

2.2 在 Mapper 映射文件 UserMapper.xml 中配置删除操作

<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="java.lang.Integer">
    DELETE FROM user WHERE id = #{uid}
</delete>
  • 这里有两点需要注意一下!
  • 第一点,如果参数是基本类型或者基本类型的包装类,且只有一个参数,那么参数符号可以随便写 。也就是说,虽然 Mapper 接口中的方法声明为 int deleteUserById(Integer userId) ,但是映射文件中既可以写 #{userId},也可以写 #{aaaa}
  • 第二点,parameterTypeintINTINTEGERintegerjava.lang.Integer都可以。

2.3 测试删除操作

/**
 * 测试删除用户
 */
@Test
public void testDeleteUserById(){
    // 这里传的id为自己数据库中存在的id值
    int count = mapper.deleteUserById(50);
    System.out.println("删除条数为 : " + count);
}

2.4 测试结果

删除操作执行结果


3. 修改操作

3.1 在 UserMapper 接口中新增 updateUser 方法

/**
 * 修改用户
 * @param user
 * @return 成功返回1,失败返回0
 */
int updateUser(User user);

3.2 在 Mapper 映射文件 UserMapper.xml 中配置修改操作

<!-- 修改用户 -->
<update id="updateUser" parameterType="cn.ykf.pojo.User">
    UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id}
</update>

3.3 测试修改操作

/**
 * 测试修改用户
 */
@Test
public void testUpdateUser() {
    // 因为还没有编写根据id查询用户,所以模拟数据
    User user = new User();
    user.setUsername("update");
    user.setAddress("test");
    user.setSex("女");
    user.setBirthday(new Date());
    // id 为自己数据库中存在的值
    user.setId(49);

    // 执行修改
    int count = mapper.updateUser(user);
    System.out.println("修改条数为 : " + count);
}

3.4 测试结果

修改操作执行结果


发布了4 篇原创文章 · 获赞 2 · 访问量 110

猜你喜欢

转载自blog.csdn.net/a1092882580/article/details/104092319