【JAVA-WEB】JDBC
概念:java database contaiction
用java 语言跟数据库建立连接,进行增删改查的操作。
本质:语言规范,是一套接口。
数据库驱动:数据库厂商写的实现类
步骤
- 导入对应jar 包,记得依赖add libraise
- 加载驱动:Class.forName(“com.mysql.jdbc.Driver”)
- 获取连接对象:DriverManager.getConnection(URL,用户名,用户密码)
url="jdbc:mysql://localhost:3306/mydb"
主协议:自协议://IP(数据库的IP):端口/库名
- 获取操作对象:连接对象.createStatement()
- 执行操作:操作对象.executeUpdate(SOL语句)执行DML语句
这条语句会返回一个int 表示了这条语句影响的行数,返回值>0表示操作成功
拼串的时候一定要注意引号,双引号与单引号间的嵌套。
操作对象.executeQuery(SOL语句)执行DQL语句
这条语句返回一个结果集resultSet对象,取出数据:循环
while(resultSet.next()){resultSet.getXXX("表头字段\字段序号(序号从1开始)");}
//next让指针下移一行,没有返回false
- 释放资源:对象.close();
为了后续能够使用查询出来的数据,需要将数据封装。创建一个封装类。
代码示例
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydbs", "root", "123456");
Statement statement = connection.createStatement();
// statement.executeUpdate("insert into employee values(00000,'ed','de','d0')");
connection.close();
statement.close();
}
类
DriverManage类
Statement接口
自己查文档去!!!!!
登陆验证小案例
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String username=scanner.next();
/*System.out.println("请输入密码");
String password=scanner.next();*/
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydbs", "root", "123456");
//这里的操作对象可能会发生SQL注入现象
Statement statement = connection.createStatement();
String sql="select *from employee where emp_no='"+username+"'";//这里的命令使用了拼串
ResultSet resultSet = statement.executeQuery(sql);
/* //这里使用了预编译操作对象
String sql="select *from employee where emp_no=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,username);
ResultSet resultSet = preparedStatement.executeQuery();*/
if(resultSet.next()){
System.out.println("登陆成功");
}else {
System.out.println("登陆失败");
}
connection.close();
//preparedStatement.close();
statement.close();
SQL注入
SQL注入:欺骗服务器的恶意命令
拼串引起的SQL注入
预防:
使用可以预防SQL注入的操作对象–预编译操作对象
预编译操作对象:连接对象.prepareStatement(“select * from 表名where 字段=? and 字段=?”)需要值的地方用?占位
预编译操作对象.setXXX(问号位置索引,值)
编写工具类
public class JDBCUtils {
//获取连接对象的三个参数
private static String url;
private static String username;
private static String password;
//私有化构造,遇到反射就怂了
private JDBCUtils() {
}
//静态代码块--数据写死,高耦合
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
url="jdbc:mysql:///mydb";
username="root";
password="123456";
}
//获取连接对象
private static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//释放资源
//查询语句返回一个结果集,所以需要三个参数
private static void close(Connection conn, Statement sta, ResultSet rs) throws SQLException {
//做非空判断
if(conn!=null){
conn.close();
}
if(sta!=null){
sta.close();
}
if(rs!=null){
rs.close();
}
}
//DML语句返回int只需要两个参数
private static void close(Connection conn, Statement sta) throws SQLException {
//做非空判断
if(conn!=null){
conn.close();
}
if(sta!=null){
sta.close();
}
}
}
配置文件
文件后缀名properties
把写死的数据放置在配置文件里,通过修改配置文件达到修改工具类的目的。
解耦和
事务
数据库中的事务:最小逻辑单元,组成事务的逻辑单元是不可分割的,只能同时成功或者失败
事物的四大特性ACID
-
原子性Atomicity:最小单元
-
一致性Consistency:把所有事务看成一个整体,一起改变状态
-
隔离性Isolation:多个并发事务之间要相互隔离,每个用户的事务不能相互干扰
-
持久性Durability:数据的改变是永久性的
语法格式
连接对象.setAutoCommit(false);//事务的自动提交改为手动提交
异常处理,在遇到异常时让事务回滚:连接对象.rollback(指定回滚点,没有设置就回到最初状态);
设置回滚点:连接对象.setsaveoint();
无论异常与否都需要提交事务:连接对象.commit();
批处理
addBatch();加入批处理
executeBatch();执行批处理–把数据先缓存起来,统一处理。
clearBatch();清空缓存
连接池
DBCP和C3P0的区别:
DBCP没有自动回收空闲连接的功能;
C3P0有自动回收控线连接的功能。
DBCP
DBCP(DataBaseConnectionPool)数据库连接池。
单独使用DBCP需要2个包:commons-dbcp.jar和commons-pool.jar
方式一:硬编码方式,将连接参数写在代码里
新建一个数据源new BasicDataSource();
连接驱动:资源库.setDriverClassName(“路径”);
设置参数:setXXX();
建立连接:资源库.getConnecting();
方式二:配置文件
通过工厂类创建数据源new BasicDataSourceFactory().createDataSource(properties);
方式三:配置文件-xml
标签形式的配置文件
可以有第二配置
C3P0
方式一:硬编码方式,将参数写到代码
使用的类:ComboPoolDataSource
设置驱动以及参数setXXX();
建立连接:.getConnection();
获取预编译操作对象
方式二:配置文件
两个要求:
1.配置文件的文件名必须是固定的
2.配置文件必须放在SRC下
新建对象时会自动读取配置
Druid
所属阿里
方式一:硬编码
创建对象new DruidDataSource();
设置参数;
获取连接诶对象;
获取预编译操作对象
方式二:配置文件
所有配置文件的键名都是固定的约定俗成的
创建数据源new DruidDataSourceFactory().createataSource(properties);
获取操作对象new QueryRunner(数据源对象);
使用:操作对象.update();
操作对象.query();