jdbc是重点,不管是哪种语言,都是要连接数据库的,java不管是连哪个数据库,都是要用到jdbc。jdbc的全称是:java database connection,也就是java连接数据库。
一,jdbc原理:
Jdbc是sun公司定义的一套api,一套标准,也就是如果想连接数据库,就得按照人家的这个标准来。
应用层()–jdbc(数据库的连接,数据库的一些对象)–数据库驱动(就是那些实现了jdbc标准的那些厂商写的那些代码api)–数据库管理系统(mysql)
1,如上图:java连接数据库,不是直接连接,而是先加载了一个第三方插件,而这个第三方插件就是jdbc。所以连接数据库的第一步就是要加载jdbc。这个基本上是固定写法
Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。
第一种形式的参数 name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。第二种形式则相当于设置了参数 initialize的值为 true,loader的值为当前类的类加载器。
很显然这里用的是第二种加载方式。
Class.forName("com.mysql.jdbc.Driver");
Class.forName()中传入的参数就是类的全限定名,JVM通过该全限定名首先检查该类是否已经被加载,若该类没有被加载则加载该类。并返回该类相关的Class对象。
2,加载完了之后需要创建连接,连接java和MySQL,就是上图中的桥。只有有路,数据才能过去
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/ss","root","");
实现了collection接口。 作为初始化的一部分,DriverManager 类会尝试加载在 “jdbc.drivers” 系统属性中引用的驱动程序类。这允许用户定制由他们的应用程序使用的 JDBC Driver
getcollection是drivermanager的一个方法。试图建立到给定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。
里面接数据库名字+IP地址+端口号下的库名,账号,MySQL默认root,密码
3,写一条MySQL语句:它不是直接把数据写到MySQL中去,而是写一条语句,把语句传送到数据库当中去,然后数据库自己执行该语句,实现数据的增删改查。
String sql="INSERT INTO person VALUES(3,'王五')";
4,写完数据,就需要一辆车把数据送过去,statement就是一辆车。
Statement st= con.createStatement();
statement建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute
注意:MySQL是有最大连接数的,就是你传完数据后就要断开连接,要不然,当达到最大连接数后,其他用户连接不到数据库
查询MySQL默认的最大连接数:比如我的最大连接数是800
SHOW VARIABLES LIKE '%max_connections%';
二,简单的增删改查
1,增删改:
增加:
String sql="INSERT INTO person VALUES(3,'王五')";
删除:
String sql="delete from person where pid=1";
修改:
String sql="update person set pname='赵六' where pid=2";
代码演示:
package com.zhang.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动,因为他是第三方
Class.forName("com.mysql.jdbc.Driver");
//创建连接
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/ss","root","");
String sql="select * from person";
//创建一辆车
Statement st= con.createStatement();
st.execute(sql);
con.close();
System.out.println("over");
}
}
如果这样直接运行的话,一定会报错,因为eclipes中没有带jdbc,需要你倒过来
把这个放到你的创建的项目下,右键咖啡边奶瓶
但是如果你的需要传输的语句写错啦,就会报1以下错误:
是String sql=“INSERT INTO person VALUE(1,‘张三’)”;这句话拼写错误了,或者里面的数据类型和数据库不一致。导致st.execute(sql);这句话执行不过去,这个时候注意语句的拼写,数据类型也要和元数据一致。
2,查询,查询比较复杂一点:
package com.zhang.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/ss","root","");
String sql="select * from person";
Statement st= con.createStatement();
boolean b=st.execute(sql);
//execute返回一个布偶类型,如果有结果集,它返回true,没有结果集,它返回false,
//这个结果集不是指有无数据返回,即使没有数据返回,它也有结果集,他有元数据返回
//了。
if(b){
ResultSet rs=st.getResultSet();//注意包不要倒错,纯sql包
//这句话是要打印表头
System.out.println("pid"+"\t"+"pname");
while(rs.next()){//如果rs有下一项,就输出
//查询的时候,要输出第一列和第二列,getobject是因为不知道
//具体是什么类型的,最好转成object类型
System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
}
}
//连接默认800,用完了之后要关了连接,给其他人腾出连接空间
con.close();
System.out.println("over");
}
}