Spring对mybatis的优势
下面是spring jdbc的数据库操作(核心部分):
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的Url-->
<property name="url" value="jdbc:mysql://localhost:3306/db_spring"/>
<!--连接数据库的用户名密码-->
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<!--配置jdbc模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--默认必须使用数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注册事务管理器驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<context:component-scan base-package="com.ssm.jdbc"/>
```java
public class JdbcTemplateTest {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("resources/applicationContext.xml");
//获取实例
JdbcTemplate jdbcTemplate= (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//使用execute()方法执行sql语句,创建用户表
jdbcTemplate.execute("create table user("+"id int primary key auto_increment,"+"username varchar(10),"+"password varchar(10))");
}
sql融合在代码中,不方便维护和修改,而mybatis将sql提取出来放在Mapper.xml
中通过dao层的接口去实现,只需要在映射文件中配置一些基本sql语句实现业务,配置也比spring jdbc简单了许多。
环境配置
- maven项目导入相关依赖,包括数据库驱动,mybatis工具包。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
- 创建mybatis配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--下面使用druid的DataSource这些不用配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="..."/>
</mappers>
-->
</configuration>
连接信息可以指直接在配置文件中写入,也可以创建properties
文件然后导入xml
配置文件。
- 添加Spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.19.RELEASE</version>
</dependency>
<!--导入context会自动给将其他集合核心都导入,aop依赖aspects,spring-jdbc的orm是整合其他持久层框架的基础-->
- 创建Spring核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:annotation-config/>
<!-- 注解扫描 -->
</beans>
- 导入mybatis与spring通信的依赖
mybatis-spring
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
- 整合德鲁伊(Druid)连接池
Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser 对sql的支持。
<!--导入druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
<!--druid驱动配置-->
<bean id="DataSource" class="com.alibaba.druid.pool.DruidDataSource" scope="singleton">
<property name="driver" value=""></property>
<property name="url" value=""></property>
<property name="username" value=""></property>
<property name="password" value=""></property>
<property name="initialSize" value=""></property>
<property name="minIdle" value=""></property>
<property name="maxActive" value=""></property>
<property name="maxWait" value=""></property>
</bean>
druid有整合了jdbc,就不需要jdbc或者mybatis提供数据源了,由于spring整合式Spring Data/Acess框架提供了数据源DataSource
管理,将druid提供给的数据源交由spring管理,scope
要为单例模式
DataSource
是数据连接的核心,有数据库密码,url,驱动等属性,有了DataSource
就调用框架的接口操作数据库。spring IoC只起管理作用,mybatis使用druid数据源,既优化连接数据库有提供了连接池的支持。
- spring IoC容器管理数据源
DataSource
注意scope
要为单例模式:
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" scope="singleton">
<property name="driver"></property>
<property name="url"></property>
<property name="username"></property>
<property name="password"></property>
<property name="initialSize" value=""></property>
<property name="minIdle" value=""></property>
<property name="maxActive" value=""></property>
<property name="maxWait" value=""></property>
</bean>
连接信息可以直接在xml中配置也可以新建properties文件,在导入到xml:
<context:property-placeholder location="classpath:xxx/xxx.properties"></context:property-placeholder>
Spring管理Mybatis工厂类
经过上面的配置已将DataSource
整合到IoC容器中,但mybatis还没有整合,核心步骤就是将Mybatis的工厂类交由IoC容器管理。
Mybatis操作数据的核心:
- DataSource
- SqlSessionFactory
- SqlSession
- Mapper
DataSource
没用mybatis自带的而是druid目的是:Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
SqlSessionFactory
需要调用DataSource
,再将SqlSessionFactory
交由IoC容器管理,就完成整合了。但是SqlSessionFactory是mybatis的接口,不是java的对象没办法直接交由IoC管理,Spring提供了SqlSessionFactoryBean
作为SqlSessionFactory
的同类型类。同时通过输出流读入mybatis配置文件就能创建创建SqlSessionFactory,再自动装配给或继承就可以交由IoC容器管理了。
Mybatis的SqlSessionFactory
创建:
String resource = "xxx/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
导入mybatis-spring
工具包使用工具包实现SqlSessionFactoryBean
:
<!--mybatis与spring结合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
更简单的方法:
Spring的SqlSessionFactoryBean
对象提供了configLocation
属性读入配置文件,同时创建SqlSessionFactory
对象,dataSource
属性配置DataSource对象,mapperLocation
配置Mapper映射等功能完成了再IoC容器中对SqlSessionFactory的创建。
上面mybatis的核心配置文件没有配置参数,依赖SqlSessionFactoryBean
接口提供了一些属性用来在IoC容器中对DataSource
和Mapper
等核心功能进行配置。
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref=""></property>
<property name="mapperLocation" value="classpath:xxx.Mapper.xml"></property>
<property name="typeAliasesPackage" value="cms.pojo.mapper"></property><!--Mapper接口位置-->
<property name="configLocation" value="classpath:xxx/mybatis-config.xml"></property>
</bean>
在IoC容器创建SqlSessionFactory对象后就将mybatis整合到Spring了。
IoC管理Mapper
IoC容器能管理SqlSessionFactory对象那么也能管理SqlSession对象,同理Mapper映射(dao),并通过自动专配赋值。
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDao {
ApplicationContext context=new ClassPathXmlApplicationContext("spring配置文件");
SqlSessionFactory sqlSessionFactory=(SqlSessionFactory) context.getBean("sqlSessionFactory");
//获取到SqlSessionFactory后其他的就是Mybatis的操作了
}
java代码对SqlSessionFactory的操作
SqlSession sqlSession=SqlSessionFactory.openSession();
UserMapper(& UserDao) mapper = sqlSession.getMapper(UserMapper.class & UserDao.class)
mapper.select() //定义的数据库的操作方法
//映射怎么命名自定义
....
实现IoC对Mapper的管理
dao层有很多的Mapper对象,需要将多有的类都交由IoC管理吗?并不需要,mybatis提供了MapperScannerConfigurer
类自动包路径下所有的Mapper进行bean生产。当然Mapper
是由SqlSession
对象调用的,MapperScannerConfigurer
需要引用IoC容器的SqlSessionFactory
创建SqlSession
对象,提供sqlSessionFacotyName
属性用来引入IoC容器中的SqlSessionFactory。
还提供basePackage
属性指明dao路径。
<!--加载dao路径下所有Mapper接口,并注入IoC容器-->
<bean class=org.mybatis.spring.mapper.MapperScannerConfigurer>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackgae" value="dao的路径" />
</bean>
从IoC容器获取Mapper
//创建IoC容器
ApplicationContext context=new ClassPathXmlApplicationContext("spring配置文件");
//从容器中获取bean,实现MapperScannerConfigurer后直接获取Mapper对象
UserMapper mapper=(UserMapper) context.getBean("userMapper");
/*
** 自动将接口的首字母转为小写,映射为接口的bean的id属性
*/
service层封装mapper
dao层和service共同完成ORM模型,service层调用dao层实现业务处理,自动装配实现:
@Service
public class DoUserService implements Userservice{
@Autowired
private UserDao userDao;
public List<User> userList(){
return userDao.queryUser() //dao层定义的方法返回用户列表
}
}
AOP实现声明式事务管理
事务时数据库的基本单元。
jdbc
模块xml
配置事务管理器
<!--该配置会对所有异常实行回滚-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
<!--tx模块定义股那里的规则-->
<tx:advice id="" transaction-manager="">
<!--主要定义了事务的隔离级别和传播机制-->
</tx:advice>
上面的配置只是定义了一个事务管理器,还需要声明管理的方法,声明后该方法对数据的操作就受事务管理的管理。
<aop:config>
<aop:pointcut id="" expression=""/>
<aop:advisor advice-ref=""></aop:advisor> <!--不同于aspect,advisor是面向事务的切面。-->
</aop:config>
由此事务xml配置就完成了。
- 注解完成声明式事务管理
处理xml配置注解也可以完成,当然由配置完的也可以由注解完成。参考Spring基础。
<!--声明事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
<!--开启事务注解驱动-->
<tx:annotation-driven transaction-manager="" />
@Transaction("隔离级别","传播机制")
public List<User> userList(){...}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156313.html