Mybatis、Mysql事务和Spring

1.Mybatis

1.1 Mybatis是什么

mybatis是一种持久层框架,它是半自动的支持orm(对象关系映射)的框架,mybatis避免了几乎所有的jdbc代码、设置参数和获取结果集,开发者只用关注sql语句本身

1.2 Mybatis的优点

(1)mybatis免费开源

(2)与jdbc相比,它减少了绝大多数的jdbc代码

(3)mybatis支持将sql写在xml中,支持编写动态sql语句,和程序逻辑代码分离,减低了耦合度,便于统一管理和优化,提高了代码的可重用性

(4)mybatis提供映射标签,支持对象与数据库中的orm字段关系映射

1.3 Mybatis的缺点

(1)编写sql语句的工作量较大,对开发人员编写sql语句有一定功底要求

(2)sql语句依赖数据库,导致移植性较差,不能随意更换数据库

1.4 搭建一个Mybatis项目的步骤

(1)引用架包:mybatis、mysql

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.13</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.31</version>
    </dependency>

(2)创建全局配置文件:mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties resource="db.properties"></properties>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <plugins>
        <!--        注册拦截器-->
        <!--        分页插件-->
<!--        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
                <plugin interceptor="com.huang.plugins.MyPlugin"></plugin>
                <plugin interceptor="com.huang.plugins.MyPageHelper"></plugin>
    </plugins>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/my_erp?serverTimeZone=asia/shanghai&amp;rewriteBatchedStatements=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/MaterialMapper.xml"/>
        <mapper resource="mapper/CategoryMapper.xml"/>
        <mapper class="com.huang.dao.SupplierMapper"/>
    </mappers>
</configuration>

(3)创建实体类,dao接口

(4)创建mapper文件:Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间-->
<mapper namespace="">
    
</mapper>

(5)加载全局文件

    private static SqlSessionFactory sqlSessionFactory = null;
    String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    SupplierMapper mapper = sqlSession.getMapper(SupplierMapper.class);

1.5 Mapper.xml文件常用标签

select标签,insert标签,update标签,delete标签,此外还有foreach,where标签,if标签等标签可以生成动态sql语句

1.6 关联查询

关联查询使用resultMap元素,用来解决实体属性名和数据库表字段名不一致的问题(起别名),可以将查询结果映射成实体对象

在使用查询语句时要在上面加一个resultMap标签

    <resultMap id="materialMap1" type="com.huang.entity.Material">
        <id property="id" column="id"></id>
        <result property="name" column="cname"></result>
    </resultMap>

    <select id="query1" resultMap="materialMap1">
        select * from material
    </select>

多对一

在resultMap标签中加入<association>标签

一对多

在resultMap标签中加入<collection>标签

1.7 Mybatis缓存

mybatis缓存分为一级缓存和二级缓存。

一级缓存是基于HashMap的本地缓存,一级缓存默认开启,范围为一次sqlsession,当sqlsession刷新或者关闭时候,缓存会清除。

二级缓存是全局缓存,需要手动开启和配置,它的范围为Mapper级别,也使用HashMap存储

一级缓存缓存的是sql语句,二级缓存缓存的是结果对象,二级缓存的优先级高于一级缓存。

1.8 注解

除使用Mapper.xml文件写sql语句外,mybatis还有一种在dao接口中注解写sql语句的方式

需要在全局配置中注册:

<mappers>
<!--        全类名-->
    <mapper class="com.mrlang.dao.SupplierMapper"/>
</mappers>

1.9 插件

mybatis允许在映射语句执行过程中进行拦截调用其他方法。

步骤:

(1)创建拦截接口

(2)创建类实现接口

(3)在全局配置中注册拦截器插件

<plugins>
        <plugin interceptor="interceptor.MyPlugin"></plugin>
<!--        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
    </plugins>

通过拦截器可以实现分页功能

Mysql事务

2.1 什么是事务

事务是一组操作的集合,要么一起执行,要么不执行

2.2 事务的四大特征

ACID:

原子性:事务是一个不可分割的单位,要么一起执行,要么一起不执行

一致性:事务执行前后数据总体保持一致

隔离性:一个事务的执行不能被另一个事务干扰

持久性:事务一旦执行完毕,数据库中的数据就会发生改变,存储在磁盘上

2.3 事务并发操作时可能会引发的问题

脏读:一个事务进行了数据修改操作,但并未提交,另一个事务能看到未提交的修改后的数据

不可重复读:一个事务进行了两次读操作,另一个事务在这期间进行了修改操作,第一个事务两次读的数据不一样

幻读:一个事务进行了读操作,另一个事务进行了修改操作,第一个事务进行修改操作的时候报错,再次读的时候和第一次读的状态一样

2.4 事务的隔离级别

读未提交

读已提交

可重复读

串行化

2.5 操作事务的命令

  • start transaction; 开启事务

  • commit; 提交

  • rollback; 回滚

Spring

3.1 什么是Spring?

Spring是一种轻量型的控制反转和面向切面的框架,它是为了解决企业开发的复杂性而设计的

3.2 什么是IOC?

IOC是控制反转,是一种编程思想:对象的创建由原来的new创建交给Spring容器创建

控制:控制对象的创建,对象的生命周期的管理,依赖关系管理

反转:原来是程序创建,现在是第三方容器创建

DI:依赖注入,是ioc思想的一种体现,对象间的依赖关系交给Spring容器负责注入

3.3 如何创建一个Spring项目

(1)创建maven工程

(2)添加架包:spring-beans、spring-core、spring-context

(3)创建全局配置

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">


</beans>

(4)创建dao接口和实现类

3.4 依赖注入

(1)属性注入:bean中加入<property>标签

(2)构造注入:类中要有无参和有参构造,bean中加入<constructor>标签

(3)自动装配:bean标签中加入autowire属性

3.5 基于注解的设置bean

在全局配置中加入注解扫描

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd">

<!--    注解扫描-->
    <context:component-scan base-package="com.mrlang"/>
</beans>

用注解添加bean:@Component、@Repository、@Service、@Controller

用注解添加依赖:@Autowired、@Resource、@Qualifier

3.6 什么是AOP

AOP是面向切面编程,是对面向对象思想的补充,AOP是横向扩展,将共性问题的解决方案单独抽象出来,利用横切技术切入系统中,底层实现是动态代理

连接点:指要被动态代理的方法

切入点:是对连接点的描述,是正则表达式

通知:指代理的方法,对切入点的增强

3.7 xml实现AOP

(1)引入依赖包:spring-aop,spring-aspects

(2)定义切面类

(3)在切面类中定义通知方法

(4)在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: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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--    注解扫描-->
    <context:component-scan base-package="com.huang"/>

<!--    <bean id="userDaoImpl" class="com.huang.dao.UserDaoImpl"></bean>-->
<!--    <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl">-->
<!--        <property name="userDao" ref="userDaoImpl"></property>-->
<!--    </bean>-->

<!--    <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl">-->
<!--        <constructor-arg name="userDao" ref="userDaoImpl"></constructor-arg>-->
<!--    </bean>-->

<!--    <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl" autowire="byType"></bean>-->
<!--    <bean id="myAop" class="com.huang.aop.MyAop"></bean>-->

<!--    <aop:config>-->
<!--        <aop:aspect ref="myAop">-->
<!--            <aop:pointcut id="one" expression="execution(* com.huang.service.UserServiceImpl.query())"/>-->
<!--            <aop:before method="startTran" pointcut-ref="one"></aop:before>-->
<!--            <aop:after method="endTran" pointcut-ref="one"></aop:after>-->
<!--        </aop:aspect>-->
<!--    </aop:config>-->
    <aop:aspectj-autoproxy />
</beans>

3.8 基于注解实现AOP

在xml文件中启用注解代理

<aop:aspectj-autoproxy />

 3.9 使用注解配置容器类

@Configuration
@ComponentScan("com.huang")
@EnableAspectJAutoProxy
public class App {

    @Bean
    public UserService one() {
        return new UserServiceImpl1();
    }
}

@Configuration是Spring框架中的一个注解,用于表示一个Java类是Spring应用程序上下文的配置类。

@ComponentScan开启组成扫描注解,表示一个目录下可以使用注解

@EnableAspectJAutoProxy表示可以启用AOP代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,MyBatis是一种流行的持久化框架,它提供了一种简单且灵活的方式来进行数据库操作。MySQL是一种常用的关系型数据库管理系统,它支持事务处理。 事务是一组互相关联的操作,它们被视为一个单独的工作单元。事务具有以下四个特性,通常称为ACID特性: 1. 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部回滚。如果出现任何错误或异常,事务会回滚到初始状态,之前的操作将会回滚。 2. 一致性(Consistency):事务开始和结束时,数据库应该保持一致状态。这意味着数据在事务执行之前和之后应该满足一定的约束和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的操作不会影响其他事务。这样可以确保事务在并发环境下保持数据的一致性。 4. 持久性(Durability):一旦事务提交成功,对数据所做的更改应该永久保存在数据库中,即使发生系统故障或电源故障。 在Java中使用MyBatisMySQL进行事务回滚,我们可以采取以下步骤: 1. 首先,我们需要在MyBatis的配置文件中启用事务管理器。可以使用JDBC的事务管理器,也可以使用Spring事务管理器等。 2. 在需要进行事务管理的方法上使用注解或XML配置事务。注解方式可以使用`@Transactional`注解,XML配置方式可以使用`<transaction>`标签。 3. 在事务管理的方法中,我们可以使用`try-catch`块来捕获可能发生的异常,如果出现异常,则可以调用`TransactionManager`的`rollback`方法来回滚事务。 4. 如果所有操作都执行成功,我们可以调用`TransactionManager`的`commit`方法来提交事务,将更改持久化保存到数据库中。 总之,Java中使用MyBatisMySQL进行事务管理和回滚是非常简单和灵活的。通过合理地配置和使用事务管理器,我们可以确保数据库操作的一致性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值