spring学习(跟随狂神学习)

spring学习

1、简介

Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架

官网:https://spring.io/projects/spring-framework#overview

官方下载地址:http://repo.spring.io/release/org/springframework/spring

GitHub:https://github.com/spring-projects/spring-framework

架包:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>


优点:

1、spring是一个开源的免费的框架!

2、spring是一个轻量级的、非入侵式的框架!

3、控制翻转(IOC),面向切面编程(AOP)!

4、支持事务的处理,对框架整合的支持!

组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RLskOxG-1653126184283)(spring学习.assets/1651651292959.png)]

拓展

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMMf6MH1-1653126184285)(spring学习.assets/1651651403021.png)]

springboot:

1、一个快速开发的脚手架

2、基于springboot可以快速开发单个微服务

3、约定大于配置

springCloud

springcloud是基于springboot实现的

弊端:配置十分繁琐

2、IOC理论推导

本质:获取对象的方式反转了。从原先由程序控制到程序员或者用户决定。

改变对象的创建方式;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qtFbObk-1653126184286)(spring学习.assets/1651652898489.png)]

3、注册Bean的方法

重点:(在配置文件加载的时候,容器中管理的对象流已经初始化了,即在读取bean.xml时就会走java中对应的构造器)

1、无参构造

 <bean id="userT" class="pojo.UserT"></bean>

2、有参数构造

1、通过下标index

<?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="user" class="pojo.User">
        <constructor-arg index="0" value="1234"/>
    </bean>
    
</beans>

2、通过数据类型添加(不推荐)

<bean id="user" class="pojo.User">
    <constructor-arg type="java.lang.String" value="1234"/>
</bean> 

3、通过属性名添加

<bean id="user" class="pojo.User">
    <constructor-arg name="name" value="1234"/>
</bean>

4、通过已经注册的bean来添加引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzXhzofL-1653126184288)(spring学习.assets/1652422787631.png)]

4、spring配置说明

4.1 别名

 <alias name="user" alias="dasdasd"/>

4.2 bean的配置

1、name也是别名(分隔符用啥都可以,只能比alias好)

<bean id="user" class="pojo.User" name="dad dsa qqq;dasd">

4.3 import

(一般用于团队开发,他可以将多个配置文件导入到一个配置文件中)

<?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
       ">
   <import resource="beans.xml"/>
</beans>

5、依赖注入

5.1 构造器注入

如上述

5.2 set方式注入(前提属性有对应的set/get方法)

1、复杂类型

public class User {
    private int id;
    private String name;
    private String password;
    private Department department;
    private List<String> hobbys;
    private String[] books;
    private Map<String,String> card;
    private Set<String> games;
    private Properties info;
}
<?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 name="department" class="pojo.Department"/>

    <bean name="user" class="pojo.User">
<!--        基本数据类型-->
        <property name="name" value="hello"/>
<!--        引用类型-->
        <property name="department" ref="department"/>
<!--        数组-->
        <property name="books">
            <array>
                <value>西游记</value>
                <value>红楼梦</value>
            </array>
        </property>
<!--        map-->
        <property name="card" >
            <map>
                <entry key="1" value="hello" />
                <entry key="2" value="hello2" />
            </map>
        </property>
<!--        set-->
        <property name="games">
            <set>
                <value>HaHaHa</value>
            </set>
        </property>
<!--        设置空值-->
        <property name="password">
            <null></null>
        </property>
<!--        配置文件-->
        <property name="info">
            <props>
                <prop key="学号">21219141256</prop>
                <prop key="姓名">哈哈哈</prop>
                <prop key="性别"></prop>
            </props>
        </property>
    </bean>
</beans>

5.3 拓展方式注入(使用p和c命名空间注入)

1、头文件加入约束

       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"

2、注入bean

    <bean id="hah"  class="pojo.User" p:name="123" />

   <bean id="papa" class="pojo.UserT" c:name="12312" c:password="123123" />

3、注意bean中c:和p:注入要和构造器数据对应

4、测试

    @Test
    public void test(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserT user2 = (UserT) context.getBean("papa");
        User user1 = (User) context.getBean("hah");
        System.out.println(user2.getName());
        System.out.println(user1.getName());
    }

6、bean的作用域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUtQB0Ip-1653126184289)(spring学习.assets/1652512227561.png)]

1、singleTon(单例模式bean注入默认就是单例模式)

2、原型模式(Protpype 等同于原型设计模式 克隆一个新的属性 hashcode编码不同)

  <bean id="hah"  class="pojo.User" p:name="123" scope="prototype" />

3、其余的request、session、application、web开发中用到

7、Bean的自动装配

自动转配是spring满足bean依赖一种方式

spring会在上下文自动寻找,并自动给bean装配属性

装配方式:

1、xml中配置

2、在java中显示配置

3、隐式的自动装配配置

    <bean id="people" class="pojo.People" autowire="byType">
        <property name="name" value="nihao"/>
    </bean>




    <bean name="people" class="pojo.People" autowire="byName">
        <property name="name" value="nihao"/>
    </bean>

注意事项:

1、byType必须保证全局唯一

2、byName必须和set后面得到名称相同(不区分大小写)

    public void setCaat(Cat cat) {
        this.cat = cat;
    }


    <bean name="CAaT" class="pojo.Cat"/>

    <bean name="people" class="pojo.People" autowire="byName">
        <property name="name" value="nihao"/>
    </bean>

8、注解自动注入

从jdk1.5和spring2.5才开始支持注解注入

使用须知:

1、导入支持

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"
       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
       ">
    <!-- 开启注解注入--!>
    <context:annotation-config></context:annotation-config>
</beans>

1、autowire

直接在属性上添加,或者在set方法上添加

写了autowire我们可以不用写set方法,但必须在spring’容器中提前注入

科普:

@Nullable 字段可以为空 可以再构造器字段前添加

    @Autowired(required = false)//加上required 允许空注入不报错
    @Qualifier(value = "caat")//指定唯一spring中的bena对象创建实例
    private Cat cat;



    @Resource             //首先按照name查找查找到符合的cat的就注入,如果没有就找类型,类型必须唯一不然会报错   按照name匹配是根据对象名去匹配  这里就是caat
    private Cat caat;

    <bean name="caat" class="pojo.Cat"/>

spring5.0测试结果@Resource和@Autowire 注入原则是一样的先匹配name如果name不合适在匹配类型,如果存在多个类型注入就无法实例化

2、使用注解开发

在spring4之后,要使用注解开发,必须保证aop包的导入,使用注解需要导入context约束,加入注解支持!

<?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
       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"
>
    <!--    扫描特定的包-->
    <context:component-scan base-package="pojo"/>
    <context:annotation-config></context:annotation-config>
</beans>

1、属性如何注入

@Component
public class People {
    @Value("hello")
    private String name;
    @Autowired
    private Cat cat;
    public String getName() {
        return name;
    }

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

    public Cat getCat() {
        return cat;
    }
   
}

2、衍生的注解

@Component有几个衍生注解,在我们web开发中,会按照mvc三层架构分层

1、dao(@Repository)

2、service(@Service)

3、controller(@Controller)

(功能都一样,都是将类注入到容器中)

3、自动装配

@Autowired  自动注入
@Nullable 可以为空null值
@Resource    java自带的注解类 自动注入

4、作用域

@Scope(“”)------>和配置文件中的值一样

5、小结

xml与注解

xml:更加万能,适用于任何场合。

注解:不是自己的类使用不了,维护相对复杂!

重点:所有的实现前提是开启注解支持和有aop jar包支持

9、使用java的方式配置spring

​ xml配置交给java来做,即不用写applicationContext.xml 由 java在创建

JavaConfig 是spring的一个子项目,在spring4之后 ,他成了一个核心功能!

重点:@Configuration本质也是一个bean,

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

列子:

//1、config1
@Configuration
@ComponentScan("pojo")
@Import(config2.class)
public class config1 {

}
//2、config2
@Configuration
@ComponentScan("pojo")
public class config2 {
    @Bean
    public People getPeolpe(){
        return new People();
    }
    @Bean
    public Cat getCat(){
        return new Cat();
    }
}
//entity
@Component
public class People {
    @Value("hello")
    private String name;
    @Autowired
    private Cat cat;
    public String getName() {
        return name;
    }

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

    public Cat getCat() {
        return cat;
    }

}
//Test
public class MyTest {
    @Test
    public void Test01(){
        ApplicationContext context = new AnnotationConfigApplicationContext(config2.class);
        People people = (People) context.getBean("getPeolpe");
        System.out.println(people.getName());
        people.getCat().Catshout();
    }
}

10、代理模式

为什么要学代理模式?因为这就是springAop的底层!【springAop和SpringMvc】

代理模式:

1、静态代理

2、动态地理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vv9tHDI-1653126184292)(spring学习.assets/1652596999456.png)]

1、静态代理

代码步骤:

1、接口

package 静态_代理;

public interface Rent {
    void rent();
}

2、真实角色

package 静态_代理;

public class Host implements Rent{
    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

3、代理角色

package 静态_代理;

public class Proxy implements Rent {
    private Rent rent;

    public Proxy(Rent rent){
        this.rent=rent;
    }
    @Override
    public void rent() {
        seeHose();
        this.rent.rent();
        heTong();
    }

    public void seeHose(){
        System.out.println("中介带你看房子");
    }

    public void heTong(){
        System.out.println("签署租赁合同");
    }
}

4、客户端访问代理角色

package 静态_代理;

public class client {
    public static void main(String[] args) {
        Host host=new Host();
        Proxy proxy=new Proxy(host);

    }
}

代理模式的好处:

1、可以使真实角色的操作更加纯粹!不用关注一些公共的业务

2、公共也就交给代理角色!实现业务的分工1

3、公共业务发生拓展的时候,方便集中管理!

缺点:

一个真实角色需要对应一个代理,开发效率低

2、动态代理

动态代理利用的是反射机制!!!!

动态代理的代理类是动态生成的,不是我们直接写好的!

动态代理分为两大类:1、基于接口的动态代理 2、基于类的动态代理

​ 基于接口:JDK的动态代理

​ 基于类:cglib

​ JAVA字节码实现:javasist

需要两个类:Proxy和InvocationHandler(调用处理程序)

InvocationHandler ----->lang.reflect下的接口

1、接口

package 动态_代理;

public interface Rent {
    void rent();
}

2、真实对象

package 动态_代理;

public class Host implements Rent {
    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

3、代理程序invocationhandler,由他来实例代理对象,并执行方法。

public class ProxyHandler implements InvocationHandler {

    private Rent rent;

    public void setRent(Rent rent){
        this.rent=rent;
    }

    //调用对于方法是都会走invoke来执行,通过获取方法的名字和传入参数的来执行;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        msg(method.getName());
        Object result=method.invoke(rent,args);
        return result;
    }

    public Object getProxy(){
        return  Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    }

    public void msg(String name){
        System.out.println("执行了"+name+"方法");
    }
}

4、测试


public class Client {
    public static void main(String[] args) {
        Host host=new Host();
        ProxyHandler proxyHandler=new ProxyHandler();
        proxyHandler.setRent(host);
        Rent hhh= (Rent) proxyHandler.getProxy();
        hhh.rent();
    }
}

11、AOP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lkvl9VXm-1653126184293)(spring学习.assets/1652600852181.png)]

导包

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

一、通过实现接口来添加切面

示例:

1、接口

public interface UserService {
    public void add();
    public void update();
    public void delete();
    public void query();
}

2、实现类

public class UserServiceImpl implements UserService{
    public void add() {
        System.out.println("增加了一个用户");
    }

    public void update() {
        System.out.println("修改了一个用户");
    }

    public void delete() {
        System.out.println("删除了一个用户");
    }

    public void query() {
        System.out.println("查询了一个用户");
    }
}

3、通过实现接口来添加日志信息

public class AfterLog implements AfterReturningAdvice {
    public void afterReturning(Object returnvalue, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println(method.getName()+"执行了"+"返回结果为:"+returnvalue);
    }
}

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:aop="http://www.springframework.org/schema/aop"
       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
       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"
>

    <bean name="userService" class="com.huang.service.UserServiceImpl"/>
    <bean id="log" class="com.huang.log.AfterLog"/>
    <bean id="afterlog" class="com.huang.log.Log"/>
<!--    配置AOP-->
    <aop:config>
<!--        切入点  execution:( )-->
        <aop:pointcut id="pointcut" expression="execution(* com.huang.service.UserServiceImpl.*(..))"/>
<!--        执行环绕增加!-->
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        <aop:advisor advice-ref="afterlog" pointcut-ref="pointcut"/>
    </aop:config>
</beans>

5、测试

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
        userService.delete();

    }
}

二、自定义切面

1、自定义切面类

package com.huang.diy;

public class diyPointcut {
    public void before(){
        System.out.println("方法执行前!");
    }

    public void after(){
        System.out.println("方法执行后!");
    }
}

2、xml中添加配置

    <aop:config>
<!--        自定义切面 ref自定义要引用的类-->
        <aop:aspect ref="pintcut">
            <aop:pointcut id="pointcut2" expression="execution(* com.huang.service.UserServiceImpl.*(..))"/>
            <aop:before method="before" pointcut-ref="pointcut2"/>
            <aop:after method="after"  pointcut-ref="pointcut2"/>
        </aop:aspect>
    </aop:config>

三、注解实现

1、编写切面类

package com.huang.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class annotationpontCut {
    @Before("execution(* com.huang.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("方法执行前");
    }
    @After("execution(* com.huang.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("方法执勤后");
    }
    @Around("execution(* com.huang.service.UserServiceImpl.*(..))")
    public void  aroud(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前");
        Signature signature=joinPoint.getSignature();
        System.out.println(signature);
        Object proceed=joinPoint.proceed();
        System.out.println("环绕后");

    }
}

2、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: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
       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"
>

    <context:annotation-config></context:annotation-config>
    <bean name="userService" class="com.huang.service.UserServiceImpl"/>
    <bean id="log" class="com.huang.log.AfterLog"/>
    <bean id="afterlog" class="com.huang.log.Log"/>
    <bean id="pintcut" class="com.huang.diy.diyPointcut"/>
    <bean id="annotation" class="com.huang.annotation.annotationpontCut"/>
<!--开启注解支持 
proxy-target-class参数设置为true时就会采用    cglib来实现静态代理
proxy-target-class参数设置为false就是jdk默认  invocationHandler -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

四、关于execution()

expression=“execution(1.***** 2. com.huang.service.UserServiceImpl.* 3.(…))”

里面的参数 第一个是返回类型 第二个是切入类 第三个是传入参数

12、spring整合Mybatis

一、第一种

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">
    <parent>
        <artifactId>spring-learning</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-mybatis</artifactId>
    
     <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency

    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

2、编写实体

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class MyUser implements Serializable {
    private int uid;
    private String u_name;
    private String pwd;
    private int tid;
    //深度克隆
    @Override
    protected MyUser clone() throws CloneNotSupportedException {
        try {
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            ObjectOutputStream oos=new ObjectOutputStream(bos);
            oos.writeObject(this);

            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream objectInputStream = new ObjectInputStream(bis);
            return  (MyUser)objectInputStream.readObject();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

3、接口

package com.huang.mapper;

import com.huang.pojo.MyUser;

import java.util.List;

public interface userMapper {
    public List<MyUser> selectAllUser();
}

4、接口对应mapper文件

<?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">
<!--保定一个对应的dao/mapper接口-->
<mapper namespace="com.huang.mapper.userMapper">

    <select id="selectAllUser" resultType="MyUser">
        select * from user
    </select>
</mapper>

5、resource下的mybatis配置文件

<?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>

    <typeAliases>
        <package name="com.huang.pojo"/>
    </typeAliases>

</configuration>

6、spring和mybatis的关键(把原来需要在mybatis-config.xml中配置的数据写入到spring容器中,并由容器来实例化SqlSessionFactory等对象)

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

<!--    相当于原来在mybatis-config。xml中配置environment-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <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"/>
<!--   绑定mybatis-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--        相当于扫描mapper.xml -->
        <property name="mapperLocations" value="classpath:com/huang/mapper/*.xml"/>
    </bean>
<!--就是Sqlsession-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--        构造器创建SqlsessionFactory-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    <bean id="userMapperImpl" class="com.huang.mapper.userMapperImpl">
        <property name="sqlSession" ref="sqlSessionTemplate"/>
    </bean>
</beans>

二、第二种

不需要实例化sqlSessionTemplate 从SqlSessionDaoSupport中获取sqlsession对象

例子:

package com.huang.mapper;

import com.huang.pojo.MyUser;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.dao.support.DaoSupport;

import java.util.List;

public class userMapperImpl2 extends SqlSessionDaoSupport implements userMapper {
    public List<MyUser> selectAllUser() {
        return getSqlSession().getMapper(userMapper.class).selectAllUser();
    }
}

//不在需要实例化sqlSesion直接从父类中去取 简化操作而已
<bean id="userMapperImpl2" class="com.huang.mapper.userMapperImpl2">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
 </bean>

13、声明事务

1、回顾事务

把一组任务当作一个任务要么成功要么都失败,在项目开发中十分重要确保完整性和一致性。

ACID原则:

1、原子性

2、一致性

3、隔离性:多个业务操作一个资源避免出现数据损坏

4、持久性:一旦提交数据不在受影响

2、spring中的事务管理

1、编程式:AOP

2、声明式:需要在代码中,进行事务管理

声明式:

在配置文件中加载切面类,且切入。

1、不再手写切面类,而是直接再spring容器中注入

<!--    结合aop进行事务回滚 相当于写了一个切面类-->
    <tx:advice  id="txAdvice" transaction-manager="transactionMannager">
<!--        给哪些方法配置事务-->
<!--    propagation传播特性    -->
        <tx:attributes>
            <tx:method name="add" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="update"  propagation="REQUIRED"/>
            <tx:method name="query" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
<!--    将事务管理切面了切入-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.huang.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>

关于propagation

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值