JavaWeb基础(1)
学习目标:
熟悉Java内部库中关于数据库、HTML之间的接口;
学习内容:
一、Web框架基础概念
1. Junit单元测试
测试分类:
黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
白盒测试:需要写代码的。关注程序具体的执行流程。
Junit使用:属于白盒测试
步骤:
- 定义一个测试类(测试用例)
测试类名:被测试的类名
包名:xxx.xxx.xx.test - 定义测试方法:可以独立运行
方法名:test测试的方法名
返回值:void
参数列表:空参 - 给方法加@Test
- 导入junit依赖环境
一般我们会使用断言操作来处理结果
Assert.assertEquals(期望的结果,运算的结果);
@Before:
修饰的方法会在测试方法之前被自动执行
@After:
修饰的方法会在测试方法执行之后自动被执行
2. 反射
框架设计的灵魂;
框架:半成品软件;可以在框架的基础上进行软件开发,简化编码;
反射:将类的各个组成部分封装为其他对象,这就是反射机制;这使得可以在程序运行过程中,操作这些对象;并且可以解耦,提高程序的可扩展性。
获取Class对象的方式:
- Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象;
多用于配置文件,将类名定义在配置文件中。读取文件,加载类; - 类名.class:通过类名的属性class获取
多用于参数的传递; - 对象.getClass():getClass()方法在Object类中定义着;
多用于对象的获取字节码的方式;
PS:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个;
Class对象功能:
- 获取成员变量们
- 获取构造方法们
- 获取成员方法们
- 获取全类名
3. 注解
概念:说明程序的;给计算机看的;
注释:用文字描述程序的;给程序员看的;
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
- 编写文档:通过代码里标识的注解生成文档;
- 代码分析:通过代码里标识的注解对代码进行分析;
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查;
JDK中预定义的一些注解
@Override :检测被该注解标注的方法是否是继承自父类(接口)的;
@Deprecated:该注解标注的内容,表示已过时;
@SuppressWarnings:压制警告;一般传递参数all @SuppressWarnings(“all”)
在程序使用(解析)注解:获取注解中定义的属性值;
//其实就是在内存中生成了一个该注解接口的子类实现对象
public class ProImpl implements Pro{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
二、JDBC
1.基本概念
概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库;
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速搭建
步骤:
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar;复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下;
- 注册驱动;
- 获取数据库连接对象 Connection;
- 定义sql;
- 获取执行sql语句的对象 Statement;
- 执行sql,接受返回结果;
- 处理结果;
- 释放资源;
//1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
3.各个接口和类详解
DriverManager:驱动管理对象
功能:
- 注册驱动:告诉程序该使用哪一个数据库驱动jar static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager ;
com.mysql.jdbc.Driver类中存在静态代码块
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
- 获取数据库连接:
方法:
static Connection getConnection(String url, String user, String password)
参数:
url:指定连接的路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称;
例子:jdbc:mysql://localhost:3306/db3
Connection:数据库连接对象
功能:
- 获取执行sql 的对象
Statement createStatement();
PreparedStatement prepareStatement(String sql);
- 管理事务
//开启事务
setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务;
//提交事务
commit();
//回滚事务
rollback();
Statement:执行sql的对象
执行sql:
//可以执行任意的sql
boolean execute(String sql);
//执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
int executeUpdate(String sql);
//执行DQL(select)语句
ResultSet executeQuery(String sql);
案例:
Statement stmt = null;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String sql = "insert into account values(null,'王五',3000)";
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);//影响的行数
System.out.println(count);
if(count > 0){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) { e.printStackTrace();
}finally {
//stmt.close();
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ResultSet:结果集对象,封装查询结果
boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true;
getXxx(参数):获取数据;
使用步骤:
- 游标向下移动一行
- 判断是否有数据
- 获取数据
PreparedStatement:执行sql的对象
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接;会造成安全性问题;
解决sql注入问题:使用PreparedStatement对象来解决;
预编译的SQL:参数使用?作为占位符;
步骤:
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象
PreparedStatement Connection.prepareStatement(String sql)
- 给?赋值
- 执行sql,接受返回结果,不需要传递sql语句
- 处理结果;释放资源
JDBC控制事务:
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
操作:开启事务;提交事务;回滚事务。
使用Connection对象来管理事务:
//调用该方法设置参数为false,即开启事务
setAutoCommit(boolean autoCommit);
commit();
rollback();
三、数据库连接池
1.连接池概念
概念:其实就是一个容器(集合),存放数据库连接的容器;当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
好处:节约资源;用户访问高效。
实现:
标准接口:DataSource javax.sql包下的
//获取连接:
getConnection();
//归还连接:
Connection.close();
2.数据库连接池技术
C3P0:
步骤:
- 导入jar包 c3p0-0.9.5.2.jar ;mchange-commons-java-0.2.12.jar
- 定义配置文件
- 创建核心对象
DataSource ds = new ComboPooledDataSource();
- 获取连接:
Connection conn = ds.getConnection();
Druid:
步骤:
- 导入jar包 druid-1.0.9.jar
- 定义配置文件
- 加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
- 获取数据库连接池对象:通过工厂来来获取
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
- 获取连接
Connection conn = ds.getConnection();
3.Spring JDBC
Spring框架对JDBC的简单封装;提供了一个JDBCTemplate对象简化JDBC的开发。
步骤:
- 导入jar包;
- 创建JdbcTemplate对象;
- 调用JdbcTemplate的方法来完成CRUD的操作;
//执行DML语句。增、删、改语句
update();
//查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合;这个方法查询的结果集长度只能是1
queryForMap();
//查询结果将结果集封装为list集合;将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
queryForList();
//查询结果,将结果封装为JavaBean对象;query的参数:RowMapper
query();
//查询结果,将结果封装为对象;一般用于聚合函数的查询
queryForObject();