IDEA使用JDBC导入配置jar包连接MySQL数据库
敲代码の流川枫 人气:0jdbc编程简介
JDBC,Java Database Connectivity ,java数据库连接.是一种执行SQL语句的API,是java中数据库连接规范,这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问
1.导入jar包
jar包下载地址:
1.输入地址->输入mysql搜素
2.点击第一个后选择版本
3.选择版本和本机mysql大版本相同的 jar包
4.点击下载jar包
5.创建lib包,导入jar包,直接cv
6.右击lib->点击Add as Library
此时就解析出了jar包中的内容,我们就可以进行对数据库据的编程了
2.建立数据库连接
和数据库建立连接时,需要用到数据库,首先创建一个数据库和一张表然后进行数据库连接
mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
jdbc编程时用到的资源,必须要导入jar包才能用
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.*;
2.1创建数据源描述数据库服务器在哪
使用 DataSource 描述 MySQL 服务器的位置.
DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl ("jdbc:mysql://127.0.0.1:3306/java_2?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("123456");
url是唯一地址定位符,就是网址
127.0.0.1:数据库服务器所在的IP地址,这是个特殊的IP,表示主机自己,环回网址,相当于this. 只要数据库服务器和jdbc程序在一台电脑上都可以使用这个IP :3306是端口号,安装时默认的,使用IP确定了主机,网络数据报给那个程序是通过端口号来识别出数据库服务器的 java_2数据库名 characterEncoding=utf8字符编码方式 useSSL=false关闭加密功能
2.2实现一个mysql客户端通过网络和服务器进行通信
Connection connection = dataSource.getConnection();
要注意使用Java.sql的Connection
3.使用代码操作数据库
控制客户端给数据库发送请求,执行操作
3.1增删改操作
增删改和查询稍有不同~
增加操作
构造 SQL 语句. JDBC 操作数据库, 本质仍然是通过 SQL 来描述数据库操作
String sql = "insert into student values(001,'张三')"; PreparedStatement statement = connection.prepareStatement(sql); int ret = statement.executeUpdate(); statement.close(); connection.close();
String sql 描述的是sql是什么样的
还需要一个特殊的类:
执行是靠PreparedStatement,它会对sql进行一些预处理,解析之类的,之前通过cmd输入的语句是发送给服务器端让服务器进行解析
当前数据是写死的,我们更希望是动态的
我们通过控制台输入一些信息,来操作数据库
Scanner scanner = new Scanner(System.in); System.out.println("请输入学号"); int id = scanner.nextInt(); System.out.println("请输入姓名"); String name = scanner.next(); String sql = "insert into student values(" + id + ",'" + name+ "')"; PreparedStatement statement = connection.prepareStatement(sql); int ret = statement.executeUpdate();
但是这种操作还存在一个问题
这样的代码可读性很低,另一方面,这个代码还容易引起SQL注入攻击
如果输入这样的代码就会在插入的同时引起很多其他的问题
因此我们提出更靠谱的方案:通过占位符替换的方法输入操作信息
Scanner scanner = new Scanner(System.in); System.out.println("请输入学号"); int id = scanner.nextInt(); System.out.println("请输入姓名"); String name = scanner.next(); String sql = "insert into student values(?,?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1,id); statement.setString(2,name); int ret = statement.executeUpdate();
注意:这里的占位符下标是从1开始的!!
执行增加,删除,更新三个操作用executeUpdate执行,代码和增加的代码是相同的
执行查询操作使用executeQuery
更新操作
也是通过占位符来操作
Scanner scanner = new Scanner(System.in); System.out.println("请输入学号"); int id = scanner.nextInt(); System.out.println("请输入修改的姓名"); String name = scanner.next(); String sql = "update student set name = ? where id = ? "; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1,name); statement.setInt(2,id); int ret = statement.executeUpdate(); statement.close(); connection.close();
数据库中的结果:
mysql> select*from student; +------+------+ | id | name | +------+------+ | 1 | 张三 | | 2 | 李四 | | 3 | 王五 | | 5 | 赵六 | +------+------+ 4 rows in set (0.00 sec) 更新后: mysql> select*from student; +------+--------+ | id | name | +------+--------+ | 1 | 张三 | | 2 | 李四 | | 3 | wangqi | | 5 | 赵六 | +------+--------+ 4 rows in set (0.00 sec)
删除操作
Scanner scanner = new Scanner(System.in); System.out.println("请输入要删除的学号"); int id = scanner.nextInt(); String sql = "delete from student where id = ? "; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1,id); int ret = statement.executeUpdate(); statement.close(); connection.close();
结果:
mysql> select*from student; +------+------+ | id | name | +------+------+ | 1 | 张三 | | 2 | 李四 | | 5 | 赵六 | +------+------+ 3 rows in set (0.00 sec)
三个操作的代码是相同的
执行时给服务器发送网络请求
int ret = statement.executeUpdate();
ret返回的是一个整数,表示执行的结果影响到了多少行
3.2查询操作
查询操作用到的是
ResultSet ret = statement.executeQuery();
与上面三个操作不同的是:
executeUpdate 只能返回一个 int.
executeQuery 返回的是一个 ResultSet 对象. 可以把这个对象视为是一个 "临时表"
增删改返回的是影响的行数,只返回一个整数
查询的结果集合是一张表,因此比其它几个操作多一个遍历,遍历后才能看到结果
String sql = "select*from student"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet ret = statement.executeQuery(); //遍历临时表, 拿到里面的数据. // resultSet 简单的当成一个类似于 "迭代器" // next 如果没有到达末尾, 就是返回 true, 要继续循环. // next 如果到达末尾, 就返回 false, 结束循环. while(ret.next()) { int id = ret.getInt("id"); String name = ret.getString("name"); System.out.println("id: "+id+" name: "+name); } ret.close(); statement.close(); connection.close();
获取哪一列,就用getXXX方法 ,XXX为列的类型
结果:
4.断开连接释放资源
java有GC即垃圾回收机制,会自动处理申请的内存,但是像这种连接的资源还需要我们手动释放
资源的释放顺序是和创建顺序相反的
释放的顺序:先用到的资源后释放
ret.close(); statement.close(); connection.close();
加载全部内容