jdbc(mysql)数据库连接
0.将驱动引入项目
- 在项目根目录新建文件夹lib,把数据库驱动mysql-connector-java-5.1.7-bin.jar放入该文件夹。
- 右键点击项目名称->properties->Java Build Path->Libraries->Add JARs->找到驱动文件->搞定
什么是mysql-connector-java-5.1.7-bin.jar?
数据库驱动。
为什么要另外引入一个jar包,sun公司怎么没有实现这些功能?
因为市面上有很多数据库,mysql oracle sqlserver,每个数据库内部实现不同,sun公司提供标准接口,数据库提供商负责实现接口,把所有实现类打包成.jar文件。有了这个jar包,java程序就可以驱动着数据库做事。
*1.加载驱动
* 也叫注册驱动
* Class.forName("com.mysql.jdbc.Driver")
*
*2.获取连接对象
* Connection conn = DriverManager.getConnection("url",user,password);
例如:jdbc:mysql://127.0.0.1:3306/myschool
* url - jdbc:subprotocol:subname 形式的数据库 url
- URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
- 也可认为由4部分组成:协议、主机、端口、路径
- URL的一般语法格式为:
- (带方括号[]的为可选项):
- protocol :// hostname[:port] / path / [;parameters][?query]#fragment
*3.获取sql执行器对象
* Statement 对象
* Statement statement = conn.createStatement();
*PreparedStatement(Statement的子接口)表示预编译的sql语句的对象,
*SQL 语句被预编译并存储在 PreparedStatement
对象中。然后可以使用此对象多次高效地执行该语句。
*PreparedStatement pst = conn.prepareStatement(sql);
(相对于statement执行器对象)
1.代码可读性性高,由于是预编译sql语句对象,可以设置占位符
2.解决了statement拼串造成的sql 注入安全问题
3.由于是预编译之后发送的,减轻了服务器压力,提高了程序性能
*CallableStatement(PreparedStatement 的子接口)--用于执行sql存储过程的接口
String sql = "call pro_…"
* CallableStatement cas = conn.prepareCall(sql)
*4.执行并返回处理结果
* 增删改 sql语句 executeUpdate()-->返回值为sql语句操作的数据行数,行数为0则数据库指令操作不成功
* 查询sql语句-->executeQuery()-->返回java.sql.ResultSet结果集对象,你所查询的表数据
* 用next方法判断数据库结果集中是否有下一行元素,光标最初位于第一行之前
*
*5.关闭资源
* 关闭资源的顺序,先创建的后关闭
* 增删改sql语句 ----只需要关闭连执行器(Statement/PrepareStatement)和连接对象(Connection)
* 查询 ,需要关闭ResultSet结果集对象,执行器对象(Statement/PrepareStatement)和连接对象(Connection)
package com.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** *1.加载驱动 * 也叫注册驱动 * Class.forName("com.mysql.jdbc.Driver") * *2.获取连接对象 * Connection conn = DriverManager.getConnection("url",user,password); * url - jdbc:subprotocol:subname 形式的数据库 url * *3.获取sql执行器对象 * Statement 对象 * Statement statement = conn.createStatement(); * *4.执行并返回处理结果 * 增删改 sql语句 executeUpdate()-->返回值为sql语句操作的数据行数,行数为0则数据库指令操作不成功 * 查询sql语句-->executeQuery()-->返回java.sql.ResultSet结果集对象,你所查询的表数据 * 用next方法判断数据库结果集中是否有下一行元素,光标最初位于第一行之前 * *5.关闭资源 * 关闭资源的顺序,先创建的后关闭 * 增删改sql语句 ----只需要关闭连执行器(Statement/PrepareStatement)和连接对象(Connection) * 查询 ,需要关闭ResultSet结果集对象,执行器对象(Statement/PrepareStatement)和连接对象(Connection) * @author Administrator * */ public class Test05 { public static void main(String[] args) { //1.加载驱动/注册驱动 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //2.连接对象,在捕获异常外声明该对象,后续方法关闭该对象 Connection connection = null; //3.执行器对象 ,在捕获异常外声明该对象,后续方法关闭该对象 Statement statement = null; try { //获取连接对象 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root"); System.out.println("连接数据库成功"); //获取执行器对象 statement=connection.createStatement(); //sql执行器对象用来向数据库发送sql语句,并执行sql语句,带有int返回值executeUpdate(); String sql = "update grade set gradename='9年级' where gradeid=9"; int count =statement.executeUpdate(sql); if(count>0){ System.out.println("修改成功 "); }else{ System.out.println("修改失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("数据库连接失败"); }finally{ //先创建的后关闭 try { statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }