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); } } }