SSM学习笔记(8)_MyBatis_Day02_CRUD/配置文件
发布日期:2021-04-30 21:01:28 浏览次数:103 分类:精选文章

本文共 8905 字,大约阅读时间需要 29 分钟。

MyBatis CRUD 操作与环境配置

1. MyBatis 的 CRUD 操作

1.1 数据库与实体类一致

当数据库文件的列名与实体类的属性名一致时,可以直接使用 MyBatis 的代理 DAO 操作。以下是使用要求:

  • 持久层接口和持久层接口的映射配置必须在 相同的包 下。
  • 持久层映射配置中 <mapper> 标签的 namespace 属性取值必须是持久层接口的全限定类名。
  • SQL 语句的配置标签 <select>, <insert>, <delete>, <update>id 属性必须和持久层接口的方法名相同。
  • 1.2 环境配置

    POM.xml

    4.0.0
    com.itheima
    day02_eesy_01mybatisCRUD
    1.0-SNAPSHOT
    jar
    org.mybatis
    mybatis
    3.4.5
    mysql
    mysql-connector-java
    5.1.6
    log4j
    log4j
    1.2.12
    junit
    junit
    4.10

    实体类 User

    public class User {    private Integer id;    private String username;    private String address;    private String sex;    private Date birthday;    // set、get、toString 方法}

    SqlMapConfig.xml

    接口 IUserDao

    package com.itheima.dao;public interface IUserDao {    List
    findAll(); void saveUser(User user); void updateUser(User user); void deleteUser(Integer userId); User findById(Integer userId); List
    findByName(String username); int findTotal(); List
    findByVo(QueryVo vo);}

    测试类 MyTest

    package com.itheima.test;import com.itheima.dao.IUserDao;import com.itheima.domain.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.InputStream;import java.util.Date;import java.util.List;public class MyTest {    private InputStream in;    private SqlSession sqlSession;    private IUserDao userDao;    @Before    public void init() throws Exception {        in = Resources.getResourceAsStream("SqlMapConfig.xml");        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);        sqlSession = factory.openSession();        userDao = sqlSession.getMapper(IUserDao.class);    }    @After    public void destroy() throws Exception {        sqlSession.commit();        sqlSession.close();        in.close();    }    @Test    public void testFindAll() {        List
    users = userDao.findAll(); for (User user : users) { System.out.println(user); } } @Test public void testSave() { User user = new User(); user.setUsername("modify User property"); user.setAddress("北京市顺义区"); user.setSex("男"); user.setBirthday(new Date()); userDao.saveUser(user); } @Test public void testUpdate() { User user = new User(); user.setId(49); user.setUsername("mybatis update user"); user.setAddress("北京市顺义区"); user.setSex("女"); user.setBirthday(new Date()); userDao.updateUser(user); } @Test public void testDelete() { userDao.deleteUser(48); } @Test public void testFindOne() { User user = userDao.findById(49); System.out.println(user); } @Test public void testFindByName() { List
    users = userDao.findByName("%王%"); for (User user : users) { System.out.println(user); } } @Test public void testFindTotal() { int count = userDao.findTotal(); System.out.println(count); }}

    IUserDao.xml

    insert into user (username, address, sex, birthday) values (#{username}, #{address}, #{sex}, #{birthday});
    update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id};
    delete from user where id = #{uid};

    2. CRUD 操作

    2.1 数据库与实体类一致

    当数据库文件的列名与实体类的属性名一致时,可以直接使用 MyBatis 的代理 DAO 操作。以下是使用方法:

  • 持久层接口和持久层接口的映射配置必须在 相同的包 下。
  • 持久层映射配置中 <mapper> 标签的 namespace 属性取值必须是持久层接口的全限定类名。
  • SQL 语句的配置标签 <select>, <insert>, <delete>, <update>id 属性必须和持久层接口的方法名相同。
  • 2.2 传递 POJO 包装对象

    当需要传递复杂查询条件时,可以使用 POJO 包装对象。以下是使用方法:

  • 编写 QueryVo 类:
  • package com.itheima.domain;public class QueryVo {    private User user;    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }}
    1. 在持久层接口中添加方法:
    2. public interface IUserDao {    List
      findByVo(QueryVo vo);}
      1. 在映射文件中配置:
        1. 在测试类中使用:
        2. @Testpublic void testFindByQueryVo() {    QueryVo vo = new QueryVo();    User user = new User();    user.setUsername("%王");    vo.setUser(user);    List
          users = userDao.findByVo(vo); for (User u : users) { System.out.println(u); }}

          2.3 数据库与实体类不一致

          当数据库文件的列名与实体类的属性名不一致时,可以通过以下方法解决:

        3. 在 SQL 语句中使用别名:
          1. 配置查询结果的列名和实体类的属性名的对应关系:
            1. 在插入操作中使用 selectKey 获取自增字段值:
            2. select last_insert_id();
              insert into user (username, address, sex, birthday) values (#{userName}, #{userAddress}, #{userSex}, #{userBirthday});

              3. MyBatis 与 JDBC 的比较

              MyBatis 和 JDBC 在以下方面有显著区别:

            3. 语法:MyBatis 使用 XML 配置文件,而 JDBC 使用注解或代码配置。
            4. 参数传递:MyBatis 支持通过参数映射传递对象,而 JDBC 通常使用 PreparedStatement。
            5. 缓存:MyBatis 提供缓存机制,JDBC 缓存机制较为简单。
            6. 定制化:MyBatis 配置更加灵活,支持动态 SQL 和复杂查询。
            7. 4. SqlMapConfig.xml 配置文件

              4.1 properties 标签

              可以在 <properties> 标签内配置数据库连接信息:

              可以使用外部文件配置:

              然后在数据源标签中引用:

              4.2 typeAliases 标签

              在 SqlMapConfig.xml 中配置类型别名:

              4.3 mappers 标签

              配置映射文件路径:

              或使用 mapper 接口路径:

              注册指定包下的所有 mapper 接口:

              5. MyBatis 传统开发方式

              5.1 代码编写

              UserDaoImpl

              package com.itheima.dao.impl;import com.itheima.dao.IUserDao;import com.itheima.domain.User;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class UserDaoImpl implements IUserDao {    private SqlSessionFactory factory;    public UserDaoImpl(SqlSessionFactory factory) {        this.factory = factory;    }    public List
              findAll() { SqlSession session = factory.openSession(); List
              users = session.selectList("com.itheima.dao.IUserDao.findAll"); session.close(); return users; } public void saveUser(User user) { SqlSession session = factory.openSession(); session.insert("com.itheima.dao.IUserDao.saveUser", user); session.commit(); session.close(); } public void updateUser(User user) { SqlSession session = factory.openSession(); session.update("com.itheima.dao.IUserDao.updateUser", user); session.commit(); session.close(); } public void deleteUser(Integer userId) { SqlSession session = factory.openSession(); session.update("com.itheima.dao.IUserDao.deleteUser", userId); session.commit(); session.close(); } public User findById(Integer userId) { SqlSession session = factory.openSession(); User user = session.selectOne("com.itheima.dao.IUserDao.findById", userId); session.close(); return user; } public List
              findByName(String username) { SqlSession session = factory.openSession(); List
              users = session.selectList("com.itheima.dao.IUserDao.findByName", username); session.close(); return users; } public int findTotal() { SqlSession session = factory.openSession(); Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal"); session.close(); return count; }}

              5.2 执行过程分析

              以下是通过 SqlSessionFactory 获取 SqlSession 并执行 SQL 语句的步骤:

            8. 获取 SqlSessionFactory 实例。
            9. 获取 SqlSession 对象。
            10. 执行 SQL 语句(如 selectList、insert、update、delete、selectOne)。
            11. 提交事务。
            12. 释放 SqlSession 和 SqlSessionFactory。
            13. 通过以上步骤,可以实现 MyBatis 的传统开发方式。

    上一篇:Leetcode--713. 乘积小于k的子数组
    下一篇:Eclipse提交项目到GitHub上

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年06月08日 16时00分56秒