前言
本文主要介绍了java面向JDBC编程的根本知识和用到的接口和方法。
一、简介(面向接口编程)
JDBC概念:
JDBC就是使用Java语言操纵关系型数据库的一套API
JDBC(Java Database Connectivity)全称为Java数据库毗连。
JABC是一套毗连数据库的标准接口,Java可以通过JDBC编程实现操纵差别的数据库。
差别的数据库想要被Java代码操纵,都要定义本身对于JDBC的实现类,也就是数据库驱动。
JDBC本质:
官方(sun公司)定义的一套所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正实行的代码是驱动jar包中的实现类。
JDBC利益
各数据库厂商使用相同的接口,Java代码不需要针对差别数据库分别开发
可随时替换底层数据库,访问数据库的Java代码根本稳固。
这种方式也叫面向接口编程。
二、JDBC操纵步骤
2.1创建工程,导入驱动jar包
1.创建好工程后,右击工程名,点击New->Directory,创建一个lib目录
2.复制粘贴mysql驱动jar包到这个目录下
3.右击驱动jar包,点击Add as Library->Mudule Library->OK.导入成功
2.2JDBC代码快速实现
- package com.practice;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.Statement;
- /**
- * @Author YJ
- * @Date 2023/7/19 10:06
- * Description:JDBC编程
- */
- public class JDBCDemo {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1";
- String username = "root";
- String passWord = "123456";
- //DriverManager.getConnection有一个返回值
- Connection coon = DriverManager.getConnection(url, username, passWord);
- //3.定义sql语句
- String sql = "update emp set salary = 10000 where name='张三'";
- //4.获取执行sql的对象Statement
- Statement statement = coon.createStatement();
- //5.执行sql
- //返回影响的行数
- int count = statement.executeUpdate(sql);
- //6.处理结果
- System.out.println(count);
- //7.释放资源
- //倒着释放,先创建的后释放
- statement.close();
- coon.close();
- }
- }
复制代码 上面的代码实行的sql语句是修改demo1数据库中的表emp中的内容,update emp set salary = 10000 where name='张三'表示将emp表中的姓名为张三的salary改为10000。
如下表示运行成功:
java运行结果
mysql表中原数据
代码实行后
三、JDBC的API详解
3.1DriverManager
DriverManager(驱动管理类):
1.注册驱动
2.获取数据库毗连
1.注册驱动
在注册驱动时我们用到的是Class.forName("com.mysql.jdbc.Driver");而这段代码底层也是调用的DriverManager.registerDriver(),在mysql5之后的驱动jar包下,这段代码可以省略,这是因为在mysql驱动jar包目录下有一个META.INF文件夹,其中有一个services目录,里面有个文件java.sql.Driver,里面就记录了驱动的类的名称。
2.获取毗连
getConnection(String url, String user, String password)
1.url:毗连路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2..
如果毗连的是本机mysql服务器,并且Mysql服务默认端口号是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对1&参数键值对2..
设置useSSL=false参数,禁用安全毗连方式,解决警告提示
2.user:用户名
3.password:暗码
3.2Connection
Connection(数据库毗连对象):
1.获取实行sql的对象
2.管理事务
获取实行sql的对象
平凡实行SQL对象
Statement createStatement()
**2.事务管理
MYSQL事务管理:
开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MYSQL默认主动提交事务
JDBC事务管理:
通过Connection接口进行管理
开启事务:setAutoCommit(boolean autoCommit):true主动提交,false手动提交;
提交事务:commit()
回滚事务:rollback()
事务管理代码演示
- package com.practice;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.sql.Statement;
- /**
- * @Author YJ
- * @Date 2023/7/19 10:36
- * Description:JDBC编程--Connection
- */
- public class JDBCDemoConnection {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- //DriverManager.getConnection有一个返回值
- Connection coon = DriverManager.getConnection(url, username, passWord);
- //3.定义sql语句
- String sql1 = "update emp set salary = 300 where name='张三'";
- String sql2 = "update emp set salary = 600 where name='李四'";
- //4.获取执行sql的对象Statement
- Statement statement = coon.createStatement();
- try {
- //开启事务
- coon.setAutoCommit(false);
- //5.执行sql
- //返回影响的行数
- int count1 = statement.executeUpdate(sql1);
- //5.执行sql
- //返回影响的行数
- int count2 = statement.executeUpdate(sql2);
- //6.处理结果
- System.out.println(count2);
- //提交事务
- coon.commit();
- } catch (Exception throwables) {
- //回滚事务
- coon.rollback();
- throwables.printStackTrace();
- }
- //7.释放资源
- //倒着释放,先创建的后释放
- statement.close();
- coon.close();
- }
- }
复制代码 结果
要注意的是:在进行事务回滚操纵时,Java用的是异常处理机制。
3.3Statement
Statement作用:
实行sql语句
int executeUpdate(sql):实行DML、DDL语句
返回值:(1)DML语句影响的行数(2)DDL语句实行成功也可能返回0
ResultSet executeQuery(sql):实行DQL语句
返回值:ResultSet 结果集对象
- package com.practice;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.Statement;
- /**
- * @Author YJ
- * @Date 2023/7/20 8:15
- * Description:DML
- */
- public class JDBCDemo2 {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- //DriverManager.getConnection有一个返回值
- Connection coon = DriverManager.getConnection(url, username, passWord);
- //3.定义sql语句
- String sql = "update emp set salary = 300 where name='张三'";
- //4.获取执行sql的对象Statement
- Statement statement = coon.createStatement();
- //5.执行sql
- //返回影响的行数
- int count = statement.executeUpdate(sql);
- //6.处理结果
- if(count > 0) {
- System.out.println("修改成功~");
- } else {
- System.out.println("修改失败~");
- }
- //7.释放资源
- //倒着释放,先创建的后释放
- statement.close();
- coon.close();
- }
- }
复制代码 3.4ResultSet
ResultSet(结果集对象)作用:
封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):实行DQL语句,返回ResultSet对象
获取查询结果
boolean next():
(1)将光标从当前位置向前移动一行
(2)判定当前行是否为有用行
返回值:
true:有用行,当前行有数据
false:无效行,当前行无数据
xxx getXxx(参数):获取数据
xxx:数据类型;如int getInt(参数)
参数:
int :列的编号,从1开始
String:列的名称
- package com.practice;
- import java.math.BigDecimal;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- /**
- * @Author YJ
- * @Date 2023/7/20 8:15
- * Description:ResultSet 执行DQL语句
- */
- public class JDBCDemo5 {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- //DriverManager.getConnection有一个返回值
- Connection coon = DriverManager.getConnection(url, username, passWord);
- //3.定义sql
- String sql = "select * from emp";
- //4.获取Statement对象
- Statement stmt = coon.createStatement();
- //5.执行sql
- ResultSet resultSet = stmt.executeQuery(sql);
- //6.处理结果
- //6.1光标向下移动,判断是否有数据
- while (resultSet.next()) {
- //6.2获取数据
- String name = resultSet.getString(1);
- String sex = resultSet.getString(2);
- String depart = resultSet.getString(3);
- BigDecimal salary = resultSet.getBigDecimal(4);
- System.out.println(name);
- System.out.println(sex);
- System.out.println(depart);
- System.out.println(salary);
- System.out.println("-----------------------");
- }
- //也可在getXxx(参数)参数位置写sql中的字段名
- /*while (resultSet.next()) {
- //6.2获取数据
- String name = resultSet.getString("name");
- String sex = resultSet.getString("sex");
- String depart = resultSet.getString("depart");
- BigDecimal salary = resultSet.getBigDecimal("salary");
- System.out.println(name);
- System.out.println(sex);
- System.out.println(depart);
- System.out.println(salary);
- System.out.println("-----------------------");
- }*/
- //7.释放资源
- resultSet.close();
- stmt.close();
- coon.close();
- }
- }
复制代码 通过获取数据库的数据封装到一个聚会合
1.创建一个类,与数据库数据类型相对应,创建一个该类的聚集
2.获取数据库数据
3.将获取的数据封装到类中
4.将封装好的类添加到聚集
- package com.practice.pojo;
- import java.math.BigDecimal;
- /**
- * @Author YJ
- * @Date 2023/7/20 10:27
- * Description:封装数据库数据的类
- */
- public class Account {
- private String name;
- private String sex;
- private String depart;
- private BigDecimal salary;
- public Account() {
- }
- public Account(String name, String sex, String depart, BigDecimal salary) {
- this.name = name;
- this.sex = sex;
- this.depart = depart;
- this.salary = salary;
- }
- /**
- * 获取
- * @return name
- */
- public String getName() {
- return name;
- }
- /**
- * 设置
- * @param name
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * 获取
- * @return sex
- */
- public String getSex() {
- return sex;
- }
- /**
- * 设置
- * @param sex
- */
- public void setSex(String sex) {
- this.sex = sex;
- }
- /**
- * 获取
- * @return depart
- */
- public String getDepart() {
- return depart;
- }
- /**
- * 设置
- * @param depart
- */
- public void setDepart(String depart) {
- this.depart = depart;
- }
- /**
- * 获取
- * @return salary
- */
- public BigDecimal getSalary() {
- return salary;
- }
- /**
- * 设置
- * @param salary
- */
- public void setSalary(BigDecimal salary) {
- this.salary = salary;
- }
- public String toString() {
- return "Account{name = " + name + ", sex = " + sex + ", depart = " + depart + ", salary = " + salary + "}";
- }
- }
复制代码- package com.practice;
- import com.practice.pojo.Account;
- import java.math.BigDecimal;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import java.util.ArrayList;
- /**
- * @Author YJ
- * @Date 2023/7/20 10:26
- * Description:ResultSet 封装到一个集合中
- */
- public class JDBCDemo7 {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- //DriverManager.getConnection有一个返回值
- Connection coon = DriverManager.getConnection(url, username, passWord);
- //3.定义sql
- String sql = "select * from emp";
- //4.获取Statement对象
- Statement stmt = coon.createStatement();
- //5.执行sql
- ResultSet resultSet = stmt.executeQuery(sql);
- //创建集合
- ArrayList<Account> list = new ArrayList<>();
- //6.处理结果
- //6.1光标向下移动,判断是否有数据
- while (resultSet.next()) {
- Account account = new Account();
- //6.2获取数据
- String name = resultSet.getString("name");
- String sex = resultSet.getString("sex");
- String depart = resultSet.getString("depart");
- BigDecimal salary = resultSet.getBigDecimal("salary");
- //赋值
- account.setName(name);
- account.setSex(sex);
- account.setDepart(depart);
- account.setSalary(salary);
- //存入集合
- list.add(account);
- }
- System.out.println(list);
- //7.释放资源
- resultSet.close();
- stmt.close();
- coon.close();
- }
- }
复制代码 3.5PreparedStatement
PreparedStatement作用:
1.预编译SQL语句并实行:防备SQL注入问题
SQL注入:是通过操纵输入来修改事先定义好的SQL语句,用以达到实行代码对服务器进行攻击的方法。
SQL注入演示:
- package com.practice;
- import com.practice.pojo.Account;
- import java.math.BigDecimal;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import java.util.ArrayList;
- /**
- * @Author YJ
- * @Date 2023/7/20 10:26
- * Description:ResultSet SQL注入演示
- */
- public class JDBCDemo8 {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- Connection coon = DriverManager.getConnection(url, username, passWord);
- String name = "afafafaf";
- String depart = "' or '1' = '1";
- String sql = "select * from emp where name = '"+name+"' and depart = '"+depart+"' ";
- //获取stmt对象
- Statement stmt = coon.createStatement();
- //执行sql
- ResultSet resultSet = stmt.executeQuery(sql);
- //判断登录是否成功
- if (resultSet.next()) {
- System.out.println("有数据~");
- } else {
- System.out.println("无数据!");
- }
- //7.释放资源
- resultSet.close();
- stmt.close();
- coon.close();
- }
- }
复制代码
1.预编译SQL并实行SQL语句
(1)获取PreparedStatement对象
//SQL语句中的参数使用?占位符替换
String sql = "select * from student where name = ? and age = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = coon.preparedStatement(sql);
(2)设置参数值
PreparedStatement 对象:setXxx(参数一,参数二):给?赋值
(3)实行sql
exxcuteUpdate():/executeQuery();:不需要在通报sql
- package com.practice;
- import java.sql.*;
- /**
- * @Author YJ
- * @Date 2023/7/20 10:26
- * Description:ResultSet 解决SQL注入
- */
- public class JDBCDemo9 {
- public static void main(String[] args) throws Exception {
- //1.注册驱动
- //Class.forName("com.mysql.jdbc.Driver");
- //2.获取连接
- //用户名和密码就是mysql注册时自己的用户名和密码
- //demo1表示要连接的数据库名
- String url = "jdbc:mysql://127.0.0.1:3306/demo1?useSSL=false";
- String username = "root";
- String passWord = "123456";
- Connection coon = DriverManager.getConnection(url, username, passWord);
- String name = "afafafaf";
- String depart = "' or '1' = '1";
- //定义sql
- String sql = "select * from emp where name = ? and depart = ? ";
- //获取对象
- PreparedStatement prept = coon.prepareStatement(sql);
- //设置?的值
- prept.setString(1,username);
- prept.setString(2,depart);
- //执行sql
- ResultSet resultSet = prept.executeQuery();
- //判断登录是否成功
- if (resultSet.next()) {
- System.out.println("有数据~");
- } else {
- System.out.println("无数据!");
- }
- //7.释放资源
- resultSet.close();
- prept.close();
- coon.close();
- }
- }
复制代码
3.6PreparedStatement原理
PreparedStatement利益:
1.预编译SQL,性能更高
2.防备SQL注入:将敏感字符进行转义
预编译功能开启:useServerPrepStmts=true
同时还要在mysql安装目录下的my.ini文件中设置一串代码:
- log-output=FILE
- general-log=1
- general_log_file="D:\MyApp\mysql.log"
- slow-query-log=1
- slow_query_log_file="D:\MyApp\mysql_slow.log"
- long_query_time=2
复制代码 PreparedStatement原理:
1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查、编译(很耗时)
2.实行时就不用在进行这些步骤了,速率很快
3.如果sql模板一样,则只需进行一次检查、编译
当预编译功能开启后,每次实行代码,都会在日志文件中记录。
四、数据库毗连池
4.1简介
数据库毗连池是个容器,负责分配、管理数据库毗连(Connection)
它答应应用程序重复使用一个现有的数据库毗连,而不是重新建立一个
释放空间时间超过最大空闲时间的数据库毗连来制止因为没有释放数据库毗连而引起的数据库毗连遗漏
利益:
资源重用
提升系统响应速率
制止数据库毗连遗漏
4.2数据库毗连池的实现
标准接口:DataSource
官方提供的数据库毗连池标准接口,由第三方组织实现此接口。
功能:获取毗连
Connection getConnection()
常见的数据库毗连池
DBCP
C3P0
Druid
Druid(德鲁伊)
是阿里巴巴开源的数据库毗连池项目
功能强大,性能良好,时Java语言最好的数据毗连池之一
1.导入druid.jar包,方法同mysql.jar包的导入
2.定义设置文件:
定义一个文件druid.properties并编写如下代码:
- driverClassName=com.mysql.jdbc.Driver
- url=jdbc:mysql///demo1useSSL=false&useServerPrepStmts=true
- username=root
- password=123456
- # 初始化连接数量
- initialSize=5
- # 最大连接数
- maxActive=10
- # 最大等待时间
- maxWait=3000
复制代码- package com.practice.druid;
- import com.alibaba.druid.pool.DruidDataSourceFactory;
- import javax.sql.DataSource;
- import java.io.FileInputStream;
- import java.sql.Connection;
- import java.util.Properties;
- /**
- * @Author YJ
- * @Date 2023/7/20 12:44
- * Description:Druid 数据库连接池演示
- */
- public class DruidDemo1 {
- public static void main(String[] args) throws Exception {
- //加载配置文件
- //获取连接池对象
- Properties prop = new Properties();
- prop.load(new FileInputStream("jdbc-7-20/src/druid.properties"));
- DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
- //获取数据库连接
- Connection coon = dataSource.getConnection();
- System.out.println(coon);
- }
- }
复制代码 总结
经过本文的学习,我们可以初步的掌握JDBC编程,来实现java与数据库的毗连和管理,通过java实现对数据库的增删改查操纵,欢迎小同伴们点赞+评论,我会持续学习更新!!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |