JDBC连接方式和步骤
1. 注册驱动
Diver dirver =new com.mysql.jdbc.Diver();
这种方式是首先实现Sun公司的接口,mysql厂家根据接口去实现,最左边的Dirver是接口右边的是接口实现类
DiverManager.registerDirver(dirver);
3. 获取连接
String url=“jdbc:mysql://localhost:mysql端口号(port):数据库名称”;
String user=“root”;
String password="";
Connection conn=DirverManger.getConnection(url,user,password);
System.out.println("数据库连接对象=“+conn);
- 获取数据库连接对象
Statement stmt= conn.createStatement();
- 执行sql
String sql=”“;
sql里面的语句DML语句 包括(insert update delete) 返回的是影响数据库的记录条数;
例如:insert into 表名(字段名1.字段名2 )value(字段名1的值,字段名2的值);
int count=stmt.executeUpdate(sql);
- 释放资源
为保证资源一定被释放,在finall里面要关闭资源
并且遵从从小到大依次关闭
分别对其try…catch
合并代码
puclic static void main(String[] args){
Connection conn=null;
Statement stmt=null;
//之所以把conn和state放在这里是想把它变为成员变量不然在finally里根本无法访问;
//注册驱动
try{
Diver dirver =new com.mysql.jdbc.Diver();
DiverManager.registerDirver(new com.mysql.jdbc.Diver());
//也可以合并写 DiverManager.registerDirver(dirver);
//获取连接
String url="jdbc:mysql://localhost:mysql端口号(3306):数据库名称";
String user="root";//这里是你的mysql自定的用户名
String password="";//这里的密码为你的mysql登录密码
conn=DirverManger.getConnection(url,user,password);
stmt= conn.createStatement();
//执行DML语句
int count=stmt.executeUpdate(sql);}
}catch(SQLException e){
e.printStackTrace();
}
finally{
if(stmt!=null){
try{ stmt.close();
}catch(SQLexception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
catch(SQLException){
e.printStackTrace();
}
}
}
2.第二种方式
当我们打开mysql的安装路径 打开src(要先解压)点击com目录进而点击mysql目录里面有个jdbc文件目录会出现一个Diver.java的java文件
会发现里面有个静态代码块
我们应该知道静态代码块在类加载的过程中会被执行,这部分代码相当于把我们之前的注册驱动给完成了,也就是说我们只要能够加载这个类就不用去敲注册信息了
static{
try{
java.sql.DiverManfer.registerDriver(new Dirver());
}catch{
throw new RuntimeException(“Con’t register driver!”)
} }
可是我们要怎么去加载到这个类💫?
这时候你可以考虑用反射来去加载字节码
class.forname(“com.msql.jdbc.Driver”);这时候加载就会执行
static{
try{
java.sql.DiverManfer.registerDriver(new Dirver());
}catch{
throw new RuntimeException(“Con’t register driver!”)
} }
所以我们就就可用另一种方式来写
puclic static void main(String[] args){
Connection conn=null;
Statement stmt=null;
//之所以把conn和state放在这里是想把它变为成员变量不然在finally里根本无法访问;
//注册驱动
try{
dirver="com.mysql.jdbc.Driver";
class.forname("driver");
//class.forname("com.msql.jdbc.Driver");
DiverManager.registerDirver(new com.mysql.jdbc.Diver());
//也可以合并写 DiverManager.registerDirver(dirver);
//获取连接
String url="jdbc:mysql://localhost:mysql端口号(3306):数据库名称";
String user="root";//这里是你的mysql自定的用户名
String password="333";//这里的密码为你的mysql登录密码
conn=DirverManger.getConnection(url,user,password);
stmt= conn.createStatement();
//执行DML语句
int count=stmt.executeUpdate(sql);}
}catch(SQLException e){
e.printStackTrace();
}
finally{
if(stmt!=null){
try{ stmt.close();
}catch(SQLexception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
catch(SQLException){
e.printStackTrace();
}
}
}
使用最多的就是第二种方法,为什么这种方法使用的最多💫?
因为参数是一个字符串,字符串可以写到XXX.properties文件
这种文件叫属性配置文件类如这样
第三种方法
有了这个文件我们也可以进行资源绑定属性配置文件
ResourceBundle bundle=ResourceBundle.getBundle(“jdbc”);
//这个jdbc就是propeties文件的名字但是注意要去掉后缀不要加上propeties;
puclic static void main(String[] args){
//以下这段代码是从之前属性文件也就是jdbc.propeties文件
ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
//getString()传入的参数都是上述文件里面的属性
String dirver=bundle.getString("diver");
String url=bundle.getString("url");
String user=bundle.getString("user");
String password=bundle.getString("password");
Connection conn=null;
Statement stmt=null;
//之所以把conn和state放在这里是想把它变为成员变量不然在finally里根本无法访问;
//注册驱动
try{
dirver="com.mysql.jdbc.Driver";
class.forname("driver");
//class.forname("com.msql.jdbc.Driver");
DiverManager.registerDirver(new com.mysql.jdbc.Diver());
//也可以合并写 DiverManager.registerDirver(dirver);
//获取连接
conn=DirverManger.getConnection(url,user,password);
stmt= conn.createStatement();
//执行DML语句
int count=stmt.executeUpdate(sql);}
}catch(SQLException e){
e.printStackTrace();
}
finally{
if(stmt!=null){
try{ stmt.close();
}catch(SQLexception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
catch(SQLException){
e.printStackTrace();
}
}
}
这时候就会产生一个问题,为什么要使用这样的代码?💫
其实在实际开发中不建议把代码写死了(就是把代码放在java文件里面)如果我们利用这种方式我们就可以只要修改文件propeties里的属性值就可以了,你如果让一个非技术人员你告诉他你要先打开java文件然后再修改密码和用户名这显然是不合适的,所以告诉他你只需要打开这个文件,在上面打开改一些密码和姓名就可以了。更方便的话可以弄个图形界面\
下面给大家看一下如何处理结果集,我们在之前内容都是只能使用DML(insert delete update)语句想要查看有没有成功需要进入mysql查看表,这样有些不足,所以提供了一种查看结果的方式先看下代码:
public static void mian(String[] args)
{
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
class.forName("com.mysql.jdbc.Dirver");
String url="jdbc:mysql://localhost/3306/数据库名";
String password="333";
String user=root;
conn=DriverManger.getConnection(url,user,password);
stmt=conn.createStatement();
String sql="select empno,name from emp;
//这时候就不能使用这个方法了,这个方法只能执行DML语句也就是(insert delete update)
rs=stmt.executeUpdate(sql);❌
//想要执行MQL语句也就是select查询语句需要使用这样的方法
rs.executeQuery(sql);✅
}catch(Exception e){
e.printStackTrace();
}finally{
if(rs!=null){
try{
rs.close();
}catce(Exception e){
e.printStackTrace();
}
}
if(stmt!=null){
try{
stmt.close()
}catch(Exception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close()
}catch(Exception e){
e.printStackTrace();
}
}
}
运行结果因为我没有装mysql我画个表格方便你理解类似于我们的表
empno | name |
---|---|
231123 | jack |
123145 | lusi |
532666 | yuhan |
如果大家敏感的话看到这样的结果你可能会想到这样的结果好像是遍历结果集出来的
经过查证在ResultSet接口里面确实存在一种方式next();他返回的是Boolean类型
boolean flag=rs.next();这个方式用来判断下一行是否有数据值得注意的是这个方法类似于管光标,我记得没错的话类似于栈的指针,刚开始并不是指向第一个元素(这里我不细说,数据结构还没复习),我们这个也类似就是刚开始指向这个表的头部然后 next为True代表这一行有元素(我可能表述的不好见谅)我还是画图吧。
当光标指到这行时是怎么取到每个字段数据的那💫?
果然不出所料确实有种方式可以得到字段的值就是getString();
while(rs.next())
{
String empno=rs.getString(1);
String name=rs.getString(2);
System.out.pritln(empno+","+name);
}
💦运行出来就是我们表的为
231123,jack
123145, lusi
532666,yuhan
那么问题来了,如果我们不用下标使用字段名可以得到结果吗我们去试试
while(rs.next())
{
String empno=rs.getString(“empno”);
String name=rs.getString(“name”);
System.out.pritln(empno+","+name);
}
运行出来的结果还是这样
231123,jack
123145, lusi
532666,yuhan
这就挺有趣的了那么假如我们把表名给修该了还能有这样的效果吗
我们都知道修改表的字段名很简单用as就可,所以我们改为select empno as id ,name from emp;改完以后我们在运行之前未改字段名时候的代码还能查到吗
while(rs.next())
{
String empno=rs.getString(”empno");
String name=rs.getString(“name”);
System.out.pritln(empno+","+name);
}
//这时候就报错了说未找到empno
那么我运行修改字段后的代码
while(rs.next())
{
String empno=rs.getString(“id”);
String name=rs.getString(“name”);
System.out.pritln(id+","+name);
}
奇妙的是这时候的运行结果就出现了还是
231123,jack
123145, lusi
532666,yuhan
通过对比知道我们其实运行的一种都是我们sql语句上面自己写的代码,你若是修改了字段,只能通过修改后的字段去得到结果:
💥💥💥💥重点:
列名称不是表你msql表的名称而是你自己定义的集合列名称
就是select empno as id,name from emp;为主