Mybatis-初识


1、Mybatis整体架构

2、Mybatis启动案例
  根据官网介绍官网提供了两个Mybatis启动测试案例(参考:https://mybatis.org/mybatis-3/zh/getting-started.html)
  准备资源:
    数据库配置及驱动依赖(jdbcDriver、url、username、password)
    mybatis-config.xml配置文件,**-mapper.xml(sql映射)配置文件
    测试代码如下
  方法一:通过配置文件初始化,configuration、SqlSessionFactory等配置,并执行sql

public class MybatisInitByConfig {

  public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserInfoDO user01 = sqlSession.selectOne(
        "cn.jsu.wyk.dao.UserInfoDAO.queryByUserId", "1001");

    System.out.println(JSONObject.toJSONString(user01));

    try (SqlSession session = sqlSessionFactory.openSession()) {
      UserInfoDAO userDao = session.getMapper(UserInfoDAO.class);
      UserInfoDO user02 = userDao.queryByUserId("1002");
      System.out.println(JSONObject.toJSONString(user02));
    }
  }
}

  方法二:手动初始化(DataSource、Environment、Configuration、SqlSessionFactory等)组件

 1 public class MybatisInitByManual {
 2 
 3   public static void main(String[] args) throws IOException {
 4 
 5     DataSource dataSource = getDataSource();
 6     TransactionFactory transactionFactory = new JdbcTransactionFactory();
 7     Environment environment = new Environment("development", transactionFactory, dataSource);
 8 
 9     Configuration configuration = new Configuration(environment);
10     configuration.addMapper(UserInfoDAO.class);
11     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
12 
13     //官网未提供该部分初始化,会导致代码抛出 “java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for ***” 异常
14     InputStream userInfoMapperStream = Resources.getResourceAsStream("UserInfo-Mapper.xml");
15     XMLMapperBuilder mapperParser = new XMLMapperBuilder(userInfoMapperStream, configuration, "UserInfo-Mapper.xml", configuration.getSqlFragments());
16     mapperParser.parse();
17 
18     try (SqlSession session = sqlSessionFactory.openSession()) {
19       UserInfoDO user01 = session.selectOne(
20           "cn.jsu.wyk.dao.UserInfoDAO.queryByUserId", "1001");
21       System.out.println(JSONObject.toJSONString(user01));
22     }
23 
24     try (SqlSession session = sqlSessionFactory.openSession()) {
25       UserInfoDAO userDao = session.getMapper(UserInfoDAO.class);
26       UserInfoDO user02 = userDao.queryByUserId("1002");
27       System.out.println(JSONObject.toJSONString(user02));
28     }
29 }
30 
31   private static DataSource getDataSource() {
32       return new PooledDataSource(MybatisInitByManual.class.getClassLoader(),
33           "com.mysql.cj.jdbc.Driver",
34           "jdbc:mysql://192.168.165.129:3306/mybatis?useSSL=false",
35           "root",
36           "root");
37   }
38 }


提取知识点:
  1、Mybatis核心容器configuration对象,大量的配置信息都在这里(mappedStatements、resultMaps、parameterMaps、sqlFragements)
  2、SqlSessionFactory 是Mybatis执行的入口,通过它去获取SqlSession然后可以执行对应的Sql(sqlSession通过id找到configuration中的MappedStatment,然后通过Executor执行返回结果对象)
  3、可以通过id的方式执行我们的sql,也可以直接使用我们的DAO对象去执行sql,本质上都是通过namespace找到对应MappedStatment去执行。
这里都是基于 SqlSessionFactory 去操作的Mybatis,下一部分讲解Mybatis如何与Spring整合,即如何直接使用***DAO.select()这种方式去操作的;
  4、方法二中25行已经可以看出来一些端倪了,我们使用的dao对象实际是一个dao的代理对象,里面包含了sqlSession,和定义接口的部分信息,根据这个信息我们可以找到对应的sqlid,使用sqlSession执行操作,spring的bean对象应该也是以这种方式注入进去的;

原文地址:https://www.cnblogs.com/wykCN/p/11831192.html