您好,登录后才能下订单哦!
这篇文章给大家介绍Spring与MyBatis的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
参考:
Mybatis初始化流程及其重要的几个类
SqlSessionFactory和SqlSession的介绍和运用
SqlSessionFactoryBean 源码解析
@Mapper和@MapperScan的区别
Spring整合Mybatis原理
使用JDBC的步骤包括
设置好数据库的url,用户名,密码等常量
加载驱动类,例如MySQL的com.mysql.cj.jdbc.Driver。
加载com.mysql.cj.jdbc.Driver时会执行此驱动类静态代码块java.sql.DriverManager.registerDriver(new Driver());,将驱动注册进DriverManager
使用Driver或DriverManager创建Connection对象
使用Connection对象控制事务是否自动提交,手动提交,回滚或创建Statement对象执行sql语句
下述代码完成了 将mybatis的xml配置文件加载到Conguration对象中,创建SqlSessionFactory对象,创建SqlSession对象,调用指定mapper中的方法完成一次数据库查询
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");Configuration类的结构和mybatis的xml配置文件的结构是一一对应的
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
// 此对象用于解析
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
// parser.parse()实现将mybatis的xml配置文件解析到Java中的Configuration对象,并返回此对象
return build(parser.parse());
} catch (Exception e) {
throw ...
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
// 创建并返回一个DefaultSqlSessionFactory对象
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}上述使用mybatis的过程中,将解析mybatis配置文件的流程封装到了SqlSessionFactoryBuilder.build()方法内部
我们也可以使用重载方法,将Configuration对象作为参数传入build方法,并显式解析配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 手动创建XMLConfigBuilder,并解析创建Configuration对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null);
Configuration configuration=parse();
// 使用Configuration对象创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 使用MyBatis
SqlSession sqlSession = sqlSessionFactory.openSession();
List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");SqlSessionFactory的作用
SqlSessionFactory是个单个数据库映射关系经过编译后的内存镜像。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory提供创建SqlSession对象的方法
SqlSessionFactory的创建方式
直接new一个对象,并为它配置所需要的Configuration对象
用SqlSessionFactoryBuilder的build()方法创建。这个方法被重载多次,其核心是将mybatis的xml文件解析到Configuration对象中,在此基础上创建一个SqlSessionFactory对象
SqlSessionFactory的线程安全性
SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式,SqlSessionFactory是创建SqlSession的工厂
SqlSession的作用
SqlSession是执行持久化操作的对象。类似于JDBC中的Connection。
SqlSession的实现
SqlSession接口提供CURD方法和对事务的管理方法和获取mapper代理对象的方法,它底层封装了JDBC
SqlSession的线程安全性
它是应用程序与持久层之间执行交互的一个单线程对象。每个线程都应该有自己的SqlSession实例。SqlSession的实例不能被共享,同时SqlSession也是线程不安全的
SqlSessionFactoryBean的定义信息经常这样使用
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis全局配置文件的位置 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- 指定数据源 --> <property name="dataSource" ref="pooledDataSource"/> <!-- 指定mybatis,mapper文件的位置 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean>
SqlSessionFactoryBean类实现了InitializingBean接口。调用其afterPropertiesSet()方法时创建SqlSessionFactory对象并赋给成员变量this.sqlSessionFactory
在Spring项目中使用MyBatis后是这样使用的
@Component
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Integer id) {
return userMapper.selectById(id);
}
}我们关注的就是Spring IoC是怎么将UserMapper这个接口实例化并添加到容器中的
解决方案:(以UserMapper为例)使用FactoryBean为UserMapper接口创建一个声明类型是UserMapper,实际类型是动态代理的对象
并将对象添加到容器中
但是自定义的XxxMapper是你自己写的,是不确定的。框架不会为每个XxxMapper创建一个XxxFactoryBean,所以这个FactoryBean持有一个成员变量,保存它将要创建的对象的类型。以此做到创建各种Mapper类的代理对象
在Spring整合MyBatis的项目中,这个FactoryBean就是MapperFactoryBean
现在还有一个问题,每个Mapper都要有一个MapperFactoryBean。那MapperFactoryBean在哪里被创建?
由MapperFactoryBean和@MapperScan来实现
@Import(MapperScannerRegistrar.class)
public @interface MapperScan {
String[] basePackages() default {};
...
}@MapperScan的作用是向容器中添加一个MapperScannerRegistrar对象,并记录需要被扫描的包
这些包下的XxxMapper将会被MapperScannerRegistrar扫描到并为其创建一个MapperFactoryFactoryBean类型的BeanDefinition对象)
关于Spring与MyBatis的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。