JDBC连接MySQL数据库

时间:2020-12-05 13:06:20
/*
 * 这部分代码是测试连通数据库的
 * 我在数据库中建立了一个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);
		}
	}

}