JDBC (Java Database Connectivity)
jdbc是java连接数据库(databases)的连接,通过java语言对数据中的数据信息进行访问,从而连接前端和后端进行信息的交互;数据库也是平常用于java的连接与获取相关信息
在Java和database的连接的过程中会使用相关的驱动;对应的数据库有对应的驱动,比如说你是用mysql数据库,那就要使用mysql相关的驱动,对应还有orale的相关驱动。无论是java语言 sun公司 还是数据库厂商 其实对于语言和数据库之间的连接 都具有相应的支持。
将使用的数据库的驱动导入到工程下,重新构建路径,将驱动加载,就可以连接数据库了。
1.获取数据库驱动的方式 3种 推荐使用
第一种 :DriverManager.deregisterDriver(new com.mysql.jdbc.Driver());
第二种 :System.setProperty("jdbc", "com.mysql.jdbc.Driver");
第三种 :Class.forName("com.mysql.jdbc.Driver");
其中第三种为推荐使用类型(将mysql驱动注册到DriverManager中去)com.mysql.jdbc.Driver是mysql对应的驱动;
将"com.mysql.jdbc.Driver" 当做参数传入,就是告诉JVM,去"com.mysql.jdbc"这个路径下找Driver类,将其加载到内存中。将驱动加载到内存中;
注册的DriverManager中之后,我们就可以 通过DriverManager的getConnection方法获得mysql的连接了;
通过DriverManager获取连接对象
// 产生连接
Connection conn = DriverManager.getConnection(url, user, password);
在产生连接的过程时,需要将产生连接的所需要的东西,DriverManager.getConnection(url, user, password),中有三个参数,分别是url,user,password; url是连接数据库的路径( “jdbc:mysql://localhost:3306/javademo?”)localhost是本机的地址,3306是数据库的 端口号,后面接数据库的名字,user 对应的一般是root,password对应的是进入数据库的密码;通过这三样可以进行数据的获取连接。获取连接之后就可以进行相关的操作了;
在获取连接之后就可以进行数据库的执行了
在获取连接之后,就可以通过连接对象对数据库语句进行执行,
//执行sql 语句
Statement st = conn.createStatement();
String sql = "select * from tb1"; //要执行的sql语句
// 结果集装sql产物
ResultSet rs = st.executeQuery(sql);`
通过连接对象调用createStatement方法获取执行对象statement;
statement对象再掉用executeQuery(sql)方法,将要执行 的语句放进去;就能得到一个装有sql产物的结果集,通过对结果集的分析就可以取出来数据库中的数据,
对结果集进行遍历可以得到数据库中的信息;
ResultSet rs = st.executeQuery(sql);
//st.executeUpdate(sql); 添加记录 修改记录 删除记录
while(rs.next()){
System.out.println(rs.getInt("id")+"\t"+rs.getString("Username")+"\t"+rs.getDouble("Salary"));
}
讲数据库中的数据字段填写到对应的类型信息;
在获取结束后可以将对应的连接资源关闭,在虚拟机中,数据库的连接资源是非常稀有的,在用完之后要立即释放;
//关闭数据库资源
conn.close();
st.close();
rs.close();
以上就是连接数据库的所有步骤了;
public class BaseJDBCTest {
public static void main(String[] args) throws Exception {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
// 加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取连接对象---产生连接
Connection conn = DriverManager.getConnection(url,user,password);
//获取statment对象
Statement st=conn.createStatement();
//执行sql语句----查询--产生结果集
ResultSet rs = st.executeQuery("select * from 表名");
while(rs.next()) {
System.out.println(rs.getInt("id")+rs.getString("name")+rs.getString("password")); //表中的对应字段
}
rs.close();
st.close();
conn.close();
}
}
2.数据库简易优化
在上面的连接数据库中我们将数据库的密码和数据库名还有驱动的相关配置写在程序里;极大程度上不利于程序的操作,试想一下,如果有一天你换密码了,换数据库了,换驱动了;那还要对程序进行更改,如果是小的程序还好,那是 大的 呢,所以在优化之后我们通过配置文件 从外部将相关信息进行读入;
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/xxxx
user=root
password=xxxx
我们将相关信息写到配置文件中,如果要更改,只需更改配置文件即可,不用动程序;
我们通过properties和反射的联合使用获取配置文件的相关信息;
static {
try {
Properties properties = new Properties();//创建properties 对象
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(in);//加载资源文件
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");//获取对应信息;
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
对于创建连接和关闭资源,我们可以写成方法,便于调用;
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
在这里我们将url, user, password,作为全变量来使用,直接返回一个连接对象;
在其他的方法中可以通过掉用这个方法获取连接
public void select(String sql) {
try {
conn = getConnection(); //获取连接
st = conn.createStatement(); //执行对象
rs = st.executeQuery(sql);//获取结果集
/*
while(rs.next){
System.out.println(rs.getInt("id")+rs.getString("usrname"));
//打印结果集;相关操作;
}
*/
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, st, rs);
}
return object;
}
关闭连接资源:
public static void close(Connection conn, Statement st, ResultSet rs) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
由于三个连接的先后顺序,根据顺序关闭;在try -catch-finally中在finally模块中的代码一定会执行:
最后全部奉上:
public abstract class JDBCUtil {
public Connection conn = null;
public Statement st = null;
public ResultSet rs = null;
public static String driver = null;
public static String url = null;
public static String user = null;
public static String password = null;
static {
try {
Properties properties = new Properties();
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
//通过id单条查询语句
public Object findbyone(String sql) {
Object object=null;
try {
conn = JDBCUtil.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
object = toObject(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, st, rs);
}
return object;
}
//增删改通用语句
public void update(String sql) {
try {
conn = JDBCUtil.getConnection();
st = conn.createStatement();
int n = st.executeUpdate(sql);
System.out.println(n);
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, st, rs);
}
}
public static void close(Connection conn, Statement st, ResultSet rs) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}