JDBC连接MySQL数据库
/*
* 这部分代码是测试连通数据库的
* 我在数据库中建立了一个student的数据库 并且赋予了一个全部权限的test用户,test用户的密码也是test
* 在做好上面的工作的基础上再去进行下面代码的运行测试
*/
package link_test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Connect {
public static Connection getConnection(String driverClassName,
String dbURL, String userName, String password)
throws ClassNotFoundException,SQLException {
Connection con=null;
//加载连接数据库的驱动类
Class.forName(driverClassName);
//使用用户名 密码连接数据库
con = DriverManager.getConnection(dbURL, userName, password);
return con;//返回Connection类型的con
}
public static Connection getMysqlConnection(String dricerClassName,
String serverHost, String serverPort, String dbName, String
userName, String password ) throws ClassNotFoundException,
SQLException{
//如果没有提供这些链接参数 则使用默认值
if(dricerClassName == null){
dricerClassName = "com.mysql.jdbc.Driver";
}
if(serverHost == null){
serverHost = "127.0.0.1";
}
if(serverPort == null){
serverPort = "3306";
}
//构建访问MySQL数据库的URL
String dbURL = "jdbc:mysql://"+serverHost+":"+serverPort+"/"
+dbName;
return getConnection(dricerClassName, dbURL, userName, password);
}
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// TODO 自动生成的方法存根
String mySQLDriver = "com.mysql.jdbc.Driver";//这一行有个地方写错了 导致了异常
String dbName="student";//数据库的名字叫student
String userName="test";//用户名
String password="test";//对应用户名的密码
Connection con=Connect.getMysqlConnection(
mySQLDriver, null, null, dbName, userName, password);
//获取连接
System.out.println("连接MySQL数据库成功!");
con.close();//连接关闭
System.out.println("成功关闭与数据库的连接");
/*
* 演示第二种连接方式
*/
String url="jdbc:mysql://127.0.0.1:3306/"+dbName;
con = Connect.getConnection(mySQLDriver, url, userName, password);
System.out.println("数据库连接成功");
con.close();
System.out.println("数据库已经断开连接");
}
}
2.获取 数据库和表的元数据
package getData;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
public class getData {
/*
* 获取数据库的元数据
* 需要con与数据库的连接
*/
public static void showDatabaseMetadata(Connection con){
try{
//得到数据库的元数据
DatabaseMetaData md=con.getMetaData();
System.out.println("数据库"+md.getURL()+"的元数据如下:");
//显示元数据信息
System.out.println("驱动:"+md.getDriverName());
System.out.println("驱动版本号:"+md.getDriverVersion());
System.out.println("登陆用户名:"+md.getUserName());
System.out.println("数据库产品名:"+md.getDatabaseProductName());
System.out.println("数据库产品版本号:"+md.getDatabaseProductVersion());
System.out.println("支持的SQL关键字:");
System.out.println(md.getSQLKeywords());
System.out.println("操作数字的函数:");
System.out.println(md.getNumericFunctions());
System.out.println("操作字符串的函数:");
System.out.println(md.getStringFunctions());
System.out.println("系统函数:");
System.out.println(md.getSystemFunctions());
System.out.println("时间和日期函数:");
System.out.println(md.getTimeDateFunctions());
}catch(SQLException e){
e.printStackTrace();
}
}
/*
* 显示数据表的元数据信息 主要是列信息
* con是与数据库的连接
* tableName是数据表名
*/
public static void showTableMetadata(Connection con,
String tableName){
String sql = "select *from "+tableName;
Statement sm=null;
try{
//获取表的所有数据
sm=con.createStatement();
ResultSet rs = sm.executeQuery(sql);
//得到结果集的元数据
ResultSetMetaData md = rs.getMetaData();
System.out.println("数据表"+tableName+"数据元素如下:");
//表的列数
int columnCount = md.getColumnCount();
System.out.println("column count:"+columnCount);
System.out.println();
StringBuffer sb=new StringBuffer("");
sb.append("sn\tname\t\t").append("type\t\t\t");
sb.append("scale\t").append("isNullable");
System.out.println(sb);
sb.delete(0, sb.length());
//输出列的属性信息
for(int i=1; i<=columnCount; i++){
sb.append(i).append("\t");
sb.append(md.getColumnName(i)).append("\t\t");
sb.append(md.getColumnTypeName(i)).append("\t\t\t");
sb.append(md.getScale(i)).append("\t");
sb.append(md.isNullable(i));
System.out.println(sb);
sb.delete(0, sb.length());
}
rs.close(); //rs关闭
}catch(SQLException e){
e.printStackTrace();
}finally{
if(sm != null){
try{
sm.close();
}catch(SQLException e1){
e1.printStackTrace();
}
}
}
}
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// TODO 自动生成的方法存根
String dbName = "student";
String tableName = "student_basic";
String userName = "test";
String password = "test";
Connection con = null;
try{
//获取数据库连接
con = (Connection) Connect.getMysqlConnection(null, null, null,
dbName, userName, password);
getData.showDatabaseMetadata(con);
System.out.println();
//显示数据表的元数据
getData.showTableMetadata(con, tableName);
}catch(ClassNotFoundException e1){
throw e1;
}catch(SQLException e2){
throw e2;
}finally{
//关闭数据库连接
if(con != null){
try{
con.close();
}catch(SQLException e1){
e1.printStackTrace();
}
}
}
}
}
3. 进行数据库表数据的查询、修改、插入
package getData;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class operateData {
/*
* 查询数据库
* sm表示与数据库连接的statement
* 返回一个ResultSet的结果集
*/
public static ResultSet queryDB(Statement sm, String sql){
ResultSet rs=null;
try{
rs=sm.executeQuery(sql);//首先获得表的所有数据
}catch(SQLException e){
e.printStackTrace();
}
return rs;
}
/*
* 修改数据库
* con表示数据库连接
* sql表示 SQL语句
* 返回修改影响的行数,为0表示各行数据都没有被改变
*/
public static int updateDB(Connection con, String sql){
Statement sm=null;
int affectRow=0;
try{
sm=con.createStatement();//首先获得表的所有数据
affectRow = sm.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
affectRow = Statement.EXECUTE_FAILED;
}finally{
//关闭Statement
closeStatement(sm);//在下面会定义这个函数
}
return affectRow;
}
/*
* 显示一个ResultSet的结果集
* 在显示之前必须保证它所在的Statement是活着的
*/
public static void showResultSet(ResultSet rs){
if(rs == null) return;
try{
ResultSetMetaData md=rs.getMetaData();
//获得该ResultSet中的列数
int columnCount=md.getColumnCount();
//如果结果集的指针没有位于第一条记录的前面
//则将结果集的指针指向第一条记录的前面
if(!rs.isBeforeFirst()){
rs.isBeforeFirst();
}
//从前往后移动结果集的指针,处理每条记录
while(rs.next()){
//每条记录都包含columnCount个列
for(int i=1; i<columnCount; i++){
//由于不知道该列的类型 所以采用getObject方法获取
System.out.print(rs.getObject(i)+"\t");
}
System.out.print(rs.getObject(columnCount)+"\r\n");
}
rs.beforeFirst();//指针归位
}catch(SQLException e){
e.printStackTrace();
}
}
/*
* 关闭Statement
* sm
*/
public static void closeStatement(Statement sm){
if(sm!=null){
try{
sm.close();
}catch(SQLException e1){
e1.printStackTrace();
}
}
}
/*
* 关闭连接
* con
*/
public static void closeConnection(Connection con){
if(con!=null){
try{
con.close();
}catch(SQLException e1){
e1.printStackTrace();
}
}
}
public static void main(String[] args) throws ClassNotFoundException,
SQLException{
String dbName="student";
String userName="test";
String password="test";
String querySQL="select *from student_basic";
String updateSQL="update student_basic set score=82 "
+ "where name='marry'";
String insertSQL="insert into student_basic(name, age, score)"
+ "values('Amy', 17, 86)";
String deleteSQL="delete from student_basic where name='liming'";
Connection con=null;
Statement sm=null;
try{
con = Connect.getMysqlConnection(null, null, null, dbName,
userName, password);
sm=con.createStatement();
//将表读取出来
ResultSet rs=operateData.queryDB(sm, querySQL);
System.out.println("表修改前的数据:");
operateData.showResultSet(rs);
//修改
operateData.updateDB(con, updateSQL);
operateData.updateDB(con, insertSQL);
operateData.updateDB(con, deleteSQL);
System.out.println("修改表之后的数据:");
//再进行一次查询 输出表数据
rs = operateData.queryDB(sm, querySQL);
operateData.showResultSet(rs);
System.out.println();
}catch(ClassNotFoundException e1){
throw e1;
}catch(SQLException e2){
throw e2;
}finally{
//关闭数据库连接
closeStatement(sm);
closeConnection(con);
}
}
}
4. 批处理
package getData;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;
/*
* 执行一批SQL语句
*/
public class Batch {
/*
* 判断数据库是否支持批处理
* con
*/
public static boolean supportBatch(Connection con){
try{
//得到数据库的元数据
DatabaseMetaData md=con.getMetaData();
return md.supportsBatchUpdates();
}catch(SQLException e){
e.printStackTrace();
}
return false;
}
/*
* 执行一批SQL语句
* con表示与数据库的连接
* 待执行的SQL数组
*/
public static int[] goBatch(Connection con, String[] sqls){
if(sqls == null)
return null;
Statement sm=null;
try{
sm = con.createStatement();
//将所有的SQL语句添加到Statement中
for(int i=0; i<sqls.length; i++){
sm.addBatch(sqls[i]);
}
//一次执行多条SQL语句
return sm.executeBatch();
}catch(SQLException e){
e.printStackTrace();
}finally{
operateData.closeStatement(sm);
}
return null;
}
//main函数
public static void main(String[] args) throws ClassNotFoundException,
SQLException{
String dbName = "student";
String userName = "test";
String password = "test";
String[] sqls=new String[3]; //3条语句
sqls[0]="update student_basic set score=100 where name='Tim'";
sqls[1]="insert into student_basic(name, age, score)values('Yang',17,60)";
sqls[2]="delete from student_basic where name='Li'";
Connection con=null;
try{
//首先获得数据库连接 通过Connect.java的函数连接
con = Connect.getMysqlConnection(null, null, null,
dbName, userName, password);
//判断是否支持批处理
boolean ok=Batch.supportBatch(con);
System.out.println("支持批处理吗?"+ok);
if(ok){
//执行一批SQL语句
int[] result = Batch.goBatch(con, sqls);
//分析执行的结果
for(int i=0; i<sqls.length; i++){
if(result[i] >= 0){
System.out.println("语句"+sqls[i]+"执行成功,影响了"+result[i]+"行数据");
}else if(result[i]==Statement.SUCCESS_NO_INFO){
System.out.println("语句"+sqls[i]+"执行成功,影响行数未知");
}else if(result[i]==Statement.EXECUTE_FAILED){
System.out.println("语句"+sqls[i]+"执行失败");
}
}
}
}catch(ClassNotFoundException e1){
throw e1;
}catch(SQLException e2){
throw e2;
}finally{
//关闭数据库
operateData.closeConnection(con);
}
}
}

浙公网安备 33010602011771号