小编学习的是MySQL数据库,是在客户端进行操作的,但是真正在企业/公司里面操作数据库的时候,99.99999% 的情况下都是通过代码来操作的,很少会在客户端里输入sql语句(你的系统执行了10W次,也不一定会手动敲一次sql),那么,接下来的本篇文章,Java的JDBC编程主要讲解的就是:用Java代码操作数据库~注意啦注意啦~
市场上常见的几个数据库,如:MySQL,Orcale,SQL Server 在开发的时候,就会提供一组编程接口(API),所谓的API就是指:给你一个软件/程序,你能对他干啥??(代码层次)基于他提供的这些功能,就可以写一些其他代码~
如:一个新妹子:
一个新妹子:
- 微信聊天
- 发自拍照
- 一起吃饭
- 一起喝咖啡
基于这些功能,写了一个程序,度过美好的一天
当妹子进化为女朋友以后~~
- 微信聊天
- 发自拍照
- 一起吃饭
- 一起喝咖啡
- 拉小手
- 抱抱
- ~~~~~
基于这些功能,有可以度过另一天~~
上述跟妹子在一块干的事情(吃饭,聊天,自拍照,喝咖啡,拉手,抱抱~~~~,就是API,所谓的API,对于程序员来说,API往往就是以“函数“,”方法“,”类“的形式来提供的(不是自己实现的,是人家哪些库(程序)提供的,基于函数,API对程序进行各种操作,来度过美好的一天~~
但是,这些数据库:MySQL,Orcale……所提供的API是不一样的(有人的地方就有江湖)总体的差别不大(细节有一定影响)
Java程序员要想进行数据库开发,就需要在你的项目中导入对于数据库的驱动包,才能编写代码~
那么,如何在数据库中导入驱动包呢??
- 创建个Java项目
- 驱动包从哪里来??(驱动包是厂商提供的)
- MySQL的官方网站获取(下策)MySQL被Orcale收购了以后,官网也被合并了,难用~
- GitHub(需要翻墙)
- Maven的中央仓库获取
Maven相当于手机的应用商店,中央仓库相当于服务器,因此,在应用商店托管了各种软件程序包,通过应用商店,就可以访问到软件程序包,下载下来~~
Maven官方网站:
需要注意的是:数据库服务器是5系列,此次的驱动包也得是5系列(大版本不要错,小版本无所谓)
.jar是Java发布程序的典型方式;
Java通过.java源文件编译成.class文件,JVM来解释执行.class
每一个.java都一一对应一个.class,如果代码里.java 非常多呢?
把一大堆的.class给打压缩包(类似于.rar,.zip),把.jar拷贝给对方,对方就可以之间使用JVM执行了~
此处MySQL驱动包的这个.jar不是单独运行的.jar,可以把他导入到咱们的项目;如何就可以调用其中的方法和类进行编程了~
操作过程:
- 把.jar复制到idea中(不需要解压缩,idea自动帮你解压缩)(每次创建项目都得这么干)
- 把这个目录(.jar放入的)标记成项目的库(右键,Add as library…,确定,通过这样,idea就能识别这个目录里的.jar包,从而就可以调用里面的类来写代码了~~)
下面我们来看一下最重要的部分:编写JDBC代码吧~~
JDBC需要通过一下步骤来完成开发~
- 创建并初始化一个数据源
- 和数据库服务器建立连接
- 构造sql语句
- 执行sql语句
- 释放必要的资源
在上面的五个步骤中,看起来很麻烦,但是实际上却是非常简单,主要还是在于刚刚接触这一块,会觉得有点饿麻烦,涉及到新的类,新的方法,新的概念……,但是多写几次就会发现,这里的代码满满的都是套路~~
正是因为套路多了,实际开发中就会使用一些框架来简化数据库操作代码(MyBatis这样的框架就是如此),但是不能光会框架,也得知道框架背后的操作,对原生JDBC有理解(框架一直在变,JDBC是不变的!!!)
1.创建并初始化一个数据源
数据源:数据的源头,指数据从哪里来!!(描述数据库服务器在哪里)
用DataSource接口
DataSource dataSource =new MysqlDataSource(); //向上转型 父类引用指向子类对象
明确数据库所在的位置(向下转型转回来)
((MysqlDataSource)dataSource).setUrl();
setUrl()这个方法是子类有的,父类没有的方法,要想使用,就需要把父类转回成子类引用(向下转型)
URL:计算机里的一个常见术语
唯一资源定位符,描述网络上的某个资源所在的位置(格式非常有特点)
"jdbc:mysql://127.0.0.1:3306/java12?characterEncoding=utf8&useSSL=false" &注意区分 在后续HTTP会讲到:千万不要背,容易被错(放到电脑一个随手能找到的地方)
在上述的代码中:
jdbc是固定的
mysql看你用啥数据库
127.0.0.1:IP地址( 网络上确定主机的位置就是通过IP地址来确定的!!)
MySQL数据库是一个”客户端服务器“结构的程序,客户端和服务器之间通过网络 来通信;都写作127.0.0.1叫做环回IP,表示你自己当前主机
咱们的数据库客户端(现在写的jdbc代码)和数据库服务器(之前装存数据的服务)是在一个主机上!(若是客户端和服务器在不同的主机上,IP就得变变了~)
3306:端口号
端口来区分应用程序,数据库服务器默认端口就是3306
java12:数据库名
create database 数据库名;
characterEncoding = utf8:参数,字符集使用utf8
SSL:是一个加密协议(SSL=false:不加密)
上面的这个我们也可也理解为:
"jdbc:mysql://127.0.0.1:3306/java12?characterEncoding=utf8&useSSL=false" 山大 :18号窗口 / 熏肉大饼?口味=微辣&葱=少葱&香菜=要
简单的个人理解,仅供参考~
设置用户名:
((MysqlDataSource)dataSource).setUser("root"); 用户名都是root(默认就是root)
设置密码:
((MysqlDataSource)dataSource).setPassword("123456"); 此处的123456是指安装数据库的时候,自己设定的密码
这些代码只是设置数据源,描述数据库服务器在哪!!还没真正和数据库服务器连接~!!
2.和数据库服务器建立连接
dataSource.getConnection(); 会抛异常(SQLException) 用变量接收返回的结果 Connection connection = dataSource.getConnection(); (java.sql类下)
3.构造sql语句
String sql ="insert into student value(1,"张三");
即使咱们使用代码来操作数据库,还是靠sql语句,只不过是换成用代码来构造sql,前面sql的各种语法仍然有效
当然,光有sql语句还不够,需要有准执行项来包裹sql语句
PreparedStatement statement = connection.preparedStatement(sql); 使用PreparedStatement提前预编译一下SQL
4.执行sql语句
int ret =statment.exeuteUpdate(); 返回类型为int,表示影响到的行数 System.out.println("ret = "= ret);
把sql语句(预编译过的)发送给数据库服务器,由服务器做出响应
insert delete ----->> executeUpdate------>>返回int,表示影响到的行数 update select----->>executeQuery 有点饿复杂(后面怎请考虑)
5.释放必要的资源
statement.close(); connection.close();
经过上述的分析,我们来简单的看一下总体的代码:
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 JDBC_Insert { public static void main(String[] args) throws SQLException { //JDBC需要通过一下步骤来完成开发 //1.创建并初始化一个数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("123456"); //123456是自己设置的MySQL登录密码 //2.和服务器建立联系 Connection connection=dataSource.getConnection(); //3.构造sql语句 String sql="insert into student value(1,'张三')"; PreparedStatement statement=connection.prepareStatement(sql); //4.执行sql语句 int ret=statement.executeUpdate(); System.out.println("ret = "+ ret); //5.释放必要的资源 statement.close();//先释放语句 connection.close();//后释放连接 //先创建的后释放(顺序不能变) } }
值得注意的是:在上述的代码中:3.构造SQL 语句给写死了~~不知道大家有没有注意到,反正小编倒是感觉出来不得劲了~
//3.构造sql语句 String sql="insert into student value(1,'张三')"; PreparedStatement statement=connection.prepareStatement(sql);
在这个构造sql语句中,要插入的数据是写死的(硬编码)不好哈
其实更合适的做法是:把数据通过其他方式让用户输入(比如通过控制台)
做法1:我们可以在代码的开头部分创建一个输入:
Scanner scanner=new Scanner(System.in);
从而由:3.从控制台中读取用户的输入内容(下策)
//3.从控制台读取用户的输入内容 System.out.println("请输入学生姓名:"); String name=scanner.next(); System.out.println("请输入学号:"); int id=scanner.nextInt(); //3.构造SQL语句 String sql="insert into student value("+ id+ ",'"+name+ "')"; PreparedStatement statement=connection.prepareStatement(sql);
通过这种方式确实可以完成用户动态输入数据的效果,但是这种写法特别丑,可读性差,容易出错(不建议这样写,仅做了解即可)
做法2:使用PreparedStatement的拼装功能来实现(更好的写法)
//3.从控制台读取用户的输入内容 System.out.println("请输入学生姓名:"); String name=scanner.next(); System.out.println("请输入学号:"); int id=scanner.nextInt(); //4.构造SQL语句 String sql="insert into student value(?,?)"; // ? 问号:占位符 PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1,id);//把第一个?(问号)替换为id statement.setString(2,name);//把第二个?(问号)替换为name //通过setInt , strString将占位符替换为指定的值 System.out.println(statement); //打印,打印需要加到拼接数据之后
值得注意的是:打印需要加到拼接数据之后,如果在上述的过程中,执行的代码结构出错了,就可以把statement打印出来,看看哪里有语法错误或者也可以直接把这个sql拷贝到控制台中执行~~
那么,此时比较完整(合理)的代码如下:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import javax.sql.DataSource; import java.awt.print.PrinterAbortException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class JDBC_Insert { public static void main(String[] args) throws SQLException { Scanner scanner=new Scanner(System.in); //JDBC需要通过一下步骤来完成开发 //1.创建并初始化一个数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("zhao05306910a"); //2.和服务器建立联系 Connection connection=dataSource.getConnection(); //3.从控制台读取用户的输入内容 System.out.println("请输入学生姓名:"); String name=scanner.next(); System.out.println("请输入学号:"); int id=scanner.nextInt(); //4.构造SQL语句 String sql="insert into student value(?,?)"; // ? 问号:占位符 PreparedStatement statement=connection.prepareStatement(sql); statement.setInt(1,id);//把第一个?(问号)替换为id statement.setString(2,name);//把第二个?(问号)替换为name //通过setInt , strString将占位符替换为指定的值 System.out.println(statement); //打印,打印需要加到拼接数据之后 //5.执行sql语句 int ret=statement.executeUpdate(); System.out.println("ret = "+ ret); //6.释放必要的资源 statement.close();//先释放语句 connection.close();//后释放连接 //先创建的后释放(顺序不能变) } }
经过上述的一个简单讲解,想必老铁也能看懂如何插入数据了吧~
那么,我们来实现一个查询操作:
对于查询来说,返回的结果不是单纯的int了,而是ResultSet对象
具体的过程如下:
- 创建并初始化数据源
- 建立连接
- 构造sql
- 执行sql
- 遍历结果集合
- 释放资源
那么我们来看一下具体的代码吧~
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; public class JDBC_Select { public static void main(String[] args) throws SQLException { //1.创建并初始化数据源 DataSource dataSource=new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("zhao05306910a"); //2.建立连接 Connection connection=dataSource.getConnection(); //3.构造SQl String sql="select * from student"; PreparedStatement statement=connection.prepareStatement(sql); //4.执行sql ResultSet resultSet=statement.executeQuery(); //5.遍历结果集合 while (resultSet.next()){ //把resuletSet想象成一个表格,同时表格这里有光标 //初始情况下光标指向最上面(表格最上面一行的上面~) //每次使用next,光标往下走一行,然后返回true(当光标已经将整个表都遍历完了,就会返回fales) //当光标指向某一行的时候,getXXX来获取当前这行里的数据 int id=resultSet.getInt("id"); String name=resultSet.getString("name"); System.out.println("id = "+id +"name +"+name); //getXXX是取出这一行的指定列的值,使用的方法要和列的类型匹配 } //释放必要的资源 resultSet.close(); statement.close(); connection.close(); } }
关于:Java的JDBC编程<-----用Java代码操作数据库(MySQL数据库)大致就讲完了,那么有错误的地方,请各位老铁及时评论~~