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对象应该也是以这种方式注入进去的;