同一套Java代码API,操作不同的关系型数据库
(Java DataBase Connectivity)Java数据库连接
本质:
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码驱动jar包中的实现类
优点:
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
1.准备:入门案例数据
#创建数据库 create database if not exists db3; #切换数据库 use db3; -- 删除user表 drop table if exists user; -- 创建user表 create table user( id int primary key auto_increment, username varchar(20), password varchar(32) ); -- 添加数据 insert into user values(1,'zhangsan','123'),(2,'lisi','234'); -- 删除account表 drop table if exists account; -- 创建账户表 create table account( id int primary key auto_increment, name varchar(10), money double(10,2) ); -- 添加数据 insert into account(name,money) values('张三',1000),('李四',1000); select * from account;2.导入驱动包
创建lib目录,存放mysql的驱动mysql-connector-java-5.1.37-bin.jar
选中mysql的jar包,右键选择“ Add as Library...” 完成jar导入
3.代码:入门案例实现
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; /* JDBC入门案例 */ public class Demo01Jdbc { public static void main(String[] args) throws Exception { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //连接数据库的地址 String url = "jdbc:mysql://localhost:3306/db3"; //连接数据库的用户名 String username = "root"; //连接数据库的密码 String password = "root"; //2.获取连接(java连接mysql数据库,产生一个连接对象con) Connection con = DriverManager.getConnection(url, username, password); //3.定义sql语句 String sql = "update account set money = money+1000 where id = 1"; //4.获取执行sql语句的对象 Statement stmt = con.createStatement(); //5.执行sql语句(把sql发送给mysql服务器) int result = stmt.executeUpdate(sql); //6.处理结果 if (result > 0) { System.out.println("修改成功"); } else { System.out.println("修改失败"); } //7.关闭释放资源 stmt.close(); con.close(); } }
DriverManager驱动管理类
1.创建对象
内部有静态代码块创建驱动类对象,但是我们一般使用反射获得驱动类对象
JDK5以后可以省略驱动对象创建:
驱动包mysql-connector下META-INF→serviices→java.sql.Driver
2.数据库连接
语法:
jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
jdbc:mysql://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对&参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
jdbc:mysql:///db1?useSSL=false
Connection数据库连接对象
1.获取执行对象执行SQL语句
①Statement对象 普通执行SQL对象
Statement createStatement()
int executeUpdate(sql): 执行DML,DDL语句 增删改
返回值:
DML语句影响的行数
DDL语句执行后,执行成功也可能返回0
ResultSet结果集对象
ResultSet executeQuery(sql): 执行DQL语句 查询
返回值:ResultSet
boolean next() * 将光标从当前位置向前移动一行 * 判断当前行是否为有效行 > 方法返回值说明: * true : 有效航,当前行有数据 * false : 无效行,当前行没有数据 xxx getXxx(参数):获取数据 xxx : 数据类型 int getInt(参数) String getString(参数) > 参数 * int类型的参数:列的编号,从1开始 * String类型的参数: 列的名称
②PreparedStatement对象 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
恒成立条件:String pwd = "' or '1' = '1";,攻击服务器的方法
内部并接参数时对特殊字符进行转义
会预编译SQL,性能高
my.ini添加以下代码: log-output=FILE general-log=1 general_log_file="D:\mysql.log" slow-query-log=1 slow_query_log_file="D:\mysql_slow.log" long_query_time=2 重新启动MySQL数据库 url参数添加: useServerPrepStmts=true
2.事务
开启事务:conn.setAutoCommit(false);
提交事务:conn.commit();
回滚事务:conn.rollback();
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
优点:
资源重用
提升系统响应速度
避免数据库连接遗漏
第三方数据库连接池:实现DataSource
Driud使用
导入jar包 druid-1.1.12.jar
定义配置文件
加载配置文件
获取数据库连接池对象
获取连接