app开发定制Spring5架构,万字文章带你学习

目录



一.Spring框架概述

1,Spring是一个  开源的  轻量级的  JavaEE框架。

轻量级:体积小,jarapp开发定制独立使用不需要依赖其他jar包,

开源:免费,app开发定制可以提供源代码

框架:app开发定制解决开发的复杂性,app开发定制简化企业开发。

2,springapp开发定制的两个核心部分:,Aop

IOC:,app开发定制把创建对象的过程交给spring进行管理。

:面向切面,app开发定制在不修改源代码的情况下,app开发定制进行功能的添加或增强。

3,springapp开发定制框架的特点:

1),方便,简化开发:app开发定制对象与对象之间的关系依赖spring。

2),Aop编程支持:app开发定制不改变源代码,增强功能

3),方便测试;

4),app开发定制方便集成各种优秀框架。

5),app开发定制方便进行食物管理,降低APIapp开发定制的使用难度

6),javaapp开发定制源码经典学习范例。

4,入门案例:

1),下载Spring5:

spring网址 : spring.io

app开发定制直接下载地址:

app开发定制还要下载一个日志jar包,spring5app开发定制依赖于这个jar包commons-login这个jar

下载链接:

app开发定制我个人下载5.2.6

 

 2),app开发定制下载完成以后,app开发定制参加一个普通的java项目,将jar导入项目

 3),使用spring

(1),app开发定制创建普通类,app开发定制在类中创建普通方法

  1. public class User {
  2. public void add(){
  3. System.out.println("add.......");
  4. }
  5. }

(2),创建spring配置文件,app开发定制在配置文件中配置文件app开发定制配置创建的对象

a,Spring配置文件使用xml文件配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!--配置User对象创建-->
  7. <bean id = "user" class = "com.yuge.User"></bean>
  8. </beans>

b,创建测试类Test

  1. public class Tset {
  2. @Test
  3. public void testAdd(){
  4. //1.读入上下文配置文件
  5. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  6. //2.获取配置对象
  7. User user = context.getBean("user", User.class);
  8. System.out.println(user);
  9. user.add();
  10. }
  11. }

c,测试结果,成功创建对象,并调用方法

二,IOC容器

1.IOC底层原理

1),什么是IOC:

       控制反转,将对象的创建和对象之间的交互作用,都交给spring进行管理 。开发人员直接取出使用。

        正转:由开发人员自己进行对象的创建和依赖的注入,开发人员自己管理,就是正转。

2),使用IOC的目的

为了降低耦合

3)IOC入门案例

2,IOC底层原理

1),xml解析,工厂模式,反射

2)图解IOC底层原理

传统方式:

 工厂模式:

IOC模式:

 

3.IOC接口(BeanFactory)

IOC基于容器完成,IOC容器的底层就是对象工厂

1),BeanFactory接口:

IOC容器的最基本实现,是spring内部的使用接口,不提倡给开发人员使用。

2),ApplicationContext接口:

是BeanFactory的子接口,提供比BeanFactory更强大的功能,一般为开发人员使用

3),两接口的区别

 

因为我们在使用Spring框架时,一般都是配合网页使用,使用BeanFactory创建对象时,不会创建对象,而加载配置文件的时候,是在服务器启动的时候,使用tomcat,都是将系统加载文件等费事非空间的事放在tomcat启动时完成,以提供更好的用户体验,所以采用ApplicationContext接口

4),applicationContext的实现类

 

4.IOC操作Bean管理(基于xml)

1),什么是bean管理:

A,bean管理包括两个步骤:Spring创建对象和Spring属性注入

5,bean管理的实现方式:

a,基于xml配置文件的实现方式

1.基于XML方式创建对象

id属性:给class类路径取个别名

class属性:创建对象类的全路径

XML方式创建默认对象默认使用空参构造器

 2.基于XML方式的属性注入

(1),DI:依赖注入,就是注入属性。

DI与IOC的区别:DI是IOC的一种实现。

方式一:使用setter方式注入

A,使用setter方式注入,必须提供无参构造方法,必须实现setXXX()方法。

 B,在配置文件中配置对象创建,配置属性注入

方式二:使用有参构造方法注入

 方式三:p名称空间注入:

第一步:

第二步:

 3.注入空值和特殊字符

一,注入空值

 

二,注入特殊符号

 4,注入bean

1),注入外部bean

引入外部bean,用service调用Dao层,就是引入外部bean的过程。

2)注入内部bean 和 级联赋值

级联赋值方式1:不需要dept的get方法。

 

级联赋值方式2:第二种方法需要创建dept的get方法。

 

 5.注入集合属性

0),创建Stu类,User类

  1. package com.yuge;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class Stu {
  7. //数组类型
  8. private String course[];
  9. //List类型
  10. private List<String> name;
  11. //Map类型
  12. private Map<String,String> map;
  13. //Set类型
  14. private Set<String> set;
  15. //List类型中存入多个对象
  16. private List<User> userList;
  17. public void setUserList(List<User> userList) {
  18. this.userList = userList;
  19. }
  20. public void setCourse(String[] course) {
  21. this.course = course;
  22. }
  23. public void setName(List<String> name) {
  24. this.name = name;
  25. }
  26. public void setMap(Map<String, String> map) {
  27. this.map = map;
  28. }
  29. public void setSet(Set<String> set) {
  30. this.set = set;
  31. }
  32. public void show(){
  33. System.out.println(Arrays.toString(course));
  34. System.out.println(name);
  35. System.out.println(map);
  36. System.out.println(set);
  37. System.out.println(userList);
  38. }
  39. }
  1. package com.yuge;
  2. public class User {
  3. private String name;
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public void add(){
  8. System.out.println("add.......");
  9. }
  10. @Override
  11. public String toString() {
  12. return "User{" +
  13. "name='" + name + '\'' +
  14. '}';
  15. }
  16. }

1).XML注入数组类型属性

2),XML注入List集合属性

3),XML注入Map集合属性

4),XML注入Map属性

5),在集合中注入对象属性:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:m="http://www.springframework.org/schema/beans"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <!--配置Stu对象创建-->
  8. <bean id="stu" class="com.yuge.Stu">
  9. <!--注入数组属性-->
  10. <property name="course">
  11. <array>
  12. <value>javaSe</value>
  13. <value>Mysql</value>
  14. </array>
  15. </property>
  16. <!--注入List对象-->
  17. <property name="name">
  18. <list>
  19. <value>武巴</value>
  20. <value>巴巴</value>
  21. </list>
  22. </property>
  23. <!--注入Map对象-->
  24. <property name="map">
  25. <map>
  26. <entry key="JAVASE" value="javase"></entry>
  27. <entry key="SPRING" value="Spring"></entry>
  28. </map>
  29. </property>
  30. <!--注入Set对象-->
  31. <property name="set">
  32. <set>
  33. <value>张三</value>
  34. <value>小三</value>
  35. </set>
  36. </property>
  37. <!--在list中注入对象属性-->
  38. <property name="userList">
  39. <list>
  40. <ref bean="user1"></ref>
  41. <bean id="user1=2" class="com.yuge.User">
  42. <property name="name" value="李华"></property>
  43. </bean>
  44. </list>
  45. </property>
  46. </bean>
  47. <bean id="user1" class="com.yuge.User">
  48. <property name="name" value="李烨"></property>
  49. </bean>
  50. </beans>

6),创建测试类

  1. package com.yuge.test;
  2. import com.yuge.Stu;
  3. import com.yuge.User;
  4. import org.junit.Test;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import java.applet.AppletContext;
  8. public class Tset {
  9. @Test
  10. public void testAdd(){
  11. //加载配置文件
  12. ApplicationContext applicationContext =
  13. new ClassPathXmlApplicationContext("bean2.xml");
  14. //创建对象
  15. Stu stu = (Stu) applicationContext.getBean("stu");
  16. stu.show();
  17. }
  18. }

7),输出结果

8).将集合向上抽取为所有bean的公共集合

 第一步:引入新的名称空间:

 第二步:使用util标签完成list集合注入的向上抽取

创建新的Book类测试向上抽取注入list

  1. package com.yuge;
  2. import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
  3. import java.util.List;
  4. public class Book {
  5. private List<String> bookList;
  6. public void setBookList(List<String> bookList) {
  7. this.bookList = bookList;
  8. }
  9. public void test(){
  10. System.out.println(bookList);
  11. }
  12. }

配置XML文件抽取注入list的方法:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:util="http://www.springframework.org/schema/util"
  6. xsi:schemaLocation=
  7. "http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/util
  10. http://www.springframework.org/schema/util/spring-util.xsd">
  11. <util:list id="list">
  12. <value>java从入门到入土</value>
  13. <value>python从入门到入狱</value>
  14. </util:list>
  15. <bean id="book" class="com.yuge.Book">
  16. <property name="bookList" ref="list"></property>
  17. </bean>
  18. </beans>

运行结果:抽取成功

抽取之前的样子:

抽取之后的样子:

还可以抽取更多的对象。

 

 6,Spring中的两种bean

1)普通bean:XML中定义什么类型就返回什么类型

2),工厂bean:XML中定义一个类型,可以返回其他类型

第一步:创建类作为工厂bean,实现FactoryBean的接口

第二步:实现接口里的方法,在实现的方法中定义返回的bean类型

  1. package com.yuge.factoryBean;
  2. import com.yuge.Stu;
  3. import org.springframework.beans.factory.FactoryBean;
  4. public class Mybean implements FactoryBean<Stu> {
  5. @Override
  6. public Stu getObject() throws Exception {
  7. Stu stu = new Stu();
  8. return stu;
  9. }
  10. @Override
  11. public Class<?> getObjectType() {
  12. return null;
  13. }
  14. @Override
  15. public boolean isSingleton() {
  16. return false;
  17. }
  18. }

 第三步:配置XML文件

  1. <bean id="myBean" class="com.yuge.factoryBean.Mybean">
  2. </bean>

测试:

  1. @Test
  2. public void testMyBean(){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
  4. Stu stu = context.getBean("myBean",Stu.class);
  5. System.out.println(stu);
  6. }

结果:

 7,bean的作用域:

 在XML中配置bean时单实例还是多实例:

 

 8,XML的自动装配

自动装配:根据指定的装配规则,(属性名称或者属性类型),Spring自动将匹配的属性值填入。

演示自动自动装配:

1,根据名称装配

2,根据属性类型装配

 9,引入外部属性管理

4.IOC操作Bean(基于注解)

DI(依赖注入),DI时IOC的具体实现

1,spring针对创建对象提供的注解

第一步引入依赖:

第二步:开启组件扫描

第三步:创建类,在类上添加上注解

1,@Component,都可以使用改注解创建对象

2,@Service,一般用于业务逻辑层,或者service层,负责向下访问数据访问层,将结果返回给界面层

3,@Controller,一般用于Web层,界面层,专门用于处理用户请求,将处理的结果返回给客户端

4,@Repository,一般用于Dao层,数据访问层,专门用来创建数据访问层的对象,负责管理数据的所有增删改查操作。

*上面的资格注解,功能都一样,只是将每个注解用于不同层便于开发人员区别。

2,开启组件扫面配置的细节配置

3,使用注解出入属性

1),@Autowired:根据属性类型自动注入(引用类型注入)

第一步:使用注解在各个类中创建对象。

第二步:定义对象属性。在属性上面添加注解。不需要set方法。

2),@Qualifier:根据属性名注入(引用类型 注入)

qualifier注解和Autowired注解需要配合在一起使用

3),@Resource:可以根据属性名和属性类型注入(引用类型注入)

*************以上三种是注入对象,不是普通类型**************

4),@Value:注入普通类型



4,完全注解开发 

1),创建配置类,替代XML配置文件

 2),编写测试类

  

5,为Spring指定多个xml文件

拆分文件的策略:

 6,Spring配置文件的整和

单个整合

 批量整和

 

三,Aop

面向切面(将公共代码抽取出来的,这个公共的部分就是切面),将公共的代码提取出来,在各个模块需要使用该功能时,引入该功能,同时可以在功能需要加强时,不修改其他代码,只需要修改切面上的代码,就可以进行功能加强。

1,什么是AOP

对业务的各个逻辑进行隔离,从而使业务之间的逻辑耦合性降低,提高代码的可重用性,提高开发效率。

 2,AOP的底层原理

1,AOP底层使用动态代理

动态代理:某个方法在执行时,动态的切入了其他功能。(如在实现业务功能时,将日志打印切入到业务功能中,就是动态代理的一种形式)

1,有接口的动态代理,使用JDK的动态代理

创建接口的实现类的代理对象,增强类的方法

2,无接口的动态代理,使用CGLIB动态代理

创建子类的代理对象,增强类的方法

 

2,使用JDK的动态代理 

使用proxy类实现动态代理

 代码实现:

 1,创建接口:

  1. package com.JDK动态代理;
  2. public interface UserDao {
  3. public int add(int a,int b);
  4. public String update(String id);
  5. }

2,创建实现类

  1. package com.JDK动态代理;
  2. public class UserDaoImpl implements UserDao{
  3. @Override
  4. public int add(int a, int b) {
  5. return a+b;
  6. }
  7. @Override
  8. public String update(String id) {
  9. return id;
  10. }
  11. }

3,使用proxy类创建接口的动态代理对象

        

  1. package com.JDK动态代理;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import java.security.PublicKey;
  6. import java.security.UnresolvedPermission;
  7. import java.util.Arrays;
  8. public class JDKProxy {
  9. public static void main(String[] args) {
  10. Class[] interfaces = {UserDao.class};
  11. UserDao dao = (UserDao)Proxy.newProxyInstance(UserDaoProxy.class.getClassLoader(), interfaces, new UserDaoProxy(new UserDaoImpl()));
  12. int res = dao.add(1, 2);
  13. System.out.println(res);
  14. }
  15. }
  16. class UserDaoProxy implements InvocationHandler{
  17. //需要将待增强功能的类的对象传递到代理类中,并通过构造方法,代理类的构造方法将其实例化
  18. //通过UserDaoProxy创建UserDaoImpl的代理对象
  19. private Object obj;
  20. public UserDaoProxy(Object obj){
  21. this.obj = obj;
  22. }
  23. @Override
  24. /**
  25. *增加逻辑写在这个方法内
  26. * @ proxy:代理对象
  27. * @ method:需要增强的方法
  28. * @ args:要增强功能的方法需要的参数
  29. */
  30. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  31. //方法之前
  32. System.out.println("方法之前执行。。。"+method.getName()+"传递的参数:"+ Arrays.toString(args));
  33. //被增强方法执行
  34. Object res = method.invoke(obj, args);
  35. //方法之后执行
  36. System.out.println("方法之后执行。。。"+obj);
  37. return res;
  38. }
  39. }

 

 3,AOP中的相关术语

1,连接点:那些方法可以被增强,那些方法就叫连接点。

2,切入点:世界真正被增强的方法就叫切入点。

3,通知(增强):实际被增强的逻辑部分就叫通知或者增强。

通知有多种类型:

4,切面:把通知应用到切入点的动作就叫做切面

 4,AOP的操作准备

1,Spring框架一般都是基于AspectJ实现AOP操作

AspectJ框架

:强大的面向切面的实现,不是Spring框架的一部分,独立于AOP的框架,一般将Spring和AOP框架一起使用进行AOP操作。

2,基于AspectJ实现AOP操作

(1),基于XML配置文件的AOP操作

(2),基于注解方式实现(使用)

3,在项目的过程中,引入AOP相关的依赖。

 4,切入点表达式

(1),切入点表达式作用:知道对哪个类里面的那个方法进行增强。

(2),语法结构:

                           execution:([权限修饰符][返回类型][类全路径][方法名称](参数列表)

                        简化后:execution(返回值类型方法声明参数(...))

..代表任意参数,如果在路径中出现,代表本路径及其所有的子路径

*代表通配符

举例1:execution((权限修饰可以省略) * com.yuge.UserDaoImpl.add(..));

加强com.yuge.UserDaoImpl的add()方法,传入的参数用..表示,权限修饰符用*,返回值类型省略。

举例2:execution((权限修饰可以省略) * com.yuge.UserDaoImpl.*(..));    对类中的所有方法加强。

举例3:execution((权限修饰可以省略) * com.yuge.*.*(..));    对包中所有类的所有方法加强

5,AOP操作(AspectJ注解)

1,创建一个类,在类中定义方法,使用注解在类中增强该方法。

  1. package com.AOP注解方式;
  2. public class User {
  3. public void add(){
  4. System.out.println("add...................");
  5. }
  6. }

2,创建一个增强类,编写增强逻辑

  1. package com.AOP注解方式;
  2. //增强类
  3. public class UserProxy {
  4. //前置通知
  5. public void before(){
  6. System.out.println("before.............");
  7. }
  8. }

3,进行通知的配置

(0)、引入名称空间

(1),在spring的配置文件中,开启注解扫描

  1. <!--开启注解扫描-->
  2. <context:component-scan base-package="com.AOP注解方式"></context:component-scan>

(2),使用注解创建User对象和UserProxy对象。

(3),在增强类上面添加@Aspect注解

(4),在spring配置文件中开启生成代理对象。

  1. <!--开启AspectJ生成代理对象-->
  2. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

(5),配置不同类型 的通知

a,在增强类方法上面,添加通知类型。使用切入点表达式配置

  1. package com.AOP注解方式;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.*;
  4. import org.springframework.stereotype.Component;
  5. //增强类
  6. @Component
  7. @Aspect //生成代理对象
  8. public class UserProxy {
  9. //前置通知,添加了Before注解,则就会在add()方法之前执行before方法。
  10. @Before("execution(* com.AOP注解方式.User.add(..))")
  11. public void before(){
  12. System.out.println("before.............");
  13. }
  14. //在方法执行之后执行
  15. @After("execution(* com.AOP注解方式.User.add(..))")
  16. public void after(){
  17. System.out.println("after.............");
  18. }
  19. //在方法存在异常时执行
  20. @AfterThrowing("execution(* com.AOP注解方式.User.add(..))")
  21. public void afterThrowing(){
  22. System.out.println("afterThrowing.............");
  23. }
  24. //在方法返回之后执行
  25. @AfterReturning("execution(* com.AOP注解方式.User.add(..))")
  26. public void afterReturning(){
  27. System.out.println("afterReturning.............");
  28. }
  29. //添加环绕方法,在方法执行前后都执行
  30. @Around("execution(* com.AOP注解方式.User.add(..))")
  31. public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  32. System.out.println("环绕之前.............");
  33. //被增强的方法执行
  34. proceedingJoinPoint.proceed();
  35. System.out.println("环绕之后..............");
  36. }
  37. }
  1. package com.AOP注解方式;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class User {
  5. public void add(){
  6. System.out.println("add...................");
  7. }
  8. }
  1. package com.AOP注解方式;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Test {
  5. @org.junit.Test
  6. public void testAdd(){
  7. //加载上下文配置,读取xml配置文件
  8. ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
  9. //获取代理对象
  10. User user = (User)context.getBean("user");
  11. user.add();
  12. }
  13. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xsi:schemaLocation=
  8. "http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop.xsd
  14. ">
  15. <!--开启注解扫描-->
  16. <context:component-scan base-package="com.AOP注解方式"></context:component-scan>
  17. <!--开启AspectJ生成代理对象-->
  18. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  19. <bean id="user" class="com.AOP注解方式.User"></bean>
  20. </beans>

运行结果:

 b,总结:

        after无论是否存在异常都会执行,afterReturning存在异常时不会执行。

6,AOP操作(AspextJ注解)优化

1,提取相同的切入点

  1. //抽取相同的切入点
  2. @Pointcut(value = "execution(* com.AOP注解方式.User.add(..))")
  3. public void pointCut(){
  4. }
  5. //前置通知,添加了Before注解,则就会在add()方法之前执行before方法。
  6. @Before("pointCut()")
  7. public void before(){
  8. System.out.println("before.............");
  9. }
  10. //在方法执行之后执行
  11. @After("execution(* com.AOP注解方式.User.add(..))")
  12. public void after(){
  13. System.out.println("after.............");
  14. }

2,当有多个增强类对同一个方法进行增强时,设置增强类优先级

在多个增强类上面设置优先级使用@Order(整型值)这个注解,整型值越小,优先级越高

  1. //增强类
  2. @Component
  3. @Aspect //生成代理对象
  4. @Order(3)
  5. public class UserProxy {
  6. //抽取相同的切入点
  7. @Pointcut(value = "execution(* com.AOP注解方式.User.add(..))")
  8. public void pointCut(){
  9. }
  1. @Component
  2. @Aspect
  3. @Order(0)
  4. public class UserProxy2 {
  5. @Before("execution(* com.AOP注解方式.User.add(..))")
  6. public void before(){
  7. System.out.println("UserProxy2增强类先执行。。。。。");
  8. }
  9. }

7,AOP操作(XML配置文件)

前提在xml中创建增强类和被增强类的对象

 8,完全注解开发

四,JdbcTemplate

1,JdbcTempalte的概念

Spring对JDBC进行封装,使用JdbcTemplate可以方便的对数据库的操作。

准备工作:

引入依赖:

 配置XML创建类注入属性

 2,使用JdbcTemplate模板对数据库的增删改查

  1. <context:component-scan base-package="com"/>
  2. <bean id = "dataSource" class="com.druid.DruidDataSource" destroy-method="close">
  3. <property name="url" value="jdbc:mysql://localhost:3306/jdbc_db"/>
  4. <property name="username" value="root"/>
  5. <property name="password" value="3.141592654"/>
  6. <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
  7. </bean>
  8. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  9. <!--注入dataSource对象-->
  10. <property name="dataSource" ref="dataSource"></property>
  11. </bean>
  1. public interface BookDao {
  2. void add(Book book);
  3. }
  1. @Repository
  2. public class BookDaoImpl implements BookDao {
  3. //注入JdbcTemplate对象
  4. @Autowired
  5. private JdbcTemplate jdbcTemplate;
  6. @Override
  7. public void add(Book book) {
  8. String sql = "insert into book values(?,?,?)";
  9. int update = jdbcTemplate.update(sql, book.getId(), book.getName(), book.getPrice());
  10. System.out.println(update);
  11. }
  12. }
  1. @Service
  2. public class BookService {
  3. //注入BookDao属性
  4. @Autowired
  5. private BookDao bookDao;
  6. public void insert(Book book){
  7. bookDao.add(book);
  8. }
  9. }
  1. package com.druid;
  2. public class DruidDataSource {
  3. String url;
  4. String password;
  5. String username;
  6. String driverClassName;
  7. public void setUrl(String url) {
  8. this.url = url;
  9. }
  10. public void setPassword(String password) {
  11. this.password = password;
  12. }
  13. public void setUsername(String username) {
  14. this.username = username;
  15. }
  16. public void setDriverClassName(String driverClassName) {
  17. this.driverClassName = driverClassName;
  18. }
  19. private void close() {
  20. }
  21. }
  1. package com.test;
  2. import com.bean.Book;
  3. import com.service.BookService;
  4. import org.junit.Test;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class TestJdbcTemplate {
  8. @Test
  9. public void test(){
  10. ApplicationContext context =
  11. new ClassPathXmlApplicationContext("bean4.xml");
  12. BookService bookService = context.getBean("bookService", BookService.class);
  13. Book book = new Book();
  14. book.setId(1);
  15. book.setName("一阳指");
  16. book.setPrice(250);
  17. bookService.insert(book);
  18. }
  19. }

查询返回某一个值

 查询返回某一个对象

 

查询返回一个集合

  3,使用JdbcTemplate模板对数据库的批量操作

 

 

 五,事务操作

1,事务的概念:

回顾:事务是指一组基本的数据操作单元,要么全部完成操作,要么全部都不完成操作。

典型事务场景:银行转账

事务的四大特性(ACID):原子性,一致性,隔离性,持久性

2,事务环境的搭建

3,spring事务管理的介绍

1,事务添加到JavaEE的三层体系结构的Service层(业务逻辑层)

2,在Spring事务操作:

1),有两种方式:编程式(在方法中添加代码)和声明式(基于XML或者基于注解方式)

2),声明式事务管理:底层使用到AOP

3),Spring事务管理相关的API

 

 

 4,多事务之间事务的传播行为:

5, ioslation关于事务的隔离级别:

事务的隔离性:多事务的操作之间不会相互影响

如果不考虑隔离:会导致脏读,幻读,不可重复读的问题

解决隔离级别:

 配置隔离级别:

6,关于事务的超时限制:

 7,readOnly是否只读:

 

8,rollbackFor:回滚

9,noRollbackFor:不回滚

10,事务完全注解开发

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发