案例1-通过jdbc完成单表的curd操作:
CURD即创建(create),更新(update),读取(retrieve),删除(delete)
需求:
对分类表完成操作.
技术分析:
jdbc
///////////////////////
jdbc:
java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)
驱动:jdbc的实现类.由数据库厂商提供.
我们就可以通过一套规范操作不同的数据库了(多态)
jdbc作用:
连接数据库
发送sql语句
处理结果
jdbc操作步骤:★
1.数据库和表
2.创建一个项目
3.导入驱动jar包
4.编码:
注册驱动
获取连接
编写sql
创建预编译的语句执行者
设置参数
执行sql
处理结果
释放资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
class DBConnection {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
//localhost指本机,也可以用本地ip地址代替,3306为MySQL数据库的默认端口号,“user”为要连接的数据库名
String url = "jdbc:mysql://localhost:3306/user";
//填入数据库的用户名跟密码
String username = "test";
String password = "test";
String sql = "select * from user";//编写要执行的sql语句,此处为从user表中查询所有用户的信息
try {
Class.forName(driver);//加载驱动程序,此处运用隐式注册驱动程序的方法
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection con = DriverManager.getConnection(url, username, password);//创建连接对象
Statement st = con.createStatement();//创建sql执行对象
ResultSet rs = st.executeQuery(sql);//执行sql语句并返回结果集
while (rs.next())//对结果集进行遍历输出
{
System.out.println("username: " + rs.getString(1));//通过列的标号来获得数据
System.out.println("useradd: " + rs.getString("useradd"));//通过列名来获得数据
System.out.println("userage: " + rs.getInt("userage"));
}
//关闭相关的对象 从最外层 开始关闭
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
初始化数据库和表:
CREATE DATABASE day07;
USE day07;
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
insert into category values('c001','电器');
insert into category values('c002','服饰');
insert into category values('c003','化妆品');
insert into category values('c004','书籍');
IDE(集成开发环境)打开之后
1.修改字符集 utf-8
2.新建 java项目
3.使用的jdk为自己的jdk 不用使用内置
使用junit单元测试
要求:
1.方法是public void xxx(){}
2.在方法上添加 @Test
3.在@Test 按下 ctrl+1(快速锁定错误)
4.在方法上右键 run as -->junit 就可以执行方法了
jdbc-api详解:
所有的包 都是 java.sql 或者 javax.sql
DriverManager:管理了一组jdbc的操作 类
常用方法:
了解:注册驱动
static void registerDriver(Driver driver) :
通过查看 com.mysql.jdbc.Driver的源码 有如下代码
static {
try {
java.sql.DriverManager.registerDriver(new Driver());//这段代码我们已经写过
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
驱动注册了两次.我们只需要将静态代码块执行一次,类被加载到内存中会执行静态代码块,并且只执行一次.
现在只需要将类加载到内存中即可:
方式1:
★Class.forName("全限定名");//包名+类名 com.mysql.jdbc.Driver
方式2:
类名.class;
方式3:
对象.getClass();
掌握:获取连接
static Connection getConnection(String url, String user, String password)
参数1:告诉我们连接什么类型的数据库及连接那个数据库
协议:数据库类型:子协议 参数
mysql: jdbc:mysql://localhost:3306/数据库名称
oracle: jdbc:oracle:thin@localhost:1521@实例
参数2:账户名 root
参数3:密码
(了解)Driver:java.sql 接口 驱动
Connection:连接 接口
常用方法:
获取语句执行者:
(了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入攻击问题
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者(可以防止sql注入攻击)
(了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者
了解:
setAutoCommit(false) :手动开启事务
commit():提交事务
rollback():事务回滚
Statement:语句执行者 接口
PreparedStatement:预编译语句执行者 接口
常用方法:
设置参数:
setXxx(int 第几个问号,Object 实际参数);
常见的方法:
setInt
setString
setObject
执行sql:
ResultSet executeQuery() :执行 r 语句 返回值:结果集
int executeUpdate() :执行cud 语句 返回值:影响的行数
ResultSet:结果集 接口
执行查询语句之后返回的结果
常用方法:
boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false
光标一开始处于第一条记录的上面
获取具体内容
getXxx(int|string)
若参数为int :第几列
若参数为string:列名(字段名)
例如:
获取cname的内容可以通过
getString(2)
getString("cname")
常用方法:
getInt
getString 也可以获取int值
getObject 可以获取任意
///////////////////////
常见的配置文件格式:
1.properties
里面内容的格式 key=value
2.xml
/////////////////
若我们的配置文件为properties,并且放在src目录下.
我们可以通过 ResourceBundle工具快速获取里面的配置信息
使用步骤:
1.获取ResourceBundle 对象:
static ResourceBundle getBundle("文件名称不带后缀名")
2.通过ResourceBundle 对象获取配置信息
String getString(String key) :通过执行key获取指定的value
////////////////////
案例2-通过连接池(数据源)优化我们的操作.
需求:
用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.
技术分析:
连接池
////////////////////
连接池概述:
管理数据库的连接,
作用:
提高项目的性能.
就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
所有的连接池必须实现一个接口 javax.sql.DataSource接口
获取连接方法:
Connection getConnection()
归还连接的方法就是以前的释放资源的方法.调用connection.close();
自定义一个连接池(理解思想)