java连接数据库

如果我们想使用java连接数据库,那么,

1、我们需要和数据库建立连接,

使用Connection创建一个数据库连接对象,

1、Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
2、//这里的URL,USER,PASSWORD,分别是数据库驱动,用户名,密码
3、//这里分享一下SQLserver,MySQL,Oracle的驱动位置
4、//SQLserver : jdbc:sqlserver://127.0.0.1:1433;databaseName=数据库名称
5、//MySQL : jdbc:mysql://localhost:3306/数据库名称
6、//Oracle : jdbc:oracle:thin:@localhost:1521:dbname
7、//访问接口根据自己的来


接下来,就可以进行访问:

1、//以查询方法为例
2、Connection conn = DBManager.getConnection();
3、Statement pstmt = conn.createStatement();
4、ResultSet rs = st.executeQuery("需要执行的SQL语句");
5、String name = rs.getString("name");//这里是要获取的列名,根据自己需求来定

	
	

总的来说,这些都可以作为一个工具类来调用,即DBManager:

package com.SM.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

public class DBManager {
	private static final String URL="jdbc:mysql://localhost:3306/schooldb?useUnicode=true&characterEncoding=UTF-8";
	private static final String DRIVER = "com.mysql.jdbc.Driver";
	private static final String USER="admin",PASSWORD="123456";
	private static final Logger logger = Logger.getLogger(DBManager.class.getName());
	/**
	 * 获取一个数据库连接对象
	 * @return 数据库连接对象
	 */	
	public static  Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName(DRIVER);
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (ClassNotFoundException e) {
			System.out.println("数据库连接失败");
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}	

	public static void closeAll(ResultSet set,Statement sta,Connection con){
		try {
			if(set != null)
				set.close();
			if(sta!=null)
				sta.close();
			if(con!=null)
				con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 执行增删改语句
	 * @param 要执行的sql语句
	 * @return 返回数据库受影响的行数
	 */
	public static int executeUpdate(String sql){
		Connection conn=null;
		Statement sta=null;
		try {
			conn = getConnection();
			sta = conn.createStatement();
			return sta.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return e.getErrorCode()*(-1);
		}
		finally{
			closeAll(null, sta, conn);
		}		
	}
	/**
	 * 在一个事务中,执行sql语句
	 * @param sqls 
	 * @return 数据库受影响的行数
	 */
	public static int executeUpdate(ArrayList sqls){
		Connection conn=null;
		Statement sta=null;
		int c =0;
		try {
			conn = getConnection();
			conn.setAutoCommit(false);
			sta = conn.createStatement();
			for (int i = 0; i < sqls.size(); i++) {
				String sql = sqls.get(i);
				c+=sta.executeUpdate(sql);
			}
			conn.commit();
			return c;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			return -1;
		}
		finally{
			closeAll(null, sta, conn);
		}
	}
	/**
	 * 以参数化的方式完成增删改操作
	 * @param 要执行的sql语句
	 * @param 参数列表
	 * @return 数据库受影响的行数
	 */
	public static int executeUpdate(String sql,ArrayList paras){
		Connection conn=null;
		PreparedStatement sta=null;
		try {
			conn = getConnection();
			sta = conn.prepareStatement(sql);
			for (int i = 0; i < paras.size(); i++) {
				sta.setObject(i+1, paras.get(i));
			}
			return sta.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return e.getErrorCode()*(-1);
		}
		finally{
			closeAll(null, sta, conn);
		}		
	}
	
	/*利用容器查询数据开始……   优点:不用关不连接,方法内部封装了jdbc代码,几乎不用编写jdbc代码,会sql即可工作*/
	
	/**
	 * 根据指定的sql语句,查询出一个数据表
	 * @param 要执行的sql语句
	 * @param 参数化paras
	 * @return 模拟的数据表
	 * @throws 重名异常
	 */
	public static DataTable executeQueryTable(String sql,ArrayList paras) throws Exception{
		Connection conn=null;
		PreparedStatement sta=null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			sta = conn.prepareStatement(sql);
			if(paras!= null)
				for (int i = 0; i < paras.size(); i++) {
					sta.setObject(i+1, paras.get(i));
				}
			rs = sta.executeQuery();			
			java.sql.ResultSetMetaData meta = rs.getMetaData();
			int colCount = meta.getColumnCount();
			DataTable dtData = new DataTable("data");
			for (int i = 1; i <= colCount; i++) {
				String cn = meta.getColumnName(i);
				dtData.newColumn(cn, "","String");
			}
			while(rs.next()){
				DataRow r = dtData.newRow();
				for (int i = 1; i <= colCount; i++) {
					String dx = "";
					Object obj = rs.getObject(meta.getColumnName(i));
					if(obj != null)
						dx=obj.toString();
					r.set(meta.getColumnName(i),dx);
				}
				dtData.Rows.add(r);
			}			
			return dtData;			
		} catch (SQLException e) {
			e.printStackTrace();			
			return null;
		}
		finally{
			closeAll(rs,sta,conn);
		}
	}	
	/**
	 * 
	 * @param 表、视图的名称
	 * @param 列名集合
	 * @param where 条件
	 * @param order 命令
	 * @param pageNum 页面
	 * @param pageSize 每页多少条数据
	 * @return 两张数据表(data,rc)构成的表集合
	 */
	public static DataSet executeQueryPagedDataSet(String objName,String colNames,String where,String order,int pageNum,int pageSize ){
		Connection conn = getConnection();
		CallableStatement cStatement = null;
		ResultSet rs = null;
		try {
			//部分代码省略
			//创建CallableStatement的对象,showStuByName是存储过程的名字
			cStatement = conn.prepareCall("{call proc_Data_Paged(?,?,?,?,?,?,?)}");	
			cStatement.setString(1, objName);
			cStatement.setString(2, colNames);
			cStatement.setInt(3, pageNum);
			cStatement.setInt(4, pageSize);
			cStatement.setString(5, where);					
			cStatement.setString(6, order);		
			cStatement.registerOutParameter(7, java.sql.Types.INTEGER);
			rs = cStatement.executeQuery();  //执行存储过程	

			java.sql.ResultSetMetaData meta = rs.getMetaData();
			int colCount = meta.getColumnCount();
			DataTable dtData = new DataTable("data");
			for (int i = 1; i <= colCount; i++) {
				String cn = meta.getColumnName(i);
				dtData.newColumn(cn, "","String");
			}
			while(rs.next()){
				DataRow r = dtData.newRow();
				for (int i = 1; i <= colCount; i++) {
					String dx = "";
					Object obj = rs.getObject(meta.getColumnName(i));
					if(obj != null)
						dx=obj.toString();
					r.set(meta.getColumnName(i),dx);
				}
				dtData.Rows.add(r);
			}
			int num = ((CallableStatement)cStatement).getInt(7);
			DataTable dtData2 = new DataTable("rc");
			dtData2.newColumn("rowCount","0");
			DataRow rx = dtData2.newRow();
			rx.set("rowCount", num+"");
			dtData2.Rows.add(rx);
			DataSet ds = new DataSet();
			ds.addTable(dtData);
			ds.addTable(dtData2);
			closeAll(rs,cStatement,conn);
			return ds;
		} catch (Exception sqlE) {
			sqlE.printStackTrace();
		} finally {
			//部分代码省略
		}
		return null;
	}
	
	/**
	 * 转换成通用分页所需要的Json字符串
	 * @param dt 数据表
	 * @param rowCount 记录总数
	 * @return json格式的字符串对象
	 */
     static String toJsonForEasyUI(DataTable dt,int rowCount)
     {
         return "{" + String.format("\"total\":%s,\"rows\":%s", rowCount, dt.toJson()) + "}";
     }
     /**
 	 * 进行分页查询,获取json字符串
 	 * @param 表、视图的名称
 	 * @param 列名集合
 	 * @param where 条件(eg:where 1=1 and ……)
 	 * @param order 命令(eg:order by Price)
 	 * @param pageNum 页面
 	 * @param pageSize 每页多少条数据
 	 * @return 符合easyui datagrid控件的json字符串
 	 */
 	public static String executeQueryPagedForEasyUI(String objName,String colNames,String where,String order,int pageNum,int pageSize ){
 		DataSet ds = executeQueryPagedDataSet(objName, colNames, where, order, pageNum, pageSize);
 		int rc = Integer.parseInt(ds.getTable(1).Rows.get(0).get(0));
 		DataTable dt = ds.getTable(0);
 		return toJsonForEasyUI(dt,rc);
 	}
 	/*利用容器查询数据结束   */
 	
 	/*利用自定义结果集查询数据开始……   */
	/**
	 * 获取指定sql语句查询到的自定义结果集(参数化方式)
	 * @param sql 参数化的查询语句
	 * @param paras 参数集合
	 * @return 自定义查询结果集
	 */
	public static QueryDataResult executeQuery(String sql, ArrayList paras) {
		Connection conn = null;
		PreparedStatement sta = null;
		ResultSet set = null;
		try {
			conn = getConnection();
			sta = conn.prepareStatement(sql);
			for (int i = 1; i <= paras.size(); i++) {
				sta.setObject(i, paras.get(i - 1));
			}// 循环加入参数,要求和占位符?个数相同,并一一对应
			set = sta.executeQuery();
			return new QueryDataResult(conn, sta, set);
		} catch (SQLException e) {
			e.printStackTrace();
			closeAll(set, sta, conn);
			return null;
		}
	}
	/**
	 * 获取指定sql语句查询到的自定义结果集
	 * @param sql 参数化的查询语句
	 * @return 自定义查询结果集
	 */
	public static QueryDataResult executeQuery(String sql) {
		Connection conn = null;
		Statement sta = null;
		ResultSet set = null;
		try {
			conn = getConnection();
			sta = conn.createStatement();
			set = sta.executeQuery(sql);
			return new QueryDataResult(conn, sta, set);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			closeAll(set, sta, conn);
			return null;
		}
	}
	/**
	 * 获取分页查询的结果集
	 * 
	 * @param objName 表或视图的名称
	 * @param colNames 要取的列用逗号分隔
	 * @param where 筛选条件
	 * @param order 排序
	 * @param pageNum 第几页
	 * @param pageSize 每页记录数
	 * @return 自定义结果集
	 */
	public static QueryDataResult executeQueryPaged(String objName,
			String colNames, String where, String order, int pageNum,
			int pageSize) {
		Connection conn = getConnection();
		CallableStatement cStatement = null;
		ResultSet rs = null;
		try {
			// 部分代码省略
			// 创建CallableStatement的对象,showStuByName是存储过程的名字
			cStatement = conn
					.prepareCall("{call proc_Data_Paged(?,?,?,?,?,?,?)}");
			cStatement.setString(1, objName);
			cStatement.setString(2, colNames);
			cStatement.setInt(3, pageNum);
			cStatement.setInt(4, pageSize);
			cStatement.setString(5, where);
			cStatement.setString(6, order);
			cStatement.registerOutParameter(7, java.sql.Types.INTEGER);
			rs = cStatement.executeQuery(); // 执行存储过程			
			QueryDataResult res = new QueryDataResult(conn, cStatement, rs);
			return res;
		} catch (Exception sqlE) {
			sqlE.printStackTrace();
		} finally {
			// 部分代码省略
		}
		return null;
	}
	/*利用自定义结果集查询数据结束   */
	
	/**
	 * 根据查询的语句获取一个封装好的对象集合(只支持常用的类型,大家可以自行扩展)
	 * 要求数据表在设计时必须规范,反射生成set方法时,才不会报错
	 * 使用示例:
	 * DBManager m = new DBManager();
	 * return m.getObjects(sql, "com.ysd.stumis.entity.GradeInfo");
	 * @param sql 查询语句
	 * @param cn 对象的完成名称
	 * @return 
	 */
	public List getObjects(String sql,String cn){
		   Connection conn=null;
			Statement stmt=null;
			ResultSet rs=null;
			try {
				conn = getConnection();
				stmt = conn.createStatement();
				 rs = stmt.executeQuery(sql);
				 ResultSetMetaData rmd = rs.getMetaData();
				 List list=new ArrayList();
				 @SuppressWarnings("unchecked")
				Class c = (Class)Class.forName(cn);
				 while(rs.next()){
					 T obj = c.newInstance();
					 //
					 Method m = null;
					for (int i = 1; i <= rmd.getColumnCount(); i++) {
						String colName = rmd.getColumnName(i);
						int colType =rmd.getColumnType(i);
						String funName = "set"+(colName.substring(0,1)).toUpperCase()+(colName.substring(1));
							switch(colType){
							case Types.CHAR:
							case Types.VARCHAR:
								m = c.getMethod(funName, String.class);
								m.invoke(obj, rs.getString(colName));
								break;
							case Types.NCHAR:
							case Types.NVARCHAR:
								m = c.getMethod(funName, String.class);
								m.invoke(obj, rs.getString(colName));
								break;
							case Types.INTEGER:
								m = c.getMethod(funName, Integer.class);
								m.invoke(obj, rs.getInt(i));
								break;
							case Types.DOUBLE:
							case Types.FLOAT:
							case Types.DECIMAL://对应sqlserver中的money、decimal等
								m = c.getMethod(funName, Double.class);
								m.invoke(obj, rs.getDouble(i));
								break;
							case Types.DATE:
							case Types.TIMESTAMP:////对应sqlserver中的datetime
								m = c.getMethod(funName, java.sql.Timestamp.class);
								m.invoke(obj, rs.getTimestamp(i));
								break;
						    }
					}
					list.add(obj);
				 }
				 return list;
			} catch (SQLException e) {
				logger.error("数据库连接异常");
			}catch (InstantiationException e) {
				// TODO Auto-generated catch block
				logger.error("应用程序试图使用类中的newInstance方法创建类的实例时,无法实例化指定的类对象");
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				logger.error("无法访问指定的类、字段、方法或构造函数的定义");
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				logger.error("由安全管理器抛出以指示安全违规。");
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				logger.error("抛出以指示方法已被传递给非法或不适当的参数。");
			}  catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				logger.error("应用程序试图通过其字符串名称加载类");
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				logger.error("被调用方法或构造函数出现异常");
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				logger.error("找不到特定方法");
			} finally{
				closeAll( rs, stmt,conn);
			}
			return null;
	   }
}

数据库连接也就这么多,这里的DBManager使用的是MySQL为例子的。

你可能感兴趣的:(java基础部分)