[数据库操作]Java中的JDBC的使用方法.

时间:2023-03-08 18:20:02
[数据库操作]Java中的JDBC的使用方法.

前言:
想必大家在实际编码中都遇到过JDBC的操作, 这里仅做自己的一个总结, 有错误和不完整之处还请大家提出来.

1,JDBC其实一套规范(接口)
数据库厂商需要实现此接口(实现类)--数据库驱动

2,jdbc的作用:
可以和数据库创建链接
发送sql语句
接收返回值,处理结果

3,api详解(java.sql或者javaX.sql)

DriverManager 类:
  管理一组 JDBC 驱动程序的基本服务。
  常用方法:
    registerDriver(Driver):注册驱动
      查看 mysql的Driver的时候有下面一段代码:
              [数据库操作]Java中的JDBC的使用方法.
           发现在类加载的时候已经注册过驱动,我们以后只需要把Driver加载到内存即可
        类.Class
        对象.getClass()
        Class.forName("全限定名(包名+类名)")
        以后开发中我们通过Class.forName("com.mysql.jdbc.Driver")把驱动注册进去即可.  
      static Connection getConnection(String url, String user, String password) :获取链接
        参数说明:
          url:告诉jdbc去连接那个数据库
          固定格式: 协议:子协议:子协议名称 参数
          mysql: jdbc:mysql ://localhost:3306/databaseName
          oracle: jdbc:oracle:thin :@localhost:1521:实例名
          user:数据库的登录名
          password:数据库的登录密码

  Connection 接口:
    创建语句执行者:
      Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "root", "123456");

  常用方法:
    Statement createStatement():创建Statement -语句执行者
    PreparedStatement prepareStatement(String sql) :创建一个预编译的语句执行对象
    CallableStatement prepareCall(String sql) :(了解) 创建一个 CallableStatement 对象来调用数据库存储过程。

  Statement 接口(容易产生sql注入, 后期使用PreparedStatement. 后面会有blog说明这个问题)
    sql语句执行者:
      Statement st=conn.createStatement();

    常用方法:
      ResultSet executeQuery(String sql) :执行查询语句,返回一个集合 ☆
      int executeUpdate(String sql) :执行更新 插入 删除语句,返回影响行数.☆
      boolean execute(sql):执行给定的 SQL 语句,该语句可能返回多个结果。
        若返回true ,执行是的查询语句
        调用 getResultSet 获取查询结果
        若返回false,执行的是更新 插入 删除语句
        调用 getUpdateCount 获取影响的行数

  ResultSet 接口
    返回的查询结果:
      String sql = "...";
      ResultSet rs=st.executeQuery(sql);

    常用方法:
      boolean next() :判断是否有下一条记录,并且移动到下一行
      获取内容:
        getXXX(参数)
      参数的写法:
        1.字段名称 字符串
        2.第几列 从1开始
          getInt()
          getString()
          getObject()

4, 实例JDBCUtil类的书写
(1)配置文件 jdbc.properties

drivername=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ddatabaseName
user=root
password=1234

(2)JDBCUtil.java

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle; public class JDBCUtil {
//ctrl + shift + x 转成大写
//ctrl + shift + y 转成小写
static final String DRIVERNAME;
static final String URL;
static final String USERNAME;
static final String PASSWORD; static{ /*通过ResourceBundle 专门用来加载properties文件
ResourceBundle bundle=ResourceBundle.getBundle("文件名称"); 通过 bundle.getString(键的名字)
String value=bundle.getString("url");
*/ ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
DRIVERNAME=bundle.getString("drivername");
URL=bundle.getString("url");
USERNAME=bundle.getString("user");
PASSWORD=bundle.getString("password");
} static{
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} //获取链接
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(URL,USERNAME,PASSWORD);
} //释放资源
public static void closeResource(Connection conn,Statement st,ResultSet rs){
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
}

(3)CRUDDemo, 使用PreparedStatement方式

 public class PPCRUDDemo {
public static void main(String[] args) {
//插入
//insert("赵四","123","zhaosi@163.com");
//更新
//updateByName("赵四","尼古拉斯.赵四");
//获取
//getByName("尼古拉斯.赵四");
//删除
deleteByName("尼古拉斯.赵四");
} private static void deleteByName(String string) {
//模版
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null; try {
//获取链接
conn=JDBCUtil.getConnection();
//编写sql
String sql="delete from user where username =?";
//获取预编译执行者
st=conn.prepareStatement(sql);
//设置参数
st.setString(1, string);
//执行sql
int i = st.executeUpdate();
//处理结果
if (i>0) {
System.out.println("成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
JDBCUtil.closeResource(conn, st, rs);
} } private static void getByName(String string) { Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null; try {
conn=JDBCUtil.getConnection();
String sql="select * from user where username=? limit 1";
st=conn.prepareStatement(sql); st.setString(1, string);
rs=st.executeQuery();
if (rs.next()) {
System.out.println(rs.getInt(1)+":"+rs.getString(2)+":"+rs.getObject(3)+":"+rs.getObject(4));
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{ JDBCUtil.closeResource(conn, st, rs);
} } private static void updateByName(String oldName, String newName) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null; try {
conn=JDBCUtil.getConnection();
String sql="update user set username = ? where username = ?";
st=conn.prepareStatement(sql);
st.setString(1, newName);
st.setString(2, oldName); int i=st.executeUpdate();
//处理结果
if (i>0) {
System.out.println("成功");
}else{
System.out.println("失败");
} } catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.closeResource(conn, st, rs);
} } private static void insert(String username, String password, String email) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null; try {
//获取链接
conn=JDBCUtil.getConnection();
//编写sql
String sql="insert into user values(null,?,?,?)";
//获取预编译语句执行者
st=conn.prepareStatement(sql);
//设置参数
st.setString(1, username);
st.setString(2, password);
st.setString(3, email);
//执行sql
int i=st.executeUpdate();
//处理结果
if (i>0) {
System.out.println("成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.closeResource(conn, st, rs);
}
} }

这里没有多么高深的东西, 熟能生巧, 暂时总结的就这么多.