一、JDBC相关概念的介绍
1、数据驱动
这里的驱动和我们平时听到的驱动是一样的,比如生活中的声卡直接插到计算机上是不可以用的,我们必须要给他装相应的驱动程序才可以使用,同理我们的程序如果想要操作数据库也是需要有相应的数据库驱动来对数据库进行操作.
2、JDBC介绍
不同数据库的驱动是不一样的,所以sun公司规定了一个规范(接口)来进行统一,这就是我们要学习的jdbc。JDBC的全称为Java DataBase Connectivity。
二、认识JDBC的基本类
1、DriverManager类
DriverManager用来加载数据库驱动,它用来创建与数据库的连接
注册驱动:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这种方法注册驱动并不推荐,原因是:
1、这种方法会导致程序驱动注册两次(registerDriver()一次,new com.mysql.jdbc.Driver()一次);
2、这种方法是有依赖的,我们必须导入mysql的jar包,那么他才能够通过编译,所以不利于程序的复用;
这种方法知道就好,记住下面一种的方法。
Class.forName("com.mysql.jdbc.Driver");
这种方法的好处是,参数是一个字符串,它不依赖特定的jar包,这样可以提高我们程序的灵活性。
它也不会出现注册两次驱动的问题。
DriverManager.getConnection(url,user,password);
尝试与给定数据库url的连接。
二、数据库url理解
url: jdbc:mysql://localhost:33306/student ?参数名=参数值
jdbc:协议
mysql:子协议
localhost:3309:主机/端口号
student:数据库名称
参数名也是可以不加的,主要是为了解决一些特定的问题,如编码问题等等。
不同的数据库的格式:
MySql: jdbc:mysql://localhost:3306/student
Oracle: jdbc:oracle:thin:@localhost:1521:student
SQL server: jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=student
tips:如果连接的是本地的MySQL数据库,并且端口号为3306,那么URL也可以写成:jdbc:mysql:///student
三、Connection类
它代表着数据库的连接,客户端与数据库的数据交换都是通过这个类来完成的。
--createStatement(); 创建一个Statement对象,用于将SQL语句发送到数据库
--prepareStatement();创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库;
--setAutoCommit(boolean flag);将次连接的自动提交模式更改为给定状态,默认为true;
flag=true 自动提交模式 flase:取消自动提交模式
--setSavepoint();在此事物中创建一个未命名的保存点,并返回代表他的Savepoint()对象
--rollback(Savepoint sp);回滚,撤销在给定的Savepoint后进行的室友更改
--close();释放资源.
四、Statement类
用于执行静态SQL语句并返回其生成的结果的对象。
--executeQuery(String sql); 用于执行给定的用于数据查询的静态的SQL语句,并返回单个ResultSet对象
--executeUpdate(String sql); 用于执行给定的用于数据更新的静态的SQL语句。
--addBatch(); 将一批命令添加Statement对象当前的命令列表中,该方法可以调用 executeBatch();来执行操作
--executeBatch(); 将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。 返回的数组的int
元素被排序以对应于批次中的命令,这些命令根据它们添加到批处理的顺序进行排序。
--close();释放资源.
五、PreparedStatement类(extends Statement)
SQL语句已预编译并存储在PreparedStatement
对象中。 然后可以使用该对象多次有效地执行此语句。
--executeQuery(String sql);执行PreparedStatement对象中的查询SQL语句,并返回一个ResultSet对象
--executeUpdate(String sql);执行PreparedStatement对象中的更新SQL语句。
--addBatch();向PreparedStatement的一批命令中添加一组参数
--executeBatch();执行一批命令,并且返回一个更新计数的数组
--setObject(int parameterIndex,Object x);给指定对象设置指定的值(可以用于任意基本类型)
parameterIndex:第几个问号 从1开始
SQL语句:insert into students(ID,password,mail) values(?,?,?);
example:ps.setString(1,"luther"); 设置了ID的对应值 .
--close();释放资源.
五、ResultSet类
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet对象保持有一个光标指向当前的数据行,最初光标处于数据表的第一行之前,通过next方法来移动光标,当光标到达最后一行时,下面没有更多行的时候,返回一个false,所以可以用while循环遍历数据表。
--absolute(int row);将光标移动到指定行
--beforeFirst();将光标移动到第一行之前
--afterLast();将光标移动到最后一行之后
--first();将光标移动到第一行
--after();将光标移动到最后一行
--next();将光标从当前位置移动到下一行
--previous();将光标从当前位置移动到上一行
--refreshRow();用数据库中的数据刷新当前行
--close();释放资源.
获取当前光标指向的行中的任意一个数据
--getObject(String columnLabel) columnLabel 数据表中的列名
--getObject(int columnInex) columnIndex 数据表中的位置
Obejct可以改成任意的基本数据类型
六、释放资源
当jdbc使用完时,一定要及时的关闭资源,Connection应当更加注意它是非常稀有的资源,一定不可以忘记.
三、程序实例
这里只是写了简单的jdbc的操作,改的动作就不再这呈现了,自己可以试一试。这里的包就不分那么清楚了,我们在写程序的时候,还是要规范好自己的格式!!!
1、User
package com.luther.jdbc;
public class User {
private String ID;
private String password;
private String name;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、userDaoI
这里是接口,我的习惯是在后面加上I来表示接口。
package com.luther.jdbc;
import java.sql.SQLException;
public interface UserDaoI {
void insertUser(User user) throws SQLException;
User queryUser(String ID,String password);
void deleteUser(String ID);
}
3、JdbcTools
这个步骤其实应该是在第一步就要实现,以为我们在获取连接的时候的动作都是一样的,所以我们可以把他单独的封装在一个工具包中,在我们以后需要使用的时候,可以直接拿来使用.
package com.luther.jdbc;
import java.sql.*;
public class JdbcTools {
private JdbcTools(){}
private static String url="jdbc:mysql://localhost/user?useSSL=false";
private static String user="root";
private static String password="158283";
private static Connection conn;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn(){
try {
conn=DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void free(Connection conn, PreparedStatement ps, ResultSet rs){
try {
if(rs!=null){
rs.close();
}
}catch (SQLException e){
throw new RuntimeException(e);
}finally {
try{
if (ps!=null){
ps.close();
}
}catch (SQLException e){
throw new RuntimeException(e);
}finally {
try {
if (conn != null) {
conn.close();
}
}catch (SQLException e){
throw new RuntimeException(e);
}
}
}
}
}
4、接口的实现
package com.luther.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImple implements UserDaoI{
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
@Override
public void insertUser(User user) throws SQLException {
conn=JdbcTools.getConn();
String sql="insert into userinfo(ID,password,name) values(?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1,user.getID());
ps.setString(2,user.getPassword());
ps.setString(3,user.getName());
ps.executeUpdate();
JdbcTools.free(conn,ps,rs);//这里的异常处理应该try出来,释放资源也应该放到finally里面
}
@Override
public User queryUser(String ID, String password) {
conn=JdbcTools.getConn();
String sql="select * from userinfo where ID=? and password=?";
try{
ps=conn.prepareStatement(sql);
ps.setString(1,ID);
ps.setString(2,password);
rs=ps.executeQuery();
User user=new User();
user=get(rs);
return user;
}catch (SQLException e){
throw new RuntimeException(e);
}finally {
JdbcTools.free(conn,ps,rs);
}
}
public User get(ResultSet rs) throws SQLException {
User user = new User();
while (rs.next()) {
user.setID(rs.getString("ID"));
user.setPassword(rs.getString("password")); //也可以尝试用位置来获取数据
user.setName(rs.getString("name"));
}
return user;
}
@Override
public void deleteUser(String ID) {
conn=JdbcTools.getConn();
String sql="delete from userInfo where ID=?";
try {
ps = conn.prepareStatement(sql);
ps.setString(1,ID);
ps.executeUpdate();
}catch (SQLException e){
throw new RuntimeException(e);
}finally {
JdbcTools.free(conn,ps,rs);
}
}
}
5、数据库的查找,添加,删除。
package com.luther.jdbc;
public class domain {
private static UserDaoImple udi=new UserDaoImple();
private static User user=new User();
public static void main(String[] args) throws Exception{
// add();
// String ID="158283";
// String password="666666";
// user=find(ID,password);
// System.out.println("Name:"+user.getName());
String ID="158283";
delete(ID);
}
static void delete(String ID){
udi.deleteUser(ID);
System.out.println("你已经成功的删除了");
}
static User find(String id,String password){
return udi.queryUser(id,password);
}
static void add()throws Exception{
user.setID("158283");
user.setPassword("666666");
user.setName("luther");
udi.insertUser(user);
}
}
总结一下数据库的操作的步骤:
1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
2、建立连接
Connction conn=DriverManager.getConnection(url,user,password);
3、准备SQL语句
String sql="insert into userinfo values(?,?,?);
4、创建PreparedStatement对象并给参数赋值
PreparedStatement ps=conn.preparedStatement(sql); //这里别忘记把sql语句写进来
ps.setString(1,"要赋的值");
5、执行SQL语句
ps.executeUpdate();
6、释放连接!!!