目录
JDBC又称为数据库连接池,是一种执行SQL语句的一套java的API.
JDBC优势:
- //操作数据库就要连接数据库服务器 ->就要描述数据库服务器的位置
- //创建数据源 - >用来描述数据库服务器的位置
- DataSource dataSource = new MysqlDataSource();
首先需要与数据库服务器建立连接,第一步就需要创建数据源--->主要用来表述数据库服务器所在位置,在JDBC中使用DataSource来创建数据源,DataSource是一个接口,而MysqlDataSource类实现了这个接口.
DataSource提供数据库连接池的支持,既然是池化技术,建立数据库连接可以复用.
- //设置url(网址)
- ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
- //设置用户名
- ((MysqlDataSource)dataSource).setUser("root");
- //设置密码
- ((MysqlDataSource)dataSource).setPassword("123456");
jdbc:mysql : 代表协议名 ,告诉我们jdbc是用来连接MySQL用的
127.0.0.1 : 数据可以默认iP地址
3306 : 数据库服务器默认端口号
java : 数据库名
characterEncoding=utf8 : 设置字符集为UTF8
useSSL=false : 代表不加密;
设置用户名 默认为root
设置自己数据库的密码 --> 这里如果输入错误会报错
答案可以利用datasource不用强转,但是代码的可复用性,可扩展性就下降.
原因是直接使用datasource得到的数据元素mysqlDataSource数据源,如果后期更换其他数据库,需要将所有与mysqkDataSource有关的代码都需要进行修改,可扩展性极低.
如果使用mysqlDataSource将DataSource得到的数据源是DataSource类型,DataSource是通用的接口,未来更换任何关系型数据库(JDBC只能连接关系型数据库)使用JDBC连接时,只需要修改实例化的一小段代码就可以,可扩展性高.
- //接下来建立与数据库建立连接
- //调用dataSource的getConnection建立连接 返回给一个connection的对象
- Connection connection = dataSource.getConnection();//-->这里要throws数据库异常
根据创建的DataSource数据源,通过调用DataSource的getConnection方法来与数据库服务器创建连接,将返回结果返回到connection这个对象中
- //用字符串构造sql语句 完成数据库插入操作
- String sql = "insert into student values (?,?)";
-
- //用statement对象 来描述一个sql语句 sql语句是..... 与.....(dataSource描述与哪个数据库
- // 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
- PreparedStatement statement = connection.prepareStatement(sql);
构建sql : 将SQL语句放到字符串中用sql变量保存 -->这样就构建好了一个sql语句
注意这里在构建sql时可以使用?->占位符 在创建完statement方法之后,可以利用statement来进行设置,下标从1开始.
PreparedStatement statement = connection.prepareStatement(sql);
这个statement对象描述这个sql语句是什么 ,将要与哪个数据库服务器建立连接,由于connection来自DataSource,而这里调用connection的方法就知道与刚才创建的数据源进行连接.
占位符不能使用多值
占位符 ? 下标从 1 开始
阻止常见sql注入攻击 --->(比如在构建SQL里把SQL语句写死)
参数化SQL查询
SQL预编译
性能比statement高
- //通过executeUpdate 执行sql语句 同时返回要执行的行数
- int n = statement.executeUpdate();
- System.out.println("n = " + n);//打印要执行的行数
通过prepareStatement的executeUpdate 来执行对应的 insert ,update,delete方法,而如果想要select查询那秀需要调用prepareStatement的executeQuery方法
调用方法返回的是 要执行的行数
![]()
这里的7 就是要返回的
这里注意在执行select查询语句时需要进行处理结果集,由于select查询时返回的是一张临时表,通过resultSet类似于"迭代器",遍历这个临时表,通过这个resultSet的get方法来得到这个列的内容
我们将网络分为有连接(接电话-->需要建立连接两个人才能进行沟通).
无连接(发微信->不需要建立连接)
而采用JDBC编程是使用有连接(我们第一步就是创建数据源),既然有连接就需要 关闭连接(如果不关闭连接 比如两个人打电话就会一直扣话费-->消耗资源),所以我们就要释放资源
- //释放连接资源
- //从后往前释放 --> 先释放里面的 在释放外面的
- statement.close();
- connection.close();
通过close()方法来关闭资源,注意这里要从后往前关闭资源,先打开的资源要先关闭,后打开的要后关闭.
- public static void main(String[] args) throws SQLException {
- //操作数据库就要连接数据库服务器 ->就要描述数据库服务器的位置
- //创建数据源 - >用来描述数据库服务器的位置
- DataSource dataSource = new MysqlDataSource();
- //需要设置 url(网址(网络协议 ip 地址 数据库名)) user(用户名) password(密码)
- //jdbc:mysql:--->协议
- //127.0.0.1 -->ip地址
- //3306 -->数据库服务器默认端口号
- //java -->数据库名
- //characterEncoding=utf8 ---->设置字符集为utf8
- //useSSL=false -->表示不加密
- //这里向下转型的原因是 dataSource接口,在次换数据库操作只需修改实例化代码
- //而MysqlDataSource 只针对Mysql类型,再次换数据库操作 需要修改所有为MysqlDataSource的地方
- ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
- //设置用户名
- ((MysqlDataSource)dataSource).setUser("root");
- //设置密码
- ((MysqlDataSource)dataSource).setPassword("123456");
-
- //接下来建立与数据库建立连接
- //调用dataSource的getConnection建立连接 返回给一个connection的对象
- Connection connection = dataSource.getConnection();//-->这里要throws数据库异常
-
- //输入要插入表中的信息
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入你要插入的用户名 id : ");
- int id = scan.nextInt();
- Scanner scan1 = new Scanner(System.in);
- System.out.println("请输入你要插入的用户名 name : ");
- String name = scan1.nextLine();
- //用字符串构造sql语句 完成数据库插入操作
- String sql = "insert into student values (?,?)";
-
- //用statement对象 来描述一个sql语句 sql语句是..... 与.....(dataSource描述与哪个数据库
- // 建立连接-->connection 对象也保存这个数据库服务器的数据源 然后返回给statement对象)数据库连接
- PreparedStatement statement = connection.prepareStatement(sql);
- //将输入的要插入的数据 设置到sql中
- statement.setInt(1,id);
- statement.setString(2,name);
- //执行sql语句
- //通过executeUpdate 执行sql语句 同时返回要执行的行数
- int n = statement.executeUpdate();
- System.out.println("n = " + n);//打印要执行的行数
-
- //释放连接资源
- //从后往前释放 --> 先释放里面的 在释放外面的
- statement.close();
- connection.close();
-
- }
- public class UpdateJDBC {
-
- public static void main(String[] args) throws SQLException {
- DataSource dataSource = new MysqlDataSource();
- ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
- ((MysqlDataSource)dataSource).setUser("root");
- ((MysqlDataSource)dataSource).setPassword("123456");
-
- //输入信息
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入你要修改的id :");
- int id = scan.nextInt();
- Scanner scan1 = new Scanner(System.in);
- System.out.println("请输入你要修改的名字 : ");
- String name = scan1.nextLine();
-
- //建立连接
- Connection connection = dataSource.getConnection();
- //构建sql
- String sql = "update student set name = ? where id = ?";
-
- PreparedStatement statement = connection.prepareStatement(sql);
- statement.setString(1,name);
- statement.setInt(2,id);
-
- int n = statement.executeUpdate();
- System.out.println("n = " + n);
-
- //释放连接资源
- statement.close();
- connection.close();
- }
- }
- public class DeleteJDBC {
-
- public static void main(String[] args) throws SQLException {
- DataSource dataSource = new MysqlDataSource();
- ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
- ((MysqlDataSource)dataSource).setUser("root");
- ((MysqlDataSource)dataSource).setPassword("123456");
-
- //建立连接
- Connection connection = dataSource.getConnection();
-
- //输入信息
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入你要删除的id ");
- int id = scan.nextInt();
-
-
- //构建sql语句
- String sql = "delete from student where id = ?";
- PreparedStatement statement = connection.prepareStatement(sql);
-
- statement.setInt(1,id);
-
- int n = statement.executeUpdate();
-
- System.out.println("n = "+ n);
-
- statement.close();
- connection.close();
- }
-
- }
对于查询这里与前面的增删改不一样
- public class SelectJDBC {
-
- public static void main(String[] args) throws SQLException {
- DataSource dataSource = new MysqlDataSource();
- ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
- ((MysqlDataSource)dataSource).setUser("root");
- ((MysqlDataSource)dataSource).setPassword("123456");
-
- Connection connection = dataSource.getConnection();
-
- String sql = "select * from student";
- PreparedStatement statement = connection.prepareStatement(sql);
-
- //返回一个临时表
- ResultSet resultSet = statement.executeQuery();
- //要查询这个临时表 我们可以把这个resultSet 当做一个 "迭代器" ->利用它来遍历这个临时表
- while(resultSet.next()){
- int id = resultSet.getInt("id");
- String name = resultSet.getString("name");
- System.out.println("用户id :"+ id + "用户名 : " + name);
- }
- //释放资源
- resultSet.close();
- statement.close();
- connection.close();
- }
- }