spring和mybatis的整合简介

今天我来说一下我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以上支持。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值