spring和mybatis的整合简介

来源:互联网 发布:gfxbench数据库 编辑:程序博客网 时间:2024/06/14 10:25

今天我来说一下我spring和mybatis的整合,我也是才学这个只能给大家讲一些粗浅的,有大神路过请指点一二 ,谢谢 好现在我们开始讲解

首先 我们还是需要导入jar包,这次我们需要的jar包比较多这里写图片描述

第二步搭建整体的框架
包括:dao接口层,mapper.xml
pojo层,User
service层 service接口
serviceImpl 接口实现层
servlet控制层
第三步 搭建好框架之后我们就开始配置xml
创建一个mybatis-cfg.xml文件
创建一个beans.xml文件
第四步配置数据源:
编写beans.xml配置文件,将DataSource数据源,通过配置sqlsessionFactoryBean读取mybatis的核心配置文件,并且扫描实体类】
数据源配置如下 可以说是创建一个驱动类:

    <!-- 配置数据源 -->        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>            <property name="url" value="jdbc:mysql://localhost:3306/zhanghao?characterEncoding=UTF-8"></property>            <property name="username" value="zhanghao"></property>            <property name="password" value="zhanghao"></property>        </bean>

这里的class的值是一个数据源驱动管理类,而且每个property的命名也是有缘由的,通过jar包的反编译我们可以看到这个我也截了一段给大家看一下

public class DriverManagerDataSource extends AbstractDriverBasedDataSource{  public DriverManagerDataSource()  {  }  public DriverManagerDataSource(String url)  {    setUrl(url);  }  public DriverManagerDataSource(String url, String username, String password)  {    setUrl(url);    setUsername(username);    setPassword(password);  }  public DriverManagerDataSource(String url, Properties conProps)  {    setUrl(url);    setConnectionProperties(conProps);  }  public void setDriverClassName(String driverClassName)  {    Assert.hasText(driverClassName, "Property 'driverClassName' must not be empty");    String driverClassNameToUse = driverClassName.trim();    try {      Class.forName(driverClassNameToUse, true, ClassUtils.getDefaultClassLoader());    }    catch (ClassNotFoundException ex) {      throw new IllegalStateException("Could not load JDBC driver class [" + driverClassNameToUse + "]", ex);    }

第四步,利用bean创建一个sqlSessionFactoryBean

<!--配置SqlSessionFactoryBean读取mybatis核心配置文件 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource" />        <property name="configLocation" value="classpath:mybatis-cfg.xml" />        <property name="typeAliasesPackage" value="cn.mmmm.pojo" />    </bean>

这是初始化sqlSessionFactoryBean,property的name是对应类的属性,这些都是通过反编译jar得到的这里也给大家截了一些

 private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);  private Resource configLocation;  private Resource[] mapperLocations;  private DataSource dataSource;  private TransactionFactory transactionFactory;  private Properties configurationProperties;  private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;  private SqlSessionFactory sqlSessionFactory;  private String environment;  private boolean failFast;  private Interceptor[] plugins;  private TypeHandler<?>[] typeHandlers;  private String typeHandlersPackage;  private Class<?>[] typeAliases;  private String typeAliasesPackage;  private Class<?> typeAliasesSuperType;  private DatabaseIdProvider databaseIdProvider;  private ObjectFactory objectFactory;  private ObjectWrapperFactory objectWrapperFactory;

这是对应的一些属性,我没有都配置,只把用到的配置了

第五步 配置扫描mapper的映射接口类

<!-- 扫描mybatis映射接口类 -->        <bean id="userMapper"  class="org.mybatis.spring.mapper.MapperFactoryBean">            <property name="mapperInterface" value="cn.mmmm.mapper.UserMapper"></property>            <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>        </bean>

这也是对应的类,我也反编译了,截取了属性给大家看

private Class<T> mapperInterface;

这是这个类的唯一一个属性是对应的接口,第二个是和工厂发生关系,这相当于写到getmapper的地方

马上就要到头了坚持一下,第六步:创建service实现类:引用userMapper

<!--    创建service实现类 -->    <bean id="userService" class="cn.mmmm.service.impl.UserServiceImpl">     <property name="userMapper" ref="userMapper"></property>    </bean>

到这我们其实可以去写一个测试类看看准确性了我 这也提供了测试类 方便大家,其实写这个主要是细心,我有时候也会因为马虎而费好大的劲;
测试:

package cn.bjsxt.test;import java.util.List;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.mmmm.service.impl.UserServiceImpl;public class Test {    public static void main(String[] args) {        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");        UserServiceImpl us =  (UserServiceImpl) ac.getBean("userService");        System.out.println(us.findAll());}}

最后我们要加一个事务管理,为什么要加入事务管理呢?大家知道事务的四大特性吗?原子性,一致性,隔离性,持久性。因为有了事务,我们的数据才会更安全,减少不安全因素
这里一次我就都给出了
1.在sping配置文件中添加命名空间
2.添加事务管理类
3.配置事务通知
4.配置事务的切面

 <!-- 创建事务管理 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">            <property name="dataSource" ref="dataSource"></property>    </bean>    <tx:advice id="txAdvice" transaction-manager="transactionManager">            <!-- 配置事务传播特性:propagation:REQUIRED:每次查询的时候,看是否开启事务,如果没有开启事务,则开启事务 -->        <tx:attributes>            <tx:method name="add" propagation="REQUIRED"/>            <tx:method name="delete" propagation="REQUIRED" />            <tx:method name="update" propagation="REQUIRED"/>            <tx:method name="get" read-only="true"/>            <tx:method name="*" propagation="REQUIRED"/>        </tx:attributes>    </tx:advice>    <!-- 配置切面 -->    <aop:config>        <aop:pointcut expression="execution(* cn.mmmm.service.impl.*.*(..))" id="pointcut"/>        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>    </aop:config>

最后说一下事务的传播特性
1、Propagation.REQUIRED
方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。
2、Propagation.REQUIRES_NEW
无论何时自身都会开启事务
3、Propagation.SUPPORTS
自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务
4、Propagation.NOT_SUPPORTED
自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务
5、Propagation.MANDATORY
自身不开启事务,必须在事务环境使用否则报错
6、Propagation.NEVER
自身不会开启事务,在事务范围使用抛出异常
7、Propagation.NESTED
如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。

原创粉丝点击