Spring+Mybatis整合

1 创建复杂对象

复杂对象: 类中没有构造方法,或者构造方法不能调用如接口类型或抽象类实例
1.编写ConnectionFactoryBean的代码如下:

package com.txw.factory;

import org.springframework.beans.factory.FactoryBean;
import java.sql.Connection;
import java.sql.DriverManager;
/**
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
public class ConnectionFactoryBean implements FactoryBean<Connection> {
    @Override
    public Connection getObject() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai","root","123456");
    }

    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

如图所示:在这里插入图片描述
2.配置工厂管理的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--管理 核心业务对象 目标对象-->
    <bean id="connectionFactoryBean" class="com.txw.factory.ConnectionFactoryBean"></bean>
</beans>

如图所示:在这里插入图片描述
3.编写SpringTest的代码如下:

package com.txw.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * 测试
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
public class SpringTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("factory/spring.xml");
        ConnectionFactoryBean connectionFactoryBean = (ConnectionFactoryBean) context.getBean("connectionFactoryBean");
        System.out.println(connectionFactoryBean);
    }
}

如图所示:
在这里插入图片描述

2 SM整合思路

2.1 spring框架的作用

spring框架 项目管理框架 主要负责项目中组件对象的创建。

2.2 Mybatis框架的作用

Mybatis框架 持久层框架 主要用来简化数据库访问的操作。

2.3 整合思路

整合思路: 两个框架作用不同,貌似没有什么联系,更深入看才能看出所谓Spring整合Mybatis,其实就是通过spring框架接管mybatis框架中核心对象的创建

2.4 mybatis中的核心对象有哪些

Mybatis的核心对象为: SqlSessionFactory 整合就是通过Spring管理SqlSessionFactory对象的创建。

2.5 整合思路图示在这里插入图片描述

3 SM整合DAO编程步骤

1.引入相关的依赖的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.txw</groupId>
  <artifactId>spring-03</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--依赖坐标-->
  <dependencies>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.8</version>
    </dependency>
     <!--spring 4.3.2相关依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <!--mybatis-spring整合jar-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--数据库驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>spring-03</finalName>
  </build>
</project>

如图所示:在这里插入图片描述
2.创建数据库及表结构的SQL语句如下:

drop table t_user;
CREATE TABLE `t_user` (
  `id` varchar(40) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `birthday` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如图所示:在这里插入图片描述
3.编写的User的代码如下:

package com.txw.entity;

import java.io.Serializable;
import java.util.Date;
/**
 * 用户实体类
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class User implements Serializable {
    private int id;
    private String name;  // 姓名
    private int age;  // 年龄
    private Date birthday;  //  生日

    public User() {
    }

    public User(int id, String name, int age, Date birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}

如图所示:在这里插入图片描述
4.编写UserDAO的代码如下:

package com.txw.dao;

import com.txw.entity.User;
import java.util.List;
/**
 * 用户持久层
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public interface UserDAO {

    /**
     * 查询所有
     * @return
     */
    public List<User> findAll();
}

如图所示:在这里插入图片描述
5.编写UserDaoMapper.xml的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.txw.dao.UserDAO">

    <!--查询所有-->
    <select id="findAll" resultType="com.txw.entity.User">
        select * from t_user
    </select>
</mapper>

如图所示:在这里插入图片描述
6.编写Spring-myabtis.xml的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--创建数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
     <!--创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" >
            <array>
                <value>classpath:com/txw/mapper/UserDAOMapper.xml</value>
            </array>
        </property>
    </bean>

    <!--创建DAO-->
    <bean id="userDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <property name="mapperInterface" value="com.txw.dao.UserDAO"/>
    </bean>
</beans>

如图所示:在这里插入图片描述
7.编写SpringTest的代码如下:

package com.txw.test;

import com.txw.dao.UserDAO;
import com.txw.entity.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
/**
 * 测试类
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
public class SpringTest {

    @Test
    public void testFindAll(){
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-myabtis.xml");
        UserDAO userDAO = (UserDAO) context.getBean("userDAO");
        List<User> users = userDAO.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

如图所示:在这里插入图片描述

4 SM整合Service编程步骤

如图所示:在这里插入图片描述
1.编写的UserService的代码如下:

package com.txw.service;

import com.txw.entity.User;
import java.util.List;
/**
 * 用户业务层
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
@SuppressWarnings("all")  // 注解警告信息
public interface UserService {

    /**
     * 查询所有
     * @return
     */
    public List<User> findAll();
}

如图所示:在这里插入图片描述
2.编写的UserServiceImpl的代码如下:

package com.txw.service.impl;

import com.txw.dao.UserDAO;
import com.txw.entity.User;
import com.txw.service.UserService;
import java.util.List;
/**
 * 用户业务层
 * @author Adair
 * E-mail: 1578533828@qq.com
 */
@SuppressWarnings("all")  // 注解警告信息
public class UserServiceImpl implements UserService {
    private UserDAO userDAO;

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    /**
     * 查询所有
     * @return
     */
    @Override
    public List<User> findAll() {
        return userDAO.findAll();
    }
}

如图所示:在这里插入图片描述
3.在Spring-myabtis.xml添加的代码如下:

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
     <!--创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" >
            <array>
                <value>classpath:com/txw/mapper/UserDAOMapper.xml</value>
            </array>
        </property>
    </bean>

    <!--创建DAO-->
    <bean id="userDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <property name="mapperInterface" value="com.txw.dao.UserDAO"/>
    </bean>

    <!--创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置事务属性-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*"/>
            <tx:method name="update*"/>
            <tx:method name="delete*"/>
            <tx:method name="find*"/>
        </tx:attributes>
    </tx:advice>

    <!--配置事务切面-->
    <aop:config>
        <aop:pointcut id="pc" expression="within(com.txw.service.*)"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>

    <!--配置Service组件-->
    <bean id="userService" class="com.txw.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO"/>
    </bean>
</beans>

如图所示:在这里插入图片描述

5 事务属性

5.1 事务传播属性

propagation: 传播
	REQUIRED:            需要事务,外部存在事务融入当前事务,外部没有事务,开启新的事务。
	SUPPORTS:            支持事务,外部存在事务融入当前事务,外部没有事务,不开启新的事务。
	REQUIRES_NEW:        每次开启新的事务,如果外部存在事务外部事务挂起,开启新的事务运行,运行结束后回复外部事务。
	NOT_SUPPORTED:       不支持事务,如果外部存在事务外部事务挂起,已非事务方式运行。
	NEVER:				 不支持事务,存在事务报错。
	MANDATORY:		     强制事务没有事务报错。
	NESTED:				 嵌套事务,数据库不支持。

5.2 事务的隔离级别

isolation 隔离级别
	
	DEFAULT: 			采用数据库默认隔离级别。
	READ_UNCOMMITTED: 	读未提交。
	READ_COMMITTED: 	读提交 用来避免脏读现象出现的   oracle默认隔离级别。
	REPEATABLE_READ: 	可重复读主要是用来避免不可重复读现象出现的 (在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读)  mysql默认隔离级别。
	SERIALIZABLE: 	序列化读 用来避免幻影读现象出现          (在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读)

5.3 读写和异常性

 readonly 
   `true:    本次事务只读。
   `false:   本次事务非只读。
	<tx:method name="save*" propagation="REQUIRES_NEW" read-only="true|false" isolation="SERIALIZABLE"/>
	
rollback-for && no-rollback-for=""
		rollback-for: 遇到什么类异常回滚。
		no-rollback-for: 遇到什么类异常不回滚。
   	<tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>

timeout 超时性
		timeout: -1 永不超时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值