java程序与数据库的连接(增删改查)

时间:2021-04-21 19:24:30

一个网络关系数据库应用系统是一个三层次结构。客户机与服务器采用网络连接,客户机端应用程序按通信协议与服务器端的数据库程序通信;数据库服务程序通过SQL命令与数据库管理系统通信。

数据库工程的建立:

1.工程名右击>new folder(lib)>复制mysql-connector-java-5.1.40-bin.jar

2.工程名右击 > properties > java Build Path > Libraries > Add JARS...

设置数据库权限:

GRANT all privileges ON *.* TO 'test '@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
      all privileges:所有权限
      select detele update create drop等:其他权限
      第一个*:表示所有数据库
     第二个*:表示所有表

       Java程序与数据库连接方法有两种:
、使用JDBC-ODBC桥接器与数据库连接,
、用纯Java的JDBC驱动程序实现与数据库连接。

     一、  Java程序使用JDBC-ODBC 桥接器与数据库连接,Java程序与数据库通信的过程:

 1.由数据库应用程序向ODBC驱动管理器发出API调用,

 2.ODBC驱动管理器将这个调用转换成向数据库管理系统的ODBC驱动程序调用,

  3.数据库管理系统又将这个调用转换成对操作系统的数据输入/输出调用。

  4.操作系统从数据库中得到实际数据逐级返回。

     数据库编程首先要设置数据源,在ODBC中设置数据源的步骤如下:
打开Windows控制面板中的管理工具。对于windows XP:选择“性能维护”>>“管理工具”>>“数据源(ODBC)”; 对于windows 2000:选择“管理工具”>>“数据源”。
打开“数据源”。出现ODBC数据源管理器对话框,显示现有的数据源名称。
选择“用户DSN”,单击“添加”按钮,出现安装数据源驱动程序对话框。Access(*.mdb)数据源,单击“完成”按钮,出现“创建数据源对话框,键入需要创建的数据源名,并为创建的数据源选择一个数据库表。
单击数据库区域的“选择”按钮,选择需要的数据库表。当需要为数据源授权访问级别时,单击“高级”按钮。设置登录名和密码后,单击“确定”按钮,完成Access数据库在ODBC管理器中的配置。
如果还没有数据库表,则需创建一个数据库表。

数据源就是数据库,在设定了数据源的基础上,Java程序要访问数据库表,还要建立JDBC-ODBC桥接器,让程序与数据库连接。以后,程序就可向数据库发送SQL语句,处理数据库返回的结果。
Java数据库连接JDBC(Java DataBase Connectivity)由一组用Java语言编写的类和接口组成,JDBC是Java程序与数据库连接API。它能做以下三件事情:1.与某个数据库建立连接;2.向数据库发送SQL语句;3.处理数据库返回的结果。


    二、Java程序也可以用纯Java的JDBC驱动程序实现与数据库连接。需要下载相应的驱动程序包,不同的数据库的连接代码可能不同,连接不同的数据库,加载的驱动程序也可能不同。
例如,连接SQLServer的驱动程序在www.msdn.com网站下载,有3个包:msbase.jar,mssqlserver.jar和msutil.jar,并要求将这3个包放在jdk\jre\lib\ext\目录下,或在CLASSPATH中设置其放置位置。
连接MySQL的驱动程序,1个包:mysql-connector-java-3.1.11-bin.jar


加载驱动程序。有两种加载驱动程序的方式:
1.将驱动程序添加到java.lang.System的属性jdbc.drivers中。这是一个DriverManager类加载驱动程序类名的列表,表元用冒号分隔。
2.从相关的网站下载驱动程序后,在程序中利用Class.forName()方法加载指定的驱动程序。如:

Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
Class.forName("com.mysql.jdbc.Driver");//加载特定的驱动程序

创建指定数据库的URL。数据库的URL对象类似网络的统一资源定位符,其格式是:
subprotocol:subName://hostName:port/DatabaseName
其中,subprotocol是某种驱动程序支持的数据库连接机制; subName是当前连接机制下的具体名称;hostName是主机名;port是相应的连接端口;DatabaseName是要连接的数据库名称。例如,以下代码可以是一个数据库的URL:

jdbc:Microsoft:sqlserver://localhost:1433;Databasename=ksinfo
jdbc:mysql://localhost:3306/数据库名

该数据库的URL说明利用miscrosoft提供的机制,用sqlserve驱动,通过1433端口访问本机上的ksInfo数据库。

建立连接。驱动程序管理器(DriverManager)的方法getConnection()建立连接。


编写访问数据库的Java程序还需要几个重要的类和接口。

DriverManager类处理驱动程序的加载和建立新数据库连接。DriverManager是java.sql包中用于管理数据库驱动程序的类。通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象:
static Connection getConnection(String url,String username,String password)
指定数据的URL用户名和密码创建数据库连接对象。url的语法格式是:jdbc:<数据库的连接机制>:<ODBC数据库名>。

Connection类是java.sql包中用于处理与特定数据库连接的类。Connection对象是用来表示数据库连接的对象,Java程序对数据库的操作都在这种对象上进行。Connection类的主要方法有:

Statement createStatement():创建一个Statement对象。
Statement createStatement(int resultSetType,int resultSetConcurrency):创建一个Statement对象,生成具有特定类型的结果集。
void commit():              提交对数据库的改动并释放当前持有的数据库的锁。
void rollback():              回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。
String getCatalog():          获得连接对象的当前目录。
boolean isClose():            判断连接是否已关闭。
boolean isReadOnly():         判断连接是否为只读模式。
void setReadOnly():           设置连接为只读模式。
void close():                   释放连接对象的数据库和JDBC资源。

Statement类是java.sql包中用于在指定的连接中处理SQL语句的类。数据库编程的要点是在程序中嵌入SQL命令。程序需要声明和创建连接数据库的Connection对象,并让该对象连接数据库。调用类DriverManager的静态方法getConnection()获得Connection对象,实现程序与数据库的连接。然后,用Statement类声明SQL语句对象,并调用Connection对象的createStatement()方法,创建SQL语句对象。例如,以下代码创建语句对象statement :Statement statement = connect.createStatement();

有了SQL语句对象后,调用语句对象的方法executeQuery()执行SQL查询,并将查询结果存放在一个用ResultSet类声明的对象中,例如,以下代码读取课程表存于rs 对象中:
sql = "select * from coursetable";
ResultSet rs = statement.executeQuery(sql);

ResultSet对象实际上是一个由查询结果数据的表,是一个管式数据集,由统一形式的数据行组成,一行对应一条查询记录。在ResultSet对象中隐含着一个游标,一次只能获得游标当前所指的数据行,用next方法可取下一个数据行。用数据行的字段(列)名称或位置索引(自1开始)调用形如getXXX()方法获得记录的字段植 。以下是ResultSet对象的部分方法:

byte getByte(int columnIndex):       返回指定字段的字节值。
Date getDate(int columnIndex):       返回指定字段的日期值。
float getFloat(int columnIndex):        返回指定字段的浮点值。
int getInt(int columnIndex):            返回指定字段的整数值。
String getString(int columnIndex):        返回指定字段的字符串值。
double getDouble(String columnName):返回指定字段的双精度值。
long getLong(String columnName):      返回指定字段的long型整值。
boolean next():返回是否还有下一字段。

以上方法中的columnIndex是位置索引,用于指定字段,columnName是字段名。

用户需要在查询结果集上浏览,或前后移动、或显示结果集的指定记录,这称为可滚动结果集。程序要获得一个可滚动结果集,只要在获得SQL的语句对象时,增加指定结果集的两个参数即可。如:

Statement stmt = con.createStatement(type,concurrency);
ResultSet rs = stmt.executeQuery(SQL语句)
语句对象stmt的SQL查询就能得到相应类型的结果集。
int 型参数type决定可滚动集的滚动方式:
ResultSet.TYPE_FORWORD_ONLY,结果集的游标只能向下滚动。
ResultSet.TYPE_SCROLL_INSENSITIVE,游标可上下移动,当数据库变化时,当前结果集不变。
ResultSet. TYPE_SCROLL_SENSITIVE,游标可上下移动,当数据库变化时,当前结果集同步改变。
int 型参数concurrency决定数据库是否与可滚动集同步更新:
ResultSet.CONCUR_READ_ONLY,不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATETABLE,能用结果集更新数据库中的表。

以下代码利用连接对象connect,创建Statement对象stmt,指定结果集可滚动,并以只读方式读数据库:
stmt = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
可滚动集上另外一些常用的方法如下:

boolean previous():            将游标向上移动,当移到结果集的第一行时,返回false。
void beforeFirst():             将游标移结果集的第一行之前。
void afterLast():               将游标移到结果集的最后一行之后。
void first():                       将游标移到第一行。
void last():                        将游标移到最后一行。
boolean isAfterLast():           判游标是否在最后一行之后。
boolean isBeforeFirst():          判游标是否在第一行之前。
boolean isLast():                判游标是否在最后一行。
boolean isFirst():                判游标是否在第一行。
int getRow():                     获取当前所指的行(行号自1开始编号,结果集空,返回0)。
boolean absolute(int row):   将游标移到row行。

package cn.db.day01;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//import com.mysql.jdbc.Connection;

public class DBConnectDemo {

public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");//加载mysql驱动

String url = "jdbc:mysql://192.168.5.17:3306/db16";
String user = "test";
String password = "123321";

//Connection connect = (Connection) DriverManager.getConnection(url, user, password);
Connection connect = DriverManager.getConnection(url, user, password);

if(connect ==null){
System.out.println("数据库连接失败");
}else{
System.out.println("数据库连接成功");
}

Statement statement = connect.createStatement();//发送sql语句到数据库执行
/**
* 创建表
*/
String s ="DROP TABLE IF EXISTS `coursetable`";//如果存在表,就删除表
statement.execute(s);

String sql = "create table coursetable ("
+ "id int(11) not null auto_increment primary key," //主键
+ "course_name varchar(10) not null," //课程名
+ "course_number int(10) not null," //课程编号
+ "course_description varchar(255)," //描述
+ "course_time int(10) default 100 " //课时
+ ")";
statement.execute(sql);

/**
* 增
*/
String[] a = new String[5];
a[0] ="insert into coursetable (course_name,course_number,course_description)values('java',1001,'java软件开发学习')";
a[1] ="insert into coursetable (course_name,course_number,course_description)values('ios',1002,'ios软件开发学习')";
a[2] ="insert into coursetable (course_name,course_number,course_description)values('安卓',1003,'安卓软件开发学习')";
a[3] ="insert into coursetable (course_name,course_number,course_description)values('ui',1004,'UI设计')";
a[4] ="insert into coursetable (course_name,course_number,course_description)values('前端',1005,'前端开发')";
for(int i = 0;i<a.length;i++){
statement.execute(a[i]);
}

/**
* 删除
*/
sql = "delete from coursetable where course_name = 'ios'";
statement.execute(sql);

/**
* 改
*/
sql = "update coursetable set course_name = 'andriod' where course_name = 'ios'";
statement.execute(sql);
//int row = statement.executeUpdate(sql);//返回更新记录条数
//System.out.println(row);

/**
* 查
*/
sql = "select * from coursetable";
ResultSet rs = statement.executeQuery(sql);//返回结果集

System.out.println("id\tcourse_name\tcourse_number\tcourse_time\tcourse_description");
while(rs.next()){
int id = rs.getInt(1);//游标:1可以改为"id",下面同理
String name = rs.getString("course_name");
int number = rs.getInt("course_number");
String descript = rs.getNString("course_description");
int time = rs.getInt("course_time");
System.out.println(id+"\t"+name+"\t"+number+"\t"+time+"\t"+descript);
}
statement.close();
connect.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

package cn.db.day01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 对DBConnectDemo的封装
*/
public class CourseDB {
private static final String URL = "jdbc:mysql://192.168.5.17:3306/db16";
private static final String USER = "test";
private static final String PASSWORD = "123321";
/**
* 单例模式
*/
private static CourseDB CDB = new CourseDB();
public static CourseDB getInstance(){
if(CDB == null){
CDB = new CourseDB();
}
return CDB;
}
/**
* 构造方法加载驱动
*/
private CourseDB() {
try {
Class.forName("com.mysql.jdbc.Driver");// 加载mysql驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 建立连接数据库
*/
public Connection getConnection() {
Connection connect = null;
try {
connect = DriverManager.getConnection(URL, USER, PASSWORD);
if (connect == null) {
System.out.println("数据库连接失败");
} else {
System.out.println("数据库连接成功");
}
} catch (SQLException e) {
e.printStackTrace();
}
return connect;
}

/**
* 关闭数据库连接
*/
public void closeConnection(Connection connect) {
try {
if (connect != null)
connect.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* 判断表是否存在
*/
public void tableIsExist() {
Connection connect = getConnection();
Statement statement;
try {
statement = connect.createStatement();
String s = "DROP TABLE IF EXISTS `tables`";// 如果要使用的表已经存在,就删除表。下面再创建
statement.execute(s);
} catch (SQLException e) {
e.printStackTrace();
}
}

/**
* 创建表
*/
public void createTable() {
Statement statement = null;
Connection connect = getConnection();
try {
String sql = "create table coursetable (" + "id int(11) not null auto_increment primary key," // 主键
+ "course_name varchar(10) not null," // 课程名
+ "course_number int(10) not null," // 课程编号
+ "course_description varchar(255)," // 描述
+ "course_time int(10) default 100 " // 课时
+ ")";
statement = connect.createStatement();
statement.execute(sql);

} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null)
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(connect);
}
}

/**
* 增
*/
public void addCourse() {

Connection connect = getConnection();
Statement statement = null;
try {
statement = connect.createStatement();

String[] a = new String[5];
a[0] = "insert into coursetable (course_name,course_number,course_description)values('java',1001,'java软件开发学习')";
a[1] = "insert into coursetable (course_name,course_number,course_description)values('ios',1002,'ios软件开发学习')";
a[2] = "insert into coursetable (course_name,course_number,course_description)values('安卓',1003,'安卓软件开发学习')";
a[3] = "insert into coursetable (course_name,course_number,course_description)values('ui',1004,'UI设计')";
a[4] = "insert into coursetable (course_name,course_number,course_description)values('前端',1005,'前端开发')";

for (int i = 0; i < a.length; i++) {
statement.execute(a[i]);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null)
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(connect);
}
}

/**
* 删
*/
public void deleteCourse() {
Connection connect = getConnection();
Statement statement = null;
try {
statement = connect.createStatement();
String sql = "delete from coursetable where course_name = 'ios'";
statement.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null)
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(connect);
}
}

/**
* 改
*/
public void updateCourse() {
Connection connect = getConnection();
Statement statement = null;
try {
statement = connect.createStatement();
String sql = "update coursetable set course_name = 'ios' where course_name = 'ui'";
statement.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null)
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(connect);
}
}

/**
* 查
*/
public void selectCourse() {
Connection connect = getConnection();
Statement statement = null;
try {
statement = connect.createStatement();
String sql = "select * from coursetable";
ResultSet rs = statement.executeQuery(sql);// 返回结果集

System.out.println("id\tcourse_name\tcourse_number\tcourse_time\tcourse_description");
while (rs.next()) {
int id = rs.getInt(1);// 游标:1可以改为"id",下面同理
String name = rs.getString("course_name");
int number = rs.getInt("course_number");
String descript = rs.getNString("course_description");
int time = rs.getInt("course_time");
System.out.println(id + "\t" + name + "\t" + number + "\t" + time + "\t" + descript);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null)
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(connect);
}
}


public static void main(String[] args) {
//CourseDB c = new CourseDB();
//c.createTable();
//c.addCourse();
//c.deleteCourse();
//c.updateCourse();
//c.selectCourse();
getInstance().createTable();
}
}