重点从第四章和第五章开始应用举例学习,前面三章都是叙述和介绍,真正应用上,只有第五章的MyBatis和Spring的框架整合是需要用的到的。建议结合Java web的数据库操作 和第五章的应用举例一起学习。(学习第一节Spring入门之后,就去学习Spring的补充,不然后面的会有些难进行。)(34条消息) 学习Spring的补充_one day321的博客-CSDN博客
一、Spring入门
Spring是一个轻量级的控制反转 (IoC-Inversion of Control)和面向切面 (AOP-Aspect Oriented Programming)的容器(框架)。它采用分层架构,由大约20个模块组成,这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation、Messaging和Test等部分。
第一步:下载jdk.
这里我用的是jdk 9.0.1
下载地址:Index of java-local/jdk/9.0.1+11 (huaweicloud.com)
(这个是国内的镜像源)
碰到了一点意外:在搭建环境变量时,发现这里,我在用户变量那里构建jdk的位置之后,但是在系统变量的path路径下放进去之后,在cmd条件下,可以运行java。但是运行不了javac。说明系统环境变量构建错误。将放在JAVA_HOME的路径放在系统变量之后,这个问题得到解决了。就是说JAVA_HOME这个变量不需要。正确情况:输入javac能够运行,则jdk安装完毕。
参考博客:
补充:如果要运行javac,需要将bin\ 这个路径添加到系统变量的path路径下。
如果是只需要运行tomcat,那么只需要在系统变量里新建JAVA_HOME和JRE_HOME的路径就可以。
第二步:安装web服务器。(Apache Tomcat)
这里我安装的是tomcat 9
下载地址:Apache Tomcat® - Apache Tomcat 9 Software Downloads
在cmd的条件下运行:startup.bat。运行成功,说明安装成功。并在网页输入:localhost:8080。
如果显示出网页,则启动网页成功。
第三步:安装Eclipse.
这里我使用的是IDEA。随便网上找一个就可以。
创建第一个web项目:
参考博客:如何使用IDEA创建Web项目 - 木原纺 - 博客园 (cnblogs.com)
有几个点不太理解:
比如,创建classes和lib文件夹,并设置模块路径:使用模块编译输出路径
1号是 项目配置,在创建项目的时候就自动配置好了
2号是 模块配置,在创建classes文件和lib文件后,要配置他们的编译路径(?不知道为什么要配置)解决:存放的是编译后的字节码文件.class。
3号是 暂无介绍 (在2号Dependencies 里面配置jar or directions 依赖包 ,点击lib路径,里面存放的就是依赖项,只不过,我这里还没有开始存放。一般是一些jar文件。在maven创建web项目里面,这里就会有jar文件。)
4号是 制定了web目录不是一个普通的文件夹,而是web项目 (如果没有指定路径,需要配置我们创建项目的路径,一直指到web.xml)(一般在创建web项目的时候,这个也就配置好了)
5号是 部署项目连接web服务器。(在这里部署项目的时候,这里就自动配置好了。)
需要手动配置的只有2和3,为新建的class和lib文件添加 编译路径,依赖路径
疑惑:书上介绍,在创建号Web项目后,要导入Spring的JAR包,(4个基础包和一个第三方依赖包。)这些包属于Spring Framework jar。(如果你使用的有maven,那么可以通过maven导入包。就不需要特意去下载了,maven会给你自动导入。)
所以这里我们再介绍一种,
通过maven创建web项目:
参考博客:(29条消息) idea如何使用maven创建web项目_向上的狼的博客-CSDN博客
通过这种方式创建web项目,存在没有java代码存放的位置。解决方式:
Intellij IDEA创建maven项目无java文件问题 - 简书 (jianshu.com)
关于maven项目的一些介绍:
(29条消息) 在 IDEA 中创建 Java Web 项目的方式(详细步骤教程)_idea创建java web项目_JAVA序码的博客-CSDN博客
看了一些maven配置的博客,其实maven分为两类,一类是下载idea,它会自带默认的maven配置,这个配置放在c盘仓库。
第二类,就是去官网手动下载一个apache-maven 。
(29条消息) 使用idea自带的maven 是个大坑 不要用_idea自带的amven有什么问题吗_w3x3g的博客-CSDN博客
小结:选择去官网下载一个maven,然后导入IDEA。不建议选择第一种默认的。
重点在这里:
手动配置:
(29条消息) Intellij IDEA 2021 Maven 配置指南_intellij 配置maven_本仙女暂时不想取名的博客-CSDN博客
需要注意一下版本问题,我的IDEA是2022版本,还蛮新的,反正也兼容旧版本,就直接下载一个Maven 3.6.3版本。
(29条消息) IDEA 2018 2020 2021 2022 各版本对Maven版本兼容问题汇总_idea2021和2022区别_libin9iOak的博客-CSDN博客
在使用阿里云下载maven配置时,还需要注意一个问题,如果创建项目里面没有出现:显示阿里云下载位置,说明,之前配置失败。使用的还是默认路径。解决方法,是关闭项目,从全局设置里面去修改Maven的位置。
修改:
(30条消息) 解决2021版本IDEA一导入新项目就更改为默认maven路径的问题_Chrrris-J的博客-CSDN博客
到这一步,还没有完成。web项目还不够完整,需要手动配置完整。没有java和resources目录,需要手动完成创建补齐。
步骤:选择这个Internal。前提是全局Maven的路径已经配置好了。(注意·一下我使用的IDEA是2022版本的,和之前的IDEA版本不一样,它创建Maven Web项目的页面被简化了)
(30条消息) IDEA2022版本创建maven web项目(两种方式)最全图文教学_idea创建web项目没有web文件夹_Cata卡塔丽娜的博客-CSDN博客
这里稍微注意一下,需要补充创建test目录,直接src ——>new directory 。然后会有提示创建test对应的两个文件,java和resources
这个test目录的作用,是留给单元测试写代码的时候使用,是作为测试工程师的工作。
到这里,Maven创建Web项目已经完成。和之前不使用Maven创建Web项目对比,这里不需要创建classes文件夹和lib文件夹,不需要在去lib文件导入jar包。它会根据需求自动导入。
创建第一个Spring 入门程序:书本P9
二、Spring IoC
它的本质是降低程序间的耦合性,在传统编程模式下,调用者采用“new 被调用者” 这样的关系创建对象。不利于后期代码的升级和维护。
而Spring框架出现后,对象的实例可以通过Spring容器来创建。这样控制权由调用者转移到Spring 容器,控制权发生了反转。这就是Spring的控制反转。实现方法就叫做,依赖注入。
Spring IoC的工作机制:
Spring IoC(控制反转)是Spring框架的核心,它通过将对象的创建和管理交给第三方(Spring容器)来实现对象之间的解耦。Spring容器会根据配置信息来创建和管理对象,包括对象之间的依赖关系。这个过程也被称为依赖注入(DI)。
Spring IoC容器有两种类型:BeanFactory和ApplicationContext。BeanFactory是基础类型,提供了基本的IoC功能,而ApplicationContext是BeanFactory的子接口,提供了更多的高级功能,如事件发布、国际化处理等。在实际应用中,我们通常使用ApplicationContext。
Spring IoC容器通过读取配置文件来获取Bean的配置信息,并根据这些信息来创建和管理Bean。配置文件可以是XML格式,也可以是基于注解或Java配置类的方式。在配置文件中,可以定义Bean的属性、构造方法参数、依赖关系等信息。
Spring IoC通过控制反转和依赖注入来实现对象之间的解耦,使得代码更加灵活、可维护。
BeanFactory 方式用的不多。
主要介绍 ApplicationContext:
它是BeanFactory的子接口,也称为应用上下文。由org.springframework.context.ApplicationContext 接口定义。
创建ApplicationContext 接口实例有三种方法:
1. 通过ClassPathXmlApplicationContext创建。ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。(用于Java应用)
2. 通过FileSystemXmlApplicationContext创建。FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。(灵活性差,一般不考虑)
3. 通过Web服务器实例化ApplicationContext容器。(用于web应用)
依赖注入类型有两种类型:
1.使用构造方法注入
2.使用属性的setter方法注入 (主流方式)
三、Spring Bean
在Sprintg的应用中,Spring IoC容器可以创建、装配和配置应用组件对象,这里的组件对象就叫做Bean。这里主要介绍如何将Bean装配注入到Spring IoC容器中。
Bean的配置:
Bean就是Spring的组件。主要以XML格式的配置文件。它的组件元素对象是:<beans>里面包含多个<bean>子元素。
常见子元素:见书本P21 表3.1
Bean的实例化:
如果要使用Spring容器中的Bean,需要实例化。有三种方式:构造方法实例化(主流)、静态工厂实例化和实例工厂实例化。
由于时间性的问题,对现在没有帮助的知识点一律快速看一遍,等用到的时候再回来回顾!!!
Bean的装配方式:
可以理解为将Bean依赖注入到Spring容器里,即依赖注入方式。Spring容器支持基于XML配置的装配、基于注解的装配(主流)以及自动装配。
看书例子P31,配置Bean,这个很重要!!!能够帮助理解Bean的作用。
注解其实就是写代码里面,在写一个类之前,用一个注释标明它的ID,这个id就是applicationContext的bean id。作用就是,之后进行测试的时候,可以直接调用id就能获取到接口。(去学习Spring的补充那一部分博客,就能明白这个注解大概的作用)
四、Spring的事务管理
包括编程式事务管理和声明式事务管理。
首先需要掌握,Spring的数据库编程。Spring框架为开发者提供了JDBC模板,即jdbcTemplat。
但在实际应用上,使用的MyBatis框架进行数据库编程。这里用Spring框架主要介绍事务管理。
Spring的事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性。Spring事务管理分为编程式事务管理和声明式事务管理两种。编程式事务管理允许用户在实现代码中使用显式的方式调用beginTransaction ()开启事务、commit ()提交事务、rollback ()回滚事务,从而可以达到精确定义事务的边界。而声明式事务管理则无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。Spring 的声明式事务管理在底层采用了 AOP 技术。
Spring提供了多种事务管理器来进行事务管理。Spring 的事务管理器是基于AOP 实现的。在 Spring 的事务管理器中包含了配置事务传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。在 Java EE 项目开发经常会使用分层模式,Spring 的事务处理位于业务逻辑层,它提供了针对事务的解决方案。
1.Spring JDBC的配置:需要记忆 书本P62
分为两步:配置数据源 配置JDBC模板(注入引用数据源关系)
Spring JdbcTemplate的常用方法:省略,需要记忆
在applicationContext.xml配置jdbc的步骤:
第一步:配置数据源。 (bean id class ) (其实就是告诉依赖包)
第二步:连接Mysql驱动
第三步:连接url、username、password (前三步是一个整体)
第四步:配置jdbc模板 (依赖包),使之可以使用JdbcTemplate的方法(例如:query)
需要告诉它的注入方式是dataSource。(依赖注入)
2.事务管理:分为两种。
编程式事务管理:基于底层API的编程式事务管理 (现在不用了)
基于TransactionTemplate的编程式事务管理:(也少用)
由于编程式事务管理会造成,在业务逻辑层(daoImpl)参杂事务处理的代码(Service层)。于是声明式事务管理应运而生。但编程式事务管理可以做到作用到代码块级别,比声明式事务管理更细化。
声明式事务管理(主要介绍这种) : 基于XML的方式 (暂时略过)
基于@Transactional注解的方式 (记住,但存在局限性)
主要学会声明式事务管理: 声明式事务管理的方式 将事务管理简化到了极致,大大提高了编程开发效率。
应用举例:实现声明式事务管理的查询操作。(其实也就是主流的查询操作方式)
说明:注意依赖注入的方式,这里用dao层实现数据访问数据库。 用service层表示业务逻辑,即查询数据库数据获得结果集。用Controller层 接受结果集,并编写测试类,输出。
和之前相比,不把数据库查询获得结果放在测试类。而是用业务逻辑来获取结果。其实Controller层接受业务层传递的结果集 没有必要,直接用测试类来接受业务层的结果就可以了。 但是在下面学习Mybatis时很有必要要有一个controller层。
应用写完后,发现,这个事务管理,好像没有起什么作用?因为就算我划分了业务逻辑层,但是,无论是查询还是插入,结果和没有添加事务管理之前是一样。就算添加事务管理,结果也并没有什么不同。???疑惑。
五、MyBatis开发入门
MyBatis是主流的Java持久层框架之一。比较重要。它消除了几乎所有的jdbc代码和参数的手工设置以及结果集的检索。它使用前面的事务声明管理方式(基于XML和基于注解方式) 用于配置和原始映射。将接口和java的POJOs(Java对象)映射成数据库中的记录。(POJO类型,就是对象类型)
Mybatis的工作原理: 略过,可以看书理解一下,现在不单独使用Mybatis。
Mybatis与Spring框架的整合开发:(重点、重难点、主流方式,需要记忆)
Mybatis框架的重点是SQL映射文件。
步骤:(建议和Spring补充学习的步骤结合来看)
第一步:pom.xml 导入需要的依赖包,这里比之前多了Mybatis的依赖包
第二步:编写Mybatis的映射文件。自己写一个mybatis包,里面存放这个xml文件。主要存放sql映射。
第三步:编写mybatis-config.xml文件。就一个mappers接口。告诉去哪找映射文件。
(这个文件,需要自己去参照模板复制,参考博客:看了很多个都是复制模板用的。(35条消息) IDEA创建mybatis的xml文件_idea mybatis 生成xml_笙箫123的博客-CSDN博客)
还有一种方法下载mybatis插件,但是现在不建议使用插件的方法,等后面学的差不多了可以考虑插件更方便一些。
第四步:编写代码(dao层,接口方法和第五步的映射文件方法保持一致)
第五步:在appicationContext.xml文件里面配置Mybatis工厂。(<bean id class >)
同时指定它的核心配置文件:mybatis-config.xml文件。
第六步:回到appicationContext.xml文件里面,使用Spring去管理MyBatis的数据操作接口。就是直接bean class="MapperScannerConfig" (没有id,指定全为这个Mapper的数据源)
然后指定 它的扫描文件(一般是和sql映射文件匹配的dao层) 和 前面Mybatis工厂的映射。
第七步:编写日志文件log4j.properties,并编写测试类。参考博客:
(35条消息) IDEA下配置Log4j教程_idea配置log4j_小晴噗噗的博客-CSDN博客
applicationContext一般编写都放在测试类的前面。(都放的比较晚)
区别前面的Spring的事务管理,多了第二步创建SQL映射文件。 前面 没有创建映射文件这种,直接到需要使用的时候,在进行创建调用 。使用mybatis就可以将sql语句分割开来。单独使用一个xml文件存放sql语句。
所以,到现在为止,只介绍了三种配置文件: (应该还有一个xml的映射文件,存放sql语句)
小结:Mybatis的开发实质上就是,单独用一个xml文件存放sql语句 。 比单独使用Spring框架 更加优化,不需要再去实例中使用sql语句。
应用举例:再前一章 应用举例的基础上 加上Mybatis框架整合开发。
实现查询,添加,修改,删除操作。
第一个扩展:发现applicationContext文件里面,<property name="" ref 或者value >这个name的名称不能自己定义,只有ID可以自己定义。name它一般都是指定的一个类。对应它的内容类。
需要去学习一下这些含义。
第一个问题:Could not find resource mybatis/RegisterMapper.xml
原因在于IDEA默认是resource目录,不会编译在src/java目录下的xml文件,所以找不到该文件。
参考博客:解决方式,去pom.xml文件添加编译路径。
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
(35条消息) mybatis错误——java.io.IOException: Could not find resource com/xxx/xxxMapper.xml_阿飞云的博客-CSDN博客
第二个问题:Annotation-specified bean name 'userDao' for bean class [dao.UserDao] conflicts with existing, non-compatible bean definition of same name and class [dao.UserDaoImpl]
原因在于dao层 使用了:@Repository("userDao")
这是声明这是数据访问层的意思,但是我在另一个dao类里面又声明了一次,就会导致冲突。 @Repository("registerDao")
解决方式:注释掉一个注解就可以。
总结:Mybatis和Spring框架的整合,就是单独使用一个xml存放sql语句。相比之前,是使用Spring的JdbcTemplat类的query方法,这个方法是系统自带的(而且写一个dao类,必须有一个实现类,实现类存放JdbcTemplat类方法)。而使用Mybatis(dao类只写接口就可以了,简化了代码量),就可以自定义增删改查的方法。
练习:使用Mybatis和Spring框架整合 ,实现删除id=2016的数据库内容。
第三个问题:Type org.apache.ibatis.session.SqlSessionFactory not present
第四个问题:Invalid bound statement (not found): dao.UserDao.queryAll
第五个问题:org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 18; 元素类型为 "mapper" 的内容必须匹配 "EMPTY"。
第六个问题:Exception in thread "main" java.lang.AbstractMethodError: Method com/mysql/jdbc/ResultSet.isClosed()Z is abstract
解决方式:这个意思是 mysql的版本太低了,重新导入一个mysql的依赖包。
我换成5.1.24问题就解决了!!