下文每一步很细节 按照步骤一步步实现,没有过多的口水话 纯干货。
什么叫JDBC?
全称 Java DataBase Connectivity java数据库连接
为什么要用它 :
这是sum公司为Java提供的一种规范 规则访问数据库。
流程图:
Java代码Test:
先建立项目
建立MianTest类->建立lib page->导入mysql驱动->add build path
完成结构如下图:
第一步:注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
第二步:建立连接
Connection conn=(Connection) DriverManager.getConnection(url, user, password);
第三步:创建statment 对象与数据库打交道 一定要有这个对象
Statement st=(Statement) conn.createStatement();
第四步:执行查询语句
ResultSet rS=st.executeQuery(sql); while(rS.next()) { String name=rS.getString("name"); String sex=rS.getString("sex"); System.out.println("姓名"+name+"性别"+sex); }
第五步:关闭连接
rS.close(); conn.close(); st.close();
运行结果如下:
附完整代码:
package com.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.sql.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class MianTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String user="root";
String password="123456";
String url="jdbc:mysql://localhost/users?useUnicode=true&characterEncoding=utf8";
String sql="select * from peopel";
try {
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//建立连接
Connection conn=DriverManager.getConnection(url, user, password);
//创建statment与数据库打交道 一定需要这个对象
Statement st=(Statement) conn.createStatement();
//执行查询
ResultSet rS=st.executeQuery(sql);
while(rS.next()) {
String name=rS.getString("name");
String sex=rS.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
rS.close();
conn.close();
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
继续优化:
package com.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.sql.Connection;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class MianTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String user="root";
String password="123456";
String url="jdbc:mysql://localhost/users?useUnicode=true&characterEncoding=utf8";
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//建立连接
conn=DriverManager.getConnection(url, user, password);
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
}
释放资源我们新建一个page 一个JDBCutil class:
package com.jdbc.util;
import java.io.Closeable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public class JDBCutil {
public static void release(ResultSet rs, Statement st,Connection conn) {
CloseRs(rs);
CloseRs(st);
CloseConn(conn);
}
private static void CloseConn(Connection conn) {
// TODO Auto-generated method stub
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
conn=null;
}
}
}
private static void CloseRs(Statement st) {
// TODO Auto-generated method stub
if (st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
st=null;
}
}
}
private static void CloseRs(ResultSet rs) {
// TODO Auto-generated method stub
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
rs=null;
}
}
}
}
为了防止驱动二次注册我们把注册驱动改为:
//注册驱动
Class.forName("com.mysql.jdbc.Driver()");
//静态代码块--》类加载就执行
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
完整代码:
package com.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.sql.Connection;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class MianTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String user="root";
String password="123456";
String url="jdbc:mysql://localhost/users?useUnicode=true&characterEncoding=utf8";
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver()");
//静态代码块--》类加载就执行
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//建立连接
conn=DriverManager.getConnection(url, user, password);
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
}
在继续把JDBCutil作为一个专业的工具类 所有我们把他放到方法里面去调用:
package com.jdbc.util;
import java.io.Closeable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public class JDBCutil {
static String user="root";
static String password="123456";
static String url="jdbc:mysql://localhost/users?useUnicode=true&characterEncoding=utf8";
public static Connection getConn() {
Connection conn=null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//静态代码块--》类加载就执行
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//建立连接
conn=DriverManager.getConnection(url, user, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/*释放资源*/
public static void release(ResultSet rs, Statement st,Connection conn) {
CloseRs(rs);
CloseRs(st);
CloseConn(conn);
}
private static void CloseConn(Connection conn) {
// TODO Auto-generated method stub
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
conn=null;
}
}
}
private static void CloseRs(Statement st) {
// TODO Auto-generated method stub
if (st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
st=null;
}
}
}
private static void CloseRs(ResultSet rs) {
// TODO Auto-generated method stub
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
rs=null;
}
}
}
}
package com.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.sql.Connection;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class MianTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
}
实际上我们应该从配置文件里面读取数据库连接地址等:
创建file-文本取名jdbc.properties
(注意这个文件会根据你写代码的不同所放置的位置不同,这里我把它放在src路径下面 InputStream is=JDBCutil.class.getClassLoader().getResourceAsStream("jdbc.properties")
;
获取当前类的jdbc.properties)
driverClass=com.mysql.jdbc.Driver
user=root
password=123456
url=jdbc:mysql://localhost/users?useUnicode=true&characterEncoding=utf8
完整代码如下:
package com.jdbc.util;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Statement;
public class JDBCutil {
static String name=null;
static String password=null;
static String url=null;
static String driverClass=null;
static {
try {
//创建一个属性配置对象
Properties properties=new Properties();
//InputStream is=new FileInputStream("jdbc.properties");
InputStream is=JDBCutil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//导入输入流
properties.load(is);
//读取属性
driverClass=properties.getProperty("driverClass");
name=properties.getProperty("name");
url=properties.getProperty("url");
password=properties.getProperty("password");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn() {
Connection conn=null;
try {
//注册驱动
Class.forName(driverClass);
//静态代码块--》类加载就执行
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//建立连接
conn=DriverManager.getConnection(url, name, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/*释放资源*/
public static void release(ResultSet rs, Statement st,Connection conn) {
CloseRs(rs);
CloseRs(st);
CloseConn(conn);
}
private static void CloseConn(Connection conn) {
// TODO Auto-generated method stub
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
conn=null;
}
}
}
private static void CloseRs(Statement st) {
// TODO Auto-generated method stub
if (st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
st=null;
}
}
}
private static void CloseRs(ResultSet rs) {
// TODO Auto-generated method stub
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
rs=null;
}
}
}
}
package com.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.sql.Connection;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;
public class MianTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
}
整个工程类写完成,但是这里其实还是有一个小细节就是jdbc中如果读下他的源代码 会发现有一条是说在jdbc4.0后 其实可以注释掉注册驱动 我们可以:
// Class.forName(driverClass);
感兴趣的可以动手试下 文档里面说好像在connection其实已经自动注册了
这样注释掉也可以运行,并且获取数据库的值也没有错。
剩下回顾数据库的增删该查:
*insert
"INSERT INTO peopel VALUES(10,'wangwu',18,'男','2018-12-5',151515,253)"
*delete
"delete from peopel where name='zhangsan'";
*query
"select * from peopel"
*update
"update peopel set age=26 where name='waner'";
Junit单元测试
以jdbc作为例子
先建立一个类 一般类名以test开头+你要测试的方法,这里测试查询方法再把mian里面的方法copy过来结果如下图:
在作添加:鼠标右键->build path->configure build path->libraies->add library->Junit ok!
右键run as 可以看见一个Junit 选中运行 会出现一下两种结果:
代码没问题结果不知道:
或者直接报错:
改过来 运行没错输出结果:
**注意:加上@Test **
详细代码如下:
package com.jdbc.test;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Statement;
public class TestDemo {
//
// 使用junit执行单元测试
//
@Test
public void testQuery() {
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
}
接下来把增删改查都去实现他:
代码如下
package com.jdbc.test;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import com.jdbc.util.JDBCutil;
import com.mysql.jdbc.Statement;
public class TestDemo {
//
// 使用junit执行单元测试
//
@Test
//SQL查询
public void testQuery() {
String sql="select * from peopel";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
rs=st.executeQuery(sql);
while(rs.next()) {
String name=rs.getString("name");
String sex=rs.getString("sex");
System.out.println("姓名:"+name+"性别:"+sex);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release(rs, st, conn);
}
}
@Test
//SQL增加
public void testIsert() {
String sql="INSERT INTO peopel VALUES(10,'wangwu',18,'男','2018-12-5',151515,253)";
Connection conn=null;
Statement st=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
int resultset =st.executeUpdate(sql);
if (resultset>0) {
System.out.println("添加成功");
}
if (resultset<0) {
System.out.println("添加失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release( st, conn);
}
}
//SQL修改
@Test
public void testUpdate() {
String sql="update peopel set age=26 where name='waner'";
Connection conn=null;
Statement st=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
int resultset =st.executeUpdate(sql);
if (resultset>0) {
System.out.println("更新成功");
}
if (resultset<0) {
System.out.println("更新失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release( st, conn);
}
}
//SQL删除
@Test
public void testDelete() {
String sql="delete from peopel where name='zhangsan'";
Connection conn=null;
Statement st=null;
try {
conn=JDBCutil.getConn();
//创建statment与数据库打交道 一定需要这个对象
st=(Statement) conn.createStatement();
//执行查询
int resultset =st.executeUpdate(sql);
if (resultset>0) {
System.out.println("删除成功");
}
if (resultset<0) {
System.out.println("删除失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCutil.release( st, conn);
}
}
}
各个方法可在eclipse中单个测试:
总体流程图 第一张画得不像:
(附三张图片供理解)