02-Mybatis实现 CRUD 操作

Mybatis实现 CRUD 操作相关

基于前一个入门项目传送门

  1. 在IUserdao接口中添加方法
public interface IUserDao {
    /**
     * 查找所有方法
     * @return
     */
     List<User> findAll();

    /**
     * 通过id查找用户
     * @param id
     * @return
     */
     User findUserById(Integer id);

    /**
     * 保存用户操作
     * @param user
     */
     void saveUser(User user);

    /**
     * 修改用户操作
     * @param user
     */
     void updateUser(User user);

    /**
     * 删除用户
     * @param id
     */
     void deleteUser(Integer id);
}
  1. 在IUserDao.xml中添加数据库代码

注意:
resultType 属性:
用于指定结果集的类型。
parameterType 属性:
用于指定传入参数的类型。
sql 语句中使用#{}字符:
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。 具体的数据是由#{}里面的内容决定的。
parameterType 属性:
代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

<?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.ymz.dao.IUserDao">
    <!-- 配置查询所有操作 -->
    <select id="findAll" resultType="com.ymz.entity.User">
        select * from user;
    </select>
    <!--通过Id查找用户操作-->
    <select id="findUserById" parameterType="java.lang.Integer" resultType="com.ymz.entity.User">
        select * from user where id = #{id}
    </select>
    <!--保存用户操作-->
    <insert id="saveUser" parameterType="com.ymz.entity.User">
        insert into user(username,birthday,sex,address) values(#{username},
        #{birthday},#{sex},#{address});
    </insert>
    <!--更新用户操作-->
    <update id="updateUser" parameterType="com.ymz.entity.User">
        update user set username=#{username},birthday=#{birthday},
        sex=#{sex},address=#{address} where id = #{id}
    </update>
    <!--删除用户操作-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{id}
    </delete>
</mapper>
  1. 创建测试类
    注意:session.commit();使用来实现事务提交。
public class MybatisTest {
    private InputStream is;
    private SqlSession session;
    private SqlSessionFactory build;
    private IUserDao userDao;

    @Before
    public void init() throws IOException {
        // 1. 获取配置文件
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 2. 创建SqlSessionFactory对象
        build = new SqlSessionFactoryBuilder().build(is);
        // 3. 使用构建者创建工厂对象SqlSession
        session = build.openSession();
        // 4. 使用对象SqlSession创建dao接口的代理对象
        userDao = session.getMapper(IUserDao.class);
    }
    @After
    public void close(){
        session.commit();
        // 6. 释放资源
        try {
            session.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   @Test
    public void findAll(){
       // 查询所有用户方法
       List<User> users = userDao.findAll();
       for(User user:users){
           System.out.println(user);
       }
   }
   @Test
    public void saveUser(){
       User user = new User();
       user.setUsername("柳飘飘");
       user.setSex("女");
       user.setBirthday(new Date());
       user.setAddress("北京市朝阳区");
       userDao.saveUser(user);
   }
    @Test
    public void updateUser(){
        User user = userDao.findUserById(50);
        user.setAddress("湖北省武汉市");
        userDao.updateUser(user);
    }
    @Test
    public void deleteUser(){
        userDao.deleteUser(52);
    }
}

Mybatis 与 JDBC 编程的比较

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:
在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
解决:
将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。
解决:
Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的
类型。
4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对
象解析比较方便。
解决:
Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的
类型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章