DataSource dataSource=new MysqlDataSource();
步骤二:(向上转型)
((MysqlDataSource)dataSource).setUrl();
给大家回顾一下,向上转型,和向下转型
向上转型:子类对象转成父类。
向下转型:父类对象转成子类。
实际上⚠️⚠️
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setUrl()其实就可以了 🌚 🌚 🌚
🍅🍅🍅
当然这么做肯定有他们的道理。
按照最初的转型方法,本质是希望让MysqlDataSource,不要扩散到代码的其他部分··思想其实是想降低mysql驱动包,和我们项目之间的耦合关系,避免后续更换数据库,成本过大。
Url:唯一资源定位符,通常用Url来描述网络上一个资源的位置,mysql本体是服务器~,相当于是网络上的资源,里面写的东西直接复制贴贴就行,不用背
"jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"
这个是括号里面需要填写的,下面我们来分析一下每一块都是什么意思。
jdbc:mysql♈️url是一个什么类型的url ,这里的意思就是jdbc:mysql就是说给jdbc的mysql使用的。
127.0.0.1 ♉️网络上的一个地址~是通过这一串数字来表示的,这一串数字通常是4个部分,各个部分取值范围是0-255,4个部分使用,分割
3306♍️ 端号,区分主机上的应用程序
java108♋️数据库名字
characterEncoding=utf8&&useSSL=false; 统一字符集utf8
statement:是把sql原封不动的直接发给数据库服务器,数据库服务器自己解析sql
PreparedStatement,会先在客户端这边初步解析SQL(验证语法,是否正确),此时服务器就不用做这些检查了,从而降低服务器负担,另外,本身SQL存在String类型,JDBC提供statement对象,让我们把String对象转换成statement,再发给服务器执行,但是一般会使用PrparedStatement(预处理的语句)对象代替statement.
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) throws SQLException { //1.创建数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"); //设置你的数据库名字的密码,不是随便设置哈,你自己的数据库密码,root也是不能乱设置 ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("lcl15604007179"); //2.和数据库服务器建立链接,认准第二个sql的Connection,第一个com那个是mysql的驱动包 Connection connection=dataSource.getConnection(); //构造SQL语句 String sql=" insert student values(1,'张三') "; PreparedStatement statement=connection.prepareStatement(sql); //4.执行SQL语句 int n=statement.executeUpdate(); //返回有几行收到了影响 System.out.println(n); //5.释放必要资源,关闭链接 -注意关闭顺序,后创建的先关闭 statement.close(); //创建的对象都会持有一些计算机硬件,软件中资源 connection.close(); } }
🔯Java有垃圾回收机制,自动释放内存,但是资源不仅仅是内存啊,所以才需要关闭,资源需要手动关闭。
但是我们这么写,写出来的数据是写死的什么张三啥的,那我们该如何在动态的让用户输入数据呢,
PreparedStatement提供了我们占位符的写法,可以更优雅,更安全的解决上述问题
?是一个占位符,后续PreparedStatement会把变量数值带入到?中,
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class Main { public static void main(String[] args) throws SQLException { Scanner scanner=new Scanner(System.in); System.out.println("输入姓名"); String name=scanner.nextLine(); System.out.println("输入数字"); int id=scanner.nextInt(); //1.创建数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("lcl15604007179"); //2.和数据库服务器建立链接 Connection connection=dataSource.getConnection(); //3.构造SQL语句 String sql=" insert student values(?,?) "; PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1,id); //表示的是第一个问号 statement.setString(2,name); //表示的是第二个问号 //4.返回受影响的行数 int n=statement.executeUpdate(); System.out.println(n); //5.释放必要资源,关闭链接 statement.close(); connection.close(); } }
🔜就算是插入,修改,删除也没有区别,删除就是轻微的改动,下面的setString和SQL语句而已
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class Main { public static void main(String[] args) throws SQLException { Scanner scanner=new Scanner(System.in); System.out.println("输入姓名"); String name=scanner.nextLine(); //1.创建数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("lcl15604007179"); //2.和数据库服务器建立链接 Connection connection=dataSource.getConnection(); //3.构造SQL语句 String sql=" delete from student where name=? "; PreparedStatement statement=connection.prepareStatement(sql); statement.setString(1,name); //4.执行SQL语句 int n=statement.executeUpdate(); System.out.println(n); //5关闭 statement.close(); connection.close(); } }
❤❤❤但是查询有说法,,一下就是查询要注意的操作。
//4.执行查询操作,要使用excuteQuery,返回值是一个ResultSet类型的对象,表示了一个表格
ResultSet resultSet = statement.executeQuery();
//遍历结果集合
while (resultSet.next())
这个意思是什么捏?💝💝💝想象有一个光标,这个光标的初始情况下,指向第一行记录的前一个位置~
如果每次调用next为true,取这行数据 ,取完这一行,下次又要调用next,此时要是返回false,循环结束
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; public class Main { public static void main(String[] args) throws SQLException { Scanner scanner = new Scanner(System.in); //1.创建数据源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("lcl15604007179"); //2.和数据库服务器建立链接 Connection connection = dataSource.getConnection(); //构造SQL语句 String sql = " select * from student "; PreparedStatement statement = connection.prepareStatement(sql); //4.执行查询操作,要使用excuteQuery,返回值是一个ResultSet类型的对象,表示了一个表格 ResultSet resultSet = statement.executeQuery(); //遍历结果集合 while (resultSet.next()) { //获取这一行学号列 int id = resultSet.getInt("id"); //获取姓名列 String name = resultSet.getString("name"); System.out.println("id: " + id + ",name: " + name); } statement.close(); connection.close(); } }
当然里面也可以包含一些占位符。💖💖💖
public class Main { public static void main(String[] args) throws SQLException { Scanner scanner = new Scanner(System.in); int student_id=scanner.nextInt(); //1.创建数据源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108? characterEncoding=utf8&&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("lcl15604007179"); //2.和数据库服务器建立链接 Connection connection = dataSource.getConnection(); //注意哈,这里面是id不是你写的那个变量student_id String sql = " select * from student where id = ? "; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1,student_id); //4.执行SQL语句 ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ",name: " + name); } //5.注意关闭的时候result也需要关闭 resultSet.close(); statement.close(); connection.close(); } }
💟💟💟复杂的SQL也是这么写都支持(create table ,drop table都可以就是不推荐)
DataSource
Connection
PreparedStatement
Result
四大天王,通过这四个类,就可以基本吃遍JDBC编程
大佬会对JDBC进行进一步封装,数据库操作框架(虽然项目中不一定使用JDBC,一般都用框架代替,但是JDBC是不变化的,框架是可变的,基于JDBC去使用框架