菜缤的世界 CairBin's Blog - JavaEE
type: channel
link: https://blog.cairbin.top/index.php/tag/JavaEE
items: Spring MVC上手——核心类、常用注解与RESTful
items: Spring MVC上手——JSP语法基础
items: Spring MVC上手——Maven创建Spring MVC项目
items: Spring MVC上手——MVC模式与三层架构
items: MyBatis与Spring整合使用
items: MyBatis入门——关联映射
items: MyBatis入门——动态SQL
items: MyBatis入门——了解MyBatis
items: Spring初步——Spring事务管理
items: Spring初步——Spring JDBC

Spring MVC上手——核心类、常用注解与RESTful
type: item
date: 2024-04-01T10:33:47+00:00
description: 核心类、常用注解与RESTfulDispatcherServletDispatcherServlet全称org.springframework.web.servlet.DispatcherServlet。DispatcherServlet并不直接处理请求，它只负责根据请求的信息把请求转发给合适的处理器，然后由处理器来执行实际的处理过程并生成响应，它是Spring MVC框架的入口点，它将所有这些步骤组合在一起，使得开发者可以更轻松地构建Web应用程序并处理客户端请求。每个Spring MVC应用程序通常只有一个。我们可以在web.xml里进行配置：<servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springCtx.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/springmvc/*</url-pattern> </servlet-mapping>上面例子中所有以/springmvc开头的请求都会被名称为springmvc的DispatcherServlet处理。另外，在上述代码中，有两个可选项<load-on-startup>和<init-param>。<load-on-startup>如果元素的值为1，则启动程序的时候会立刻加载Servlet；如果元素不存在，则在第一个请求时加载。<init-param>存在并配置了路径，则会根据路径寻找配置文件，否则将导WEB-INF下寻找servletName-servlet.xml命名形式的文件。ViewResolverViewResolver即视图解析器，我们可以在springCtx.xml文件中配置它。回顾之前的springCtx.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 name="/hello" class="top.cairbin.test7.controller.TestController" /> <bean class= "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <bean class= "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean> </beans> 再来看看之前的controllerpackage top.cairbin.test7.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class TestController implements Controller{ @Override public ModelAndView handleRequest(HttpS…

Spring MVC上手——JSP语法基础
type: item
date: 2024-04-01T10:32:53+00:00
description: JSP语法入门前提在前一节中我们已经写过JSP的代码了，这一节将单独介绍JSP一些基础语法。当然，你可以跳过这一节，当后面有代码不太理解的时候再回来阅读。中文编码问题如果中文乱码，看看JSP是否是以UTF8的方式编码，使用此编码在JSP文件最上方需要添加下面内容<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>脚本程序脚本程序是包含任意Java语句、变量、方法或表达式。形式如下：<% 脚本程序代码片段 %>我们借助上一节的top.cairbin.test7，稍微对hello.jsp改造下看看效果。<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page isELIgnored="false" %> Hello SpringMvc <% out.println("Hello JSP"); %> 按照上述逻辑来讲应该会在页面显示一个h1的标题，内容为Hello JSP我们访问http://localhost:8080/test7/hello来看看，果然如此。哦，对了，在写语句的时候别忘了那该死的分号。你也可以选择以下等价的XML语句（仍是在JSP文件里写，这里对其他部分省略，用[...]表示）[...] <jsp:scriptlet> out.println("Hello JSP"); </jsp:scriptlet> [...]你大致已经知道JSP书写方式了，为了简洁，在接下来的介绍中除非特殊我们将不再给出演示结果，而是仅介绍用法，请自行在项目中进行测试。JSP表达式表达式先被转化成String，然后被插入到该出现的地方。由于表达式的值会被转化成String，所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。形式如下<%= 这里写jsp表达式，注意前面那个等号 %>它也有等价的XML形式<jsp:expression> 表达式 </jsp:expression>示例，注意这里不能用分号结尾 日期 <%= (new java.util.Date()).toLocaleString() %> JSP声明JSP声明可以声明一个或多个变量、方法等供后面代码使用。JSP声明形式<%! 这里写声明 %>等价的XML<jsp:declaration> 声明的代码片段 </jsp:declaration>示例<%! int num = 114514; %>JSP注释<%-- 我就是JSP注释，此处不会被页面展示，也不会被浏览器看到 --%> 你可以在JSP文件中使用JSP注释和HTML注释，但应当注意JSP注释与HTML有些不同，JSP注释不会被发送到浏览器，而HTML注释会被发送至浏览器并且能在浏览器查看源代码功能中看到！！！在HTML注释中不要写敏感信息！！！JSP指令形式如下<%@ 指令 属性="值" %>经常用到的JSP指令标签有：<%@ page ... %>定义页面依赖属性，比如脚本语言、error页、缓存需求、编码等等<%@ include ... %>包含其他文件<%@ taglib ... %>引入标签库的定义，可以自定义标签对于page常用属性有：language声明当前页面脚本的语言，默认为javaextends指定jsp编译成servlet之后所需要继承的类或者所实现的接口import用于导入当前脚本中可能使用到的其他包里面的类info包含jsp的信息，一般作为当前jsp文件的说明用。可以通过getServletInfo()来获取errorPage指定当前jsp文件发生错误时，自动调用改属性值指定的jsp文件。如果不指定当前属性值，当发生错误时，会抛出异常信息给客户。contentType指定生成网页的文件格式和编码字符集isErrorPage用于指定当前jsp文件是否为错误处理jsp文件JSP行为JSP行为使用XML语法结构控制servlet引擎。它需要严格遵守XML标准：<jsp:行为名称 属性="值" />jsp:include用于在当前页面中包含静态或动态资源jsp:useBean寻找和初始化一个JavaBean组件jsp:setProperty设置JavaBean组件的值jsp:getProperty将JavaBean组件的值插入到output中jsp:plugin用于在生成HTML页面中包含Apple和JavaBean对象jsp:element动态创建一个XML元素jsp:forward从一个JSP文件向另一个文件传递一个包含用户请求的requ…

Spring MVC上手——Maven创建Spring MVC项目
type: item
date: 2024-04-01T10:31:55+00:00
description: Spring MVC项目创建什么是Spring MVCSpring MVC是Spring内置的，实现了Web MVC设计模式的框架。它解决了Web开发过程中很多的问题，例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构，具有相对较高的灵活性和扩展性。Spring MVC官方文档可参考 docs.spring.io。Spring MVC执行流程按顺序可分为如下流程用户请求被DispatcherServlet进行拦截处理DispatcherServlet收到请求调用HandlerMappingHandlerMapping找到具体的处理器，生成处理器对象及处理器拦截器，再一起返回给DispatcherServletDispatcherServlet调用HandlerAdapterHandlerAdapter经过适配调用具体的处理器Controller执行完成返回ModelAndView对象HandlerAdapter将ModelAndView返回给DispatcherServletDispatcherServlet将ModelAndView传给ViewResloverViewReslover解析ModelAndView后返回View（给DispatcherServletDispatcherServlet根据View进行渲染DispatcherServlet响应View给用户通过上面流程可知，程序员需要配置DispatcherServlet，并开发View和Controller/Handler。项目创建即然如此，我们就来创建一个Spring MVC项目。打开Eclipse，创建一个Maven项目（想必经过前面学习已经很熟了），项目名称top.cairbin.test7。但是需要注意，创建时请勾选下图的Add project(s) to working set在Select an Archetype这一步需要注意，我们不再用之前的maven-archetype-quickstart，而是maven-archetype-webapp，如下图所示创建完成后项目目录结构大概如下我们还需要引入Spring MVC的依赖包以及Servlet，这你很清楚应该在pom.xml里配置 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency>最终效果看起来是这样<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>top.cairbin</groupId> <artifactId>test7</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>test7 Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</a…

Spring MVC上手——MVC模式与三层架构
type: item
date: 2024-04-01T10:30:33+00:00
description: MVC模式与三层架构什么是MVC模式MVC模式代表Model-View-Controller（模型-视图-控制器）模式。这种应用模式用于应用程序的分层开发。Model代表存取数据的对象，它自身可带有逻辑，数据变化时更新Controller。View代表Model包含数据的可视化。Controller作用在View和Model之上，控制数据流向Model，并在数据变化的时候更新View，使Model与View分离。三者的关系如下图所示：最典型的MVC就是JSP+Servlet+JavaBean的模式。三层架构三层架构中的“三层”分别指：数据访问层（DAL，Data Access Layer）业务逻辑层（BLL，Business Logic Layer）表示层（USL，User Show Layer）DALDAL也被称为持久层，位于三层最下层，用于对数据进行处理。该层方法一般为“原子性”的。在Java程序中，DAL一般都在dao包中；有时也将实体类放在Dao包中，Mapper的方法放在Mapper包中。BLLBBL起到数据交换承上启下的作用，对于业务逻辑进行封装，但与DAL不同的是，这里的方法一般不是原子的，而是包含业务逻辑。例如删除，就要先进行逻辑判断或数据校验再进行DAL中的删除。BLL一般写在service包中。USL位于最上层，负责与用户进行交互，为用户提供交互界面。其中USL分为前台和后台，前台指用户能够看到的界面，后台指来调用BLL的代码。MVC与三层架构的关系MVC与三层架构没有任何关系。前者是用来解决B/S程序（即浏览器/服务器程序）的耦合关系的，而后者适用于任何技术。二者的设计角度不一样。之所以会混淆，是因为二者经常一块用，USL可以用View（USL前台）和Controller（USL后台）来实现，而BLL和DAL可以由Model来实现。

MyBatis与Spring整合使用
type: item
date: 2024-04-01T10:28:37+00:00
description: SqlSession以及Spring与MyBatis整合准备所需要的JAR包要实现MyBatis与Spring的整合，很明显需要这两个框架的JAR包，但是只是使用这两个框架中所提供的JAR包是不够的，还需要配合其他包使用：Spring的JAR包MyBatis的JAR包Spring与MyBatis整合中间包mybatis-spring-x.x.x.jar数据库驱动JAR(以MYSQL为例)mysql-connector-java-x.x.x-bin.jar数据源所需的JAR(DBCP)commons-dbcp2-x.x.x.jar和commons-pool2-x.x.x.jar配置文件介绍关于resources文件夹我们在之前的项目中，几乎每次都会创建这个文件夹，然后Use as a source folder，那么这个文件夹到底是用来干啥的，凭什么使用它里面的文件是直接写文件名？实际上这个文件夹是专门存放你的应用所需资源的，如XML等配置文件。这个文件夹被标记为source folder后，在编译后，里面的文件会放到与编译好的文件相同目录里，所以你读取的直接使用文件名实际上是相对路径。pom.xml如果我们创建的是一个Maven项目，就可以在pom.xml里添加<properties></properties>标签来定义库版本，然后在下方的<dependencies></dependencies>中的<dependency></dependency>的<version></version>以${...}形式引用它。下面的XML文件省略了很多，仅为了演示。<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> [...] </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> [...] </dependencies>db.propertiesdb.properties主要包含一些数据库连接信息，比如JDBC连接驱动、数据库账户名和密码等。我们在之前的项目中就已经使用过这个文件了，但我们一直没有详细介绍过其每条内容的含义（实际上语义很明显）jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db_mybatis?useUnicode=true&characterEncoding=utf8 jdbc.username=db_mybatis jdbc.password=db_mybatis首先第一行jdbc.driver是指定数据库连接驱动。JDBC即Java数据库连接，它定义了一套关系型数据库的规则，没错实际上就是接口，然后实现并不是由Java官方进行的，而是交给各个数据库厂商来做，它们打包的库也就是JAR包，就被叫做数据库驱动，同时也意味着不同数据库就有不同的驱动实现。程序设计者无需去关心每个数据库驱动是怎么实现的，而是像你把手机充电器插到墙上的插座一样，把驱动按照接口给“插”进去。这就是面向接口编程的好处。你的程序只是一个调用者，数据库驱动就像一个代理人，你要先告诉这个代理人怎么操作，然后让这个代理人去真正操纵数据库（怎么操纵你是不关心的，只要满足你的操作需求即可）。你与这个代理人约定的通用交流方式就是刚才的接口，而代理人具体的操纵方式就是驱动的实现。我们所给的代码中很显然是MySQL的数据库驱动，后面的mysql.jdbc.Driver实际上是随你pom.xml添加的包一块引入的。第二行的是数据库连接URL，它实际上是数据库JDBC连接字符串的一部分。它的书写形式应该参考数据库驱动提供方的文档！jdbc说明这是一个JDBC的连接字符串mysql说明连接的数据库为MYSQLlocalhost所在部分，一般是数据库的网络地址或域名，localhost实际上是一个域名，它在你系统的HOST文件中被解析到了127.0.0.1（通常是这样，不绝对，你完全可以修改它），这个地址是一个回环地址，它实际上表示你机器本身。同理，我的MySQL如果在远程服务器192.168.10.2上面，这里就不再是localhost，而是192.168.10.2或者对应的域名。db_mybatis部分对应数据库名称，这个我…

MyBatis入门——关联映射
type: item
date: 2024-04-01T10:27:45+00:00
description: MyBatis关联映射为什么要关联映射实际开发中，对数据库操作常常会涉及多张表，所以在OOP中就涉及对象与对象的关联关系。针对多表操作，MyBatis提供关联映射。关联关系概述一对一：A类中定义B类的属性b，B类中定义A类属性a。一对多：一个A类类型对应多个B类。多对多：在A类中定义B的集合，B中定义A的集合。嵌套查询与嵌套结果嵌套查询是通过执行另外一条SQL映射语句来返回预期复杂类型：嵌套查询是在查询SQL嵌套一个子查询嵌套查询会执行多条SQL语句嵌套查询SQL语句编写相对简单嵌套结果是使用嵌套结果映射来处理的联合结果子集：嵌套结果是一个嵌套的多表查询SQL嵌套结果只会执行一条复杂的SQL语句嵌套结果SQL语句写起来相对麻烦对于嵌套查询有一个问题，那就是执行多条SQL语句导致性能开销很大。于是就有了MyBatis的延迟加载——fetchType。实践创建表我们还是用之前的账户连接数据库，终端命令可以如下mysql -u db_mybatis -p输入密码敲击回车，然后切换数据库到db_mybatisWindows用户可以用终端或者sqlyog执行下面语句如果你没有这个数据库请回到前面的章节创建它。USE db_mybatis;我们要使用一个新的customer表，所以把之前项目留下的删除掉DROP TABLE IF EXISTS customer;重新创建它CREATE TABLE customer( `id` int(32) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `jobs` varchar(50) DEFAULT NULL, `phone` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;给这张表插入两条数据方便我们接下来写代码用INSERT INTO customer(`id`,`username`,`jobs`,`phone`) VALUES (1,'zhangsan','teacher','11111111111'),(2,'lisi','student','11111111112');创建一张idcard表，并设置主键（主码）为id如果之前存在请删除DROP TABLE IF EXISTS `idcard`;CREATE TABLE idcard( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;同样插入两条数据（身份证号是我瞎编的，为了防止巧合不一定符合真实格式，但长度与现实一样）INSERT INTO idcard(`id`,`code`) VALUES(1,'37010219800X051118'),(2,'370203199X09092222');创建persion表，并插入数据DROP TABLE IF EXISTS person; CREATE TABLE person( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, `card_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_person` (`card_id`), CONSTRAINT `FK_person` FOREIGN KEY (`card_id`) REFERENCES `idcard` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO person(`id`,`name`,`age`,`card_id`) values (1,'张三',18,1),(2,'李四',18,2);创建product表并插入数据DROP TABLE IF EXISTS product; CREATE TABLE product( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `price` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoD…

MyBatis入门——动态SQL
type: item
date: 2024-04-01T10:27:02+00:00
description: 动态SQL什么是动态SQL动态SQL是MyBatis强大特性之一，MyBatis3采用了功能强大的基于OGNL的表达式来完成SQL。动态SQL主要元素常用的动态SQL主要元素如下：如果单独对以上元素解释理解起来还是比较费力的，接下来还是以代码的形式展现。实践基础部分我们还是用之前的项目top.cairbin.test4，我们把src/main/java目录下的top.cairbin.test4包中的CustomerMapper.xml文件里的<mapper namespace="top.cairbin.test4.CustomerMapper"></mapper>中间的内容全部删除，最终效果看上去应该与下面一致：<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="top.cairbin.test4.CustomerMapper"> </mapper>然后把src/test/java目录下的top.cairbin.test4中的测试类MyBatisTest里面的测试方法也删除掉package top.cairbin.test4; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import top.cairbin.test4.*; public class MyBatisTest { }我们先来编写表与对象的映射关系，在CustomerMapper.xml的<mapper>元素之间填写如下内容（注意包名与你的一致）： <resultMap id="BaseResultMap" type="top.cairbin.test4.Customer"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="username" jdbcType="VARCHAR" property="username" /> <result column="jobs" jdbcType="VARCHAR" property="jobs" /> <result column="phone" jdbcType="VARCHAR" property="phone" /> </resultMap> <sql id="Base_Column_List"> id, username, jobs, phone </sql>看起来效果应该跟下面一样，不过在后文中这个文件会越写越长，由于篇幅有限，我们每次仅给出增添部分的代码，而不是每次修改都粘贴全部配置到这里来<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="top.cairbin.test4.CustomerMapper"> <resultMap id="BaseResultMap" type="top.cairbin.test4.Customer"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="username" jdbcType="VARCHAR" property="username" /> <result column="jobs" jdbcType="VARCHAR" property="jobs" /> <result column="phone" jdbcType="VARCHAR" property="phone" /> </resultMap> <sql id="Base_Column_List"> id, username, jobs, phone </sql> </mapper>为了方便操作SqlSession，我们在src/main/java的top.cairbin.test4包下写一个工具类，名称为MyBatisHelperpackage top.cairbin.test4; import java.io.Reader; import org.apache.ibatis.io.Resources; import o…

MyBatis入门——了解MyBatis
type: item
date: 2024-04-01T10:25:00+00:00
description: 了解MyBatis什么是MyBatisMyBatis 是一款优秀的持久层框架，它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO（Plain Old Java Objects，普通老式 Java 对象）为数据库中的记录。MyBatis中文文档 可参考 https://mybatis.net.cn/。MyBatis是不是ORM？什么是ORM？即Object-Relationl Mapping，它的作用是在关系型数据库和对象之间作一个映射，这样，我们在具体的操作数据库的时候，就不需要再去写复杂的SQL语句。JPA是orm框架标准，MyBatis没有实现JPA，和orm框架的设计思路完全不一样。MyBatis是拥抱sql，而orm则更靠近面向对象。Mybatis是sql mapping框架而不是orm框架，当然orm和Mybatis都是持久层框架。MyBatis工作原理使用MyBatis废话不多说，我们直接上手用下。创建数据库与表我们来创建一个名称为db_mybatis的数据库还是老样子，我这里以终端为例，你可以用sqlyog等工具。mysql -uroot有密码的话mysql -u root -p执行SQL语句创建数据库CREATE DATABASE db_mybatis;创建管理该数据库的用户db_mybatis，密码为db_mybatis，访问主机为本机可访问localhost，如果远程访问请改为%。CREATE USER 'db_mybatis'@'localhost' IDENTIFIED BY 'db_mybatis';给它管理db_mybatis的所有权限GRANT ALL ON db_mybatis.* TO 'db_mybatis'@'localhost';刷新权限flush privileges;如果你用的MySQL8.0及以上版本，客户端版本较老，由于加密算法问题需要追加以下语句：ALERT USER 'db_mybatis'@'localhost' IDENTIFIED WITH mysql_native_password by 'db_mybatis';退出MySQL控制台，返回PC终端exit;我们用刚创建的用户连接下mysqlmysql -u db_mybatis -p然后出现提示，输入密码db_mybatis敲击回车，如果密码跟我不一样，这里与你上面的设置一致。切换数据库到db_mybatisUSE db_mybatis;如果表名称已经存在，会影响我们创建，如果你之前不太重要的话就直接删了，如果想要保留那么新建的表就要修改名字DROP TABLE IF EXISTS `customer`;我们创建一张表，名称为customer，主键为id如果用标准的SQL语句来写的话，我这里版本为MySQL5.7，可能会报错如果报错，就替换成以下语句CREATE TABLE customer ( id int(32) AUTO_INCREMENT, username varchar(50) DEFAULT NULL, jobs varchar(50) DEFAULT NULL, phone varchar(16) DEFAULT NULL, PRIMARY KEY(`id`) );我们插入条数据（这里的电话号码是我瞎编的）INSERT INTO customer(id,username,jobs,phone) VALUES(1,'joy','doctor','15544433322');通过SELECT语句查看下，看来是成功的SELECT * FROM customer;创建项目我们创建一个Maven项目，不会的请回Spring初步部分看看。项目名称为top.cairbin.test4，然后修改pom.xml添加依赖项<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>top.cairbin</groupId> <artifactId>test4</artifactId> <version>0.0.1-SNAPSH…

Spring初步——Spring事务管理
type: item
date: 2024-04-01T10:24:44+00:00
description: Spring事务管理概念事务（Transaction）是访问并可能操作各种数据项的一个数据库操作序列，这些操作要么全部执行，要么都不执行，是一个不可分割的工作单元。事务有如下特性：原子性隔离性一致性持久性如果多个事务同时操作同一批数据，则会引发并发异常，设置不同的隔离级别可以解决这些问题。事务的隔离级别如下隔离界别从小到大，安全性越高，但效率就越低。事务的传播行为是指在同一个方法中，不同操作前后所使用的事务。传播行为可以控制是否需要创建事务以及如何创建事务，Spring默认传播行为是REQUIRED。事务的管理方式主要分为两种：编程式事务管理：通过编写代码实现的事务管理，包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚声明式事务管理：通过AOP技术实现的事务管理，主要思想是将事务作为一个“切面”代码单独编写，然后通过AOP技术将事务管理的“切面”植入到业务目标类中为了解耦，我们一般用后者。声明式事务管理基于XMLSpring的声明式事务管理可以通过两种方式来实现，一种是基于XML的方式，另一种是基于注解的方式。基于XML方式的声明式事务是在配置文件中通过<tx:advice>元素配置事务规则来实现的。当配置了事务的增强处理后，就可以通过编写的AOP配置，让Spring自动对目标生成代理。其属性如下。基于注解我们更关心基于注解的方式，下面用代码来了解下我们用之前的top.cairbin.test3项目app.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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="top.cairbin.test3" /> <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/db_javaee" /> <property name="username" value="db_javaee" /> <property name="password" value="dbjavaeepassword" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>在IAccountDa…

Spring初步——Spring JDBC
type: item
date: 2024-04-01T10:24:09+00:00
description: Spring JDBC概念Spring的JDBC模块负责数据库资源管理和错误处理，简化了开发人员对数据库的操作。Spring JDBC通过配置数据源和JDBC模板来配置。针对数据库操作，Spring框架提供了JdbcTemplate类，它是Spring框架数据抽象层的基础，是Spring JDBC的核心类。JdbcAccessor提供了访问数据库使用的公共属性，例如Data Source，DataSource主要功能是获取数据库连接，还可以引入对数据库连接的缓冲池和分布式事务的支持；JdbcOperations定义了可以使用的操作集合，例如增删改查（CURD）。Spring JDBC模块由4个包组成：下面我们真正来用一下。Spring JDBC实践数据库创建首先我们在MySQL中创建一个数据库，由于我是Mac环境，所以我直接在终端中执行SQL语句来完成。如果你没有修改过密码，执行以下命令mysql -uroot如果修改过密码请执行以下命令，根据提示输入密码，输入的时候看不见mysql -u root -p如果你是Windows可以通过sqlyog连接。以下部分通用：执行SQL语句创建数据库CREATE DATABASE db_javaee;我们接下来为这个数据库创建一个单独的用户来管理它，用户名为db_javaee，密码是dbjavaeepassword。CREATE USER 'db_javaee'@'localhost' IDENTIFIED BY 'dbjavaeepassword';这里有必要说明下，如果数据库与你开发环境在同一台机器上，这里可写'localhost'，如果是远程的数据库要改为'%'，即（以下同理）CREATE USER 'db_javaee'@'%' IDENTIFIED BY 'dbjavaeepassword';给这个用户授予权限，如果是远程别忘了改成'%'GRANT ALL ON db_javaee.* TO 'db_javaee'@'localhost';刷新权限flush privileges;这里有个问题得注意下，如果你的MySQL版本是5.7到这里就没啥问题了。如果是MySQL8.0以及更高，则加密算法由原来的sha256_password改成了caching_sha2_password，导致连接新版本数据库报错。新版本用户需要追加ALERT USER 'db_javaee'@'localhost' IDENTIFIED WITH mysql_native_password by 'dbjavaeepassword';如果你root用户登陆不上也有可能是因为这个原因，这时候你就要像Mac用户一样到终端里连接，并将此处的db_javaee改为root才能在旧版sqlyog里或者navcat里连接。项目创建我们还是创建一个Maven项目，名称为top.cairbin.test3，然后在pom.xml里添加依赖包<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.5.RELEASE</version> <scope>test</scope> </dependency>注意这里的mysql-connector-java请用较新的，我之前用5.1.47会报错。同样创建与src平级的resources目录并use as source folder，在里面创建app.xml（跟我们之前的AppCtx.xml一样，名称不固定随你便，不过在main中的必须与这里的文件名一致），并写入如下内容<?xml version="1.0" encoding="UTF-8"?> <be…