JDBC
JDBC基本概念
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商去实现这个接口,提供数据库驱动的jar包。我们可以使用这套接口(JDBC)变成,真正执行的是驱动jar包中的实现类。
快速入门
步骤:
1.将驱动jar包导入到工程中!
复制jar包放在项目的libs目录下
右键选择添加为库(Add As Library)
2.注册驱动
Class.forName("com.mysql.jdbc.Driver");//8.0以下
Class.forName("com.mysql.cj.jdbc.Driver");//8.0
3.获取数据库的链接对象 Connection
url("jdbc:mysql://localhost:3307/db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";)
4.定义sql语句
5.获取执行sql语句的对象 Statement(不再用) PreparedStatement(防止sql注入)
6.执行sql,接受返回结果
7.处理结果
8.释放资源
需要判断是否空指针异常
bug测试
请输入账户
awfefeg
请输入密码
a' or 'a = 'a
详解各个对象
DriverManager:驱动管理
功能:
1.注册驱动
2.获取数据库连接
Connection:数据库链接
1.获取执行sql的对象
2.管理事务
PreparedStatement:执行sql
Resultset:结果集
执行DDL语句时 并没有返回结果
ResultSet
next() //光标从当前位置向下移动一行;
getXXX(参数)//获取数据
XXX:代表数据类型 例:getINt() getString()
参数:
1.Int 代表列的编号,从1开始 例:getString(1) //获取第一列的
2.String 代表列的名称 例:getString("name") //获取name列
JDBC工具类
JDBCUtils
目的:简化书写
分析:
1.注册驱动抽取
2.抽取一个方法获取连接对象
需求:不想传递参数,还低保证工具的通用性
解决:通过配置文件解决问题
3.抽取一个方法释放资源
实现
package util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* @author XuHu
* @version 1.0
* @date 2020/9/23 13:32
* JDBC工具类
*/
public class JDBCUtils {
// 定义静态变量,使用静态代码获取配置文件的值
private static String url;
private static String user;
private static String password;
private static String driver;
// 使用静态代码注册驱动并给静态变量赋值
static {
try {
// 创建Properties集合类
Properties properties = new Properties();
// 获取src路径下文件,使用ClassLoader类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
// URL定位文件的绝对地址
URL res = classLoader.getResource("jdbc.properties");
// 获取字符串路径
String path = res.getPath();
// 读取文件
properties.load(new FileReader(path));
// 静态变量赋值
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
// 注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取链接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* @author XuHu
* @Description 释放资源
* @param conn Connection 数据库连接对象
* @param pre PreparedStatement 执行sql操作
*/
public static void close(Connection conn, PreparedStatement pre) {
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (pre != null) {
try {
pre.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* @author XuHu
* @Description 释放资源 Res 版
* @param conn Connection 数据库连接对象
* @param pre PreparedStatement 执行sql操作
* @param res ResultSet 结果集对象
*/
public static void close(Connection conn, PreparedStatement pre, ResultSet res) {
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (pre != null) {
try {
pre.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (res != null) {
try {
res.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
JDBC控制事务
事务:一个包含多个步骤的业务操作,如果这个业务操作背事务管理,则这多个步骤要么同时成功们要么同时失败。
操作:
1.开启事务
2.提交事务
3.回滚事务
使用Connection对象来管理事务
开启事务: setAutoCommit (boolean autoCommit) : 调用该方法设置参数为false,即开启事务
在执行sgl之前开启事务
提交事务: commit()
当所有sql都执行完提交事务
回滚事务: rollback()
在catch中回滚事务
数据库连接池
概念
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化后,容器就会被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
好处:
节约资源
用户访问高效
实现:
标准接口:DaraSource javax.sql包下
方法:
获取连接:getConnection()
归还连接:Connection.close() //如果连接对象Connection是从连接池获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接
2.一般我们不去实现它,有数据库厂商来实现
C3P0 :数据库连接池技术
Druid :数据库连接池实现技术(德鲁伊 阿里提供)
C3P0:数据库连接技术
步骤
1.导入jar包(两个) c3p0.jar mchange-commons-java.jar
不要忘记导入数据库驱动jar包
2.定义配议文件:
*名称: c3pθ. properties 或者c3p0-config.xml
路径:直接将文件放在src目录下即可。
3.创建核心对象数据库连接池对象ComboPool edDataSource
4.获取连接: getConnection
Druid:数据库连接技术
步骤
Tomcat
目录结构
配置
*部署项目的方式:
1.直接将项目放到webapps目录下即可。
/hello :项目的访问路径-- >虚拟目录
简化部署:将项目打成一 个war包, 再将war包放置到webapps目录下。
war包会自动解压缩
2.配置conf/server.xml文件
在<Host>标签体中配置
<Context docBase="D:\hello" path=" /hehe" />
docBase:项目存放的路径 path :虚拟目录
3。 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
<Context docBase="D: \hello" />
虚拟目录: xml文件的名称
静态项目和动态项目
*目录结构:
java动态项目:
项目名称-- WEB- INF
web.xml :该项目的核心配置文件
classes目录:放置字节码文件
lib目录:放置项目依赖的jar包
Servlet
概念
运行在服务器端的小程序
servlet就是一个接口,定义了java类被浏览器所识别的接口
将来我们自定义一个类,实现servlet接口,复写方法
快速入门
1.创建javaEE的项目
2.定义一个类,实现Servlet的实现类
public class SevrletDemo1 implements Servlet
3.实现接口中的抽象类
4.配置Servlet
在web.xml中写
<!-- 配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.web.serlet.SevrletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
1.当服务器接收到客户端浏览器的请求后,会解析请求的url路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的<url-patterb>标签体内容
3.如果有,则会找到对应的<servlet-class>全类名
4.tomcat会将字节码文件加载进内存,并且创建其对象。
5调用其方法。
Servlet 方法
/**
* @author XuHu
* @date 2020/9/24 15:38
* @version 1.0
*/
public class ServletDemo2 implements Servlet {
/**
* 初始化方法
* 在Servlet被创建时执行,执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet Start");
}
/**
* 获取ServletConfig对象
* ServletConfig:Servlet配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务方法
* 每一次Servlet被访问时执行,可执行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello,Servlet");
}
/**
* 获取Servlet一些信息,版本,作者等等
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在服务器关闭时执行,执行一次
*/
@Override
public void destroy() {
System.out.println("Servlet End");
}
}
Servlet 生命周期
1.被创建:执行init方法,只执行一次
Servlet什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配道执行Servlet的创建时机。
在<servlet>标签下配
1.第一次被访问时,创建
<load-on- startup>的值为负数
2.在服务器启动时,创建
<load-on-startup>的值为0或正整数
Servlet的init方法, 只执行- -次, 说明一个Servlet在内存中只存在一个对象, Servlet是 单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
2.提供服务:执行service方法,执行多次
每次访问Servlet时, Service方法都会被调用一次。
3。被销毁:执行destrov方法,只执行一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
只有服务器正常关闭时,才会执行destroy方法。
destroy方法在Servlet被销毁之前执行,一般用于释放资源
Servlet 3.0
好处:
支持注解配置,可以不使用web.xml
步骤
1.创建javaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2.定义一个类实现Servlet接口
3.复写方法
4.在类上使用@WebServlet注解,进行配置
可以:@WebServlet(urlPatterns = "/demo")
也可以:@WebServlet("/demo") value的特性 只有value时 只写值就行
IDEA 与 tomcat的相关配置
IDEA会为每一个tomcat部署的项目单独建立一份配置文件
工作空间项目和tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目 ”,“tomcat部署的web项目 ”对应着“工作空间项目”web项目下的所有资源
WEB-INF下的资源不能被浏览器直接访问。
断点调试:需要点击调试按钮启动
谢谢分享,日常打卡~ 滴滴~
文章写的不错,加油~