Mybatis框架学习02

写在前面

本文接上文:https://www.cnblogs.com/wushenjiang/p/12451977.html

1.原始dao开发方法(程序员需要写dao接口和dao实现类)

思路:

  • 1.程序员首先书写dao接口和dao实现类
  • 2.向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。

    代码展示:

    dao接口:
public interface UserDao {
    
    //根据id查询用户信息
    public User findUserById(int id) throws Exception;
    //添加用户信息
    public void insertUser(User user) throws Exception;
    //删除用户信息
    public void deleteUser(int id) throws Exception;
}

dao实现类:


    //需要向dao实现类中注入SqlSessionFactory
    //这里通过构造方法注入
    private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
            this.sqlSessionFactory = sqlSessionFactory;
    }
    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById",id);
        //释放资源
        sqlSession.close();
        return  user;
        
    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行插入操作
        sqlSession.insert("test.insertUser",user);
        //执行提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        
        
    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("test.deleteUser",id);
        //执行提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        
    }
        

测试代码(使用Junit进行单元测试)

public class UserDaoImplTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        // 创建sqlSessionFactory

        // mybatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception {
        // 创建UserDao的对象
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);

        // 调用UserDao的方法
        User user = userDao.findUserById(1);
        
        System.out.println(user);
    }

开发中的问题:

  • 1.dao接口实现类中存在大量模版方法
  • 2.调用sqlsession方法时将statement的id硬编码了
  • 3.调用sqlsession方法传入的变量IDE不会报错,不利于开发。

2.mapper代理开发方法(程序员只需提供mapper接口)

思路:

  • 需要编写一个mapper.xml映射文件
  • 需要遵守一定的开发规范.

    开发规范:

  • 1.在mapper.xml中namespace等于mapper接口地址

  • 2.mapper.java接口中的方法名和mapper.xml中statement的id一致
  • 3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
  • 4.mapper.java接口中的方法返回值和mapper.xml中statement的resultType指定的类型一致
  • 例:

代码展示:

需要在SqlMapConfig.xml中加载mapper.xml

测试代码:

    @Test
    public void testFindUserByName() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 创建Usermapper对象,mybatis自动生成mapper代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findUserByName("赵");
        System.out.println(list);
        sqlSession.close();
    }

小结

mapper接口方法比起原始Dao接口方法要灵活的多,因此建议在开发中尽量使用mapper接口方法来实现.

3.SqlMapConfig.xml内的几项参数解释

3.1 properties属性

可以加载来自其他配置文件,以降低程序的耦合性。如我们可以将数据库配置单写一个properties,然后在SqlMapConfig.xml中读取它,如图:


建议: 不要在properties元素体中添加任何属性值,只将属性值定义在properties文件中。在properties文件中定义属性名要有一定的特殊性,如XXXX.XXX

3.2 setting(全局配置)

可用于调整mybatis框架的一些运行参数,如开启二级缓存、开启延迟加载等

3.3 typeAliases(别名)

在mybatis中,自带了许多别名,如图:

但在开发中,我们也可以将自己的pojo类自定义一个别名以方面我们的使用:
单个定义:

批量定义:(常用)

3.4 mappers(映射配置)

mappers主要用来加载映射文件,我们有三种加载方式:
1.通过resource加载单个映射文件:

2.通过mapper接口加载单个映射文件(前提是使用mapper代理方法)

3.批量加载mapper(推荐使用)

猜你喜欢

转载自www.cnblogs.com/wushenjiang/p/12506992.html