String入门项目开发笔记

持久层、业务层、展现层

  1. 持久层:数据访问层又称为DAL层,有时候也称为是持久层,其功能主要是负责数据库的访问。 简单的说法就是实现对数据表的Select(查询),Insert(插入),Update(更新),Delete(删除)等操作。 如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。
  2. 业务层:
  3. 展现层:

什么是JSP?

JavaServer Pages(JSP)是一種技術,用於開發支持動態內容,這有助於開發人員通過使用專用的JSP標簽中插入Java代碼的HTML頁麵的網頁,其中大部分開始 <% 並以標簽 %> 結束。

一個JavaServer頁麵的組件類型為Java servlet,其目的是實現一個用戶界麵的Java Web應用程序。 Web開發人員編寫JSP為文本文件,結合HTML或XHTML代碼,XML元素,並嵌入JSP動作和命令。

使用JSP,用戶通過網頁形式,從數據庫或其他來源目前記錄收集輸入,並動態創建的網頁。

JSP標簽可用於各種目的,例如從數據庫中檢索信息或登記的用戶偏好,訪問JavaBeans組件,傳遞頁麵之間的控製和請求,網頁等之間共享信息

什么是事务(管理)

我们在实际业务场景中,经常会遇到数据频繁修改读取的问题。在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能造成数据不可挽回的错乱,所以我们需要用事务来对数据进行管理。

事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
通俗理解,事务其实就是一系列指令的集合。

  • 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  • 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  • 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
  • 持久性:当事务正确完成后,它对于数据的改变是永久性的。

Spring事务管理(一)什么是事务?
Spring事务管理(二)Spring中的事务管控
Spring事务管理(三)使用tx标签

异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]

使用Spring 的JDBCtemplate 调用数据库的时候
出现了如下的问题:
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
同时会出现什么Could not retrieve transation read-only status server之类的报错并提示sql语句有问题,一定要多检查!!
这个一般是因为SQL语句出错 会报这样的错误。
这个时候关注Sql 语句的格式(单引号吖逗号啊等等) 以及字段长度 的问题。
这类问题一般是数据库的字段和输入的数据库的数据类型不匹配。比如一个int字段 数据库设置只为int length 为5 如果你用的sqlYong软件或其他软件在该程序中加了一个length为6的,就会报出次错误,又或者,你输入一个不正确的date格式,数据库会自动转换成0000-00-00,mybatis会识别,这也是一个不正确的,解决办法,就是修改字段类型或者修改数据,使其一致即可。

解释原因:据说,mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 现在说第二种方式
命令行进入MySQL数据库
输入以下指令,逐行输入,每行后加一个回车:

1
2
3
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; #更新用户密码为123456当然也可以自己指定
FLUSH PRIVILEGES; #刷新权限

原文链接:https://blog.csdn.net/CheneyKKE/article/details/80272777

IDEA中配置MySQL出现Server returns invalid timezone

首先,出现该问题的原因是MySQL驱动jar中的默认时区是UTC。

UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。

因为时区不一致,所以提示Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually
服务器返回了无效的时区,去“高级”标签中手工设置“serverTimezon”属性值。

修改

mysql设置事务隔离级别

事务隔离级别指的是在处理同一个数据的多个事务中,一个事务修改数据后,其他事务何时能看到修改后的结果。
MySQL数据库事务隔离级别主要有四种:

  • Serializable 串行化,一个事务一个事务的执行
  • Repeatable read 可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
  • Read committed 读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值
  • Read uncommitted 读取未提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。

MySQL数据库默认使用可重复读( Repeatable read),而使用乐观锁的时候,如果一个事务修改了库存并提交了事务,那其他的事务应该可以读取到修改后的数据值,所以不能使用可重复读的隔离级别,应该修改为读取已提交Read committed。

1
2
3
4
5
6
# 修改全局事务隔离级别,有以上四个可选参数
mysql> set global transaction isolation level read committed;
# 修改当前会话的事务隔离级别
mysql> set session transaction isolation level read committed;
# 查看事务隔离级别
mysql> SHOW VARIABLES LIKE '%iso%';

注意:这里修改事务权限的语句是:set [ global | session ] transaction isolation level Read uncommitted | Read committed | Repeatable | Serializable;

如果选择global,意思是此语句将应用于之后的所有session,而当前已经存在的session不受影响。

如果选择session,意思是此语句将应用于当前session内之后的所有事务。

如果什么都不写,意思是此语句将应用于当前session内的下一个还未开始的事务。
重启了电脑之后,mysql的配置是会还原的,所以重启电脑之后需要重新设置一下

回滚

回滚(英语:rollback)是数据库技术中的操作,放弃修改,使数据库状态恢复到此前的某个时刻。这对数据完整性具有关键意义。回滚是数据库事务管理重要一环。

回滚特性通常用数据库日志实现,但也可以用多版本并发控制实现。

servlet是什么呢?

报错Cannot resolve taglib with uri http://java.sun.com/jsp/jstl/core

照着教程写的.jsp文件打开时出现报错,大概就是缺少jar包之类的,解决办法如下:

关于jetty运行报错的问题:

测试的时候jdbcTemplate.update(String sql,Object[] args)方法调用一直报错,后来修改成了最原始的jdbcTemplate.update(String sql)方法后得以解决,就是书写太麻烦了:

希望可以尝试到别的解决办法。
解决了测试的问题之后,project还是无法运行,我把代码拷贝给了小洪,他说只是简单的改了下jdk和maven配置,然后修改了数据库密码就能正常运行了。开始我检查了一遍没有问题,但是我输错了url,所以一直是404。找到正确的url以后,jetty又报错无法解析JSP:

我简直要崩溃了,在小洪的教导下耐心的Google到了一个解决方案
“在网上查了相关错误,有的说是jetty跟所使用的jdk版本不匹配导致的。所以我去网上找了最新的jetty插件,发现已经换了网站了这个插件,现在是在eclipse的官网上,所以我看了最新插件的使用方式后,换了插件配置信息,把原先的换成以下:”

1
2
3
4
5
6
7
8
<plugins>
<!-- maven测试插件 -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.11.v20180605</version>
</plugin>
</plugins>

于是jetty:run正常运行了,大功告成。艹!

在IDEA中配置Tomcat容器

另外补充一下用Tomcat运行project的方法,小洪教我的,首先Google一下Tomcat安装教程,把Tomcat安装好,然后在IDEA中进行配置:
1.

2.

3.

4.