做网站后期费用/全媒体运营师培训费用
重点
1.JavaBean的概念
就是一个普通类(实体bean),包含三样标准:
一个无参构造
私有属性
公共的getter和setter方法
2.MVC设计模式
M:Model模型【JavaBean】
V:View视图 【JSP】
C:Controller控制器 【Servlet】
3.分层思想
web层(表示层)、service层(业务层)、dao层(数据访问层)
图示:
4.MySQL事务
4.1 概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。一般超过两条以上的sql操作,建议使用事务,保证数据的安全。
4.2 使用事务
**场景一:**windows命令行
start transaction 开启事务
Rollback 回滚事务
Commit 提交事务
**场景二:**JDBC使用事务
前提:需要Connection对象
Connection.setAutoCommit(false);start transaction
Connection.rollback(); rollback
Connection.commit(); commit
4.3事务的隔离级别
分类:
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。(update)
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。 (insert)
数据库通过设置事务的隔离级别防止以上情况的发生:
- 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中查看当前的事务隔离级别:
select @@tx_isolation; (低版本的mysql)
select @@transaction_isolation;(高版本的mysql,如我的8.0.12)
mysql中更改当前的事务隔离级别:
set transaction isolation level REPEATABLE READ;
5.数据库连接池
5.1常用的数据库连接池
DBCP:是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
C3P0:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
5.2使用方法
DBCP使用
- 添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
- 添加属性资源文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day12
username=root
password=root#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ
C3P0的使用
- 添加jar包
- 编写配置文件c3p0-config.xml(不能更改),放在classpath中,或classes目录中
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/day12</property><property name="user">root</property><property name="password">123456</property><property name="initialPoolSize">10</property><property name="maxIdleTime">30</property><property name="maxPoolSize">100</property><property name="minPoolSize">10</property></default-config>
</c3p0-config>
编写工具类:
6.JNDI
6.1JNDI概念
JNDI(Java Naming and Directory Interface)是一个应用程序设计的API
为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口
类似JDBC都是构建在抽象层上。
现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。
6.2 Tomcat中配置JNDI 数据源
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源。这种配置就是JDNI
Tomcat 内置了数据源就是:(DBCP),所以数据源只需要配置服务器即可。
使用步骤:
Step1:拷贝数据库连接驱动的jar到tomcat的lib目录下(注意驱动版本)
Step2:配置数据源XML文件(在当前应用的META-INF中创建context.xml, 编写数据源)
注:多个数据源的配置(声明多个Resource即可)
<?xml version="1.0" encoding="UTF-8"?>
<Context><Resource name="jdbc/day12DB"auth="Container"type="javax.sql.DataSource"username="root"password="123456"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/day12"maxTotal="8"maxIdle="4"/>
</Context>
Step3:使用连接池
练习题
1.登录注册注销案例
重点掌握:
- MVC的开发模式
- 一般的开发顺序是:dao-daoImpl-service-serviceImpl-servlet-jsp,他们之间是通过model传递数据的
- 登录表单验证:
public class UserForm {private String username;private String password;private String repassword;private String email;private String birthday;Map<String, String> err = new HashMap<String,String>();//正则校验/*** username : 用户名长度要在5~15* password : 密码不能为空,6~9位* repassword:和password要一样* email : 邮箱的格式不正确* birthday :日期为yyyy-MM-dd的格式*/public boolean validate() {if (username == null || username.trim().length() == 0) {err.put("username", "用户名不能为空");}if (!username.matches("\\w{5,15}")) {err.put("username", "用户名长度要在5~15位");}if (password == null || password.trim().length() == 0) {err.put("password", "密码不能为空");}if (!password.matches("\\w{6,9}")) {err.put("password", "密码长度要在6~9位");}if (repassword == null || password.trim().length() == 0) {err.put("password", "密码不能为空");}if (!repassword.equals(password)) {err.put("repassword", "密码前后不一致");}if (email == null || email.trim().length() == 0) {err.put("email", "邮箱不能为空");}if (!email.matches("^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")) {//百度里搜的 邮箱的正则表达式 javaerr.put("email", "邮箱的格式不正确");}//日期的校验SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {sdf.parse(birthday);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();err.put("birthday", "日期的格式应为:2020-02-02");}return err.size()==0;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRepassword() {return repassword;}public void setRepassword(String repassword) {this.repassword = repassword;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public Map<String, String> getErr() {return err;}public void setErr(Map<String, String> err) {this.err = err;}}
面试题
1.事务的4大特性
原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
连接池原理:
**目的:**解决建立数据库连接耗费资源和时间很多的问题,提高性能。
总结
通过一天的学习,熟悉了MVC的设计模式,通过分层思想,体会到了接口开发的优势,另外通过登录注册的小案例,知道了数据在前后端交互的规律,本质是封装的model对象(即Java Bean)之间的传递。会使用登录的表单验证,主要考察的是正则表达式的使用。然后,又学了MySQL的事务,知道了事务的四大特性以及隔离级别,会在windows和jdbc里面操作事务,使用事务:事务开启、回滚、提交。数据库连接池的出现,解决了建立数据库连接耗费资源和时间很多的问题,提高了性能,常用的数据库连接池有DBCP和C3P0,tomcat内置的数据源也可以用(本质是:dbcp)。万丈高楼平地起,不要怀疑自己的努力,加油!