JAVA——JDBC

数据库连接方式

  • ODBC
  • JDBC

常见错误

1.Exception in thread “main” java.lang.ClassNotFoundException: ora1cle.jdbc.driver.OracleDriver

  • 驱动路径名称错误 oracle.jdbc.driver.OracleDriver

  • 驱动包没有添加到类路径中

2.Exception in thread “main” java.sql.SQLException: No suitable driver found for jdbc:orcale:thin:@localhost:1521:orcl

  • url写错了

3.ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

  • url中数据库名称错误

4.Exception in thread “main” java.sql.SQLException: The Network Adapter could not establish the connection

  • 监听未开启

  • 监听的端口号错误

5.Exception in thread “main” java.sql.SQLException: ORA-01017: invalid username/password; logon denied

  • 登录用户名或密码错误

6.Exception in thread “main” java.sql.SQLException: 列名无效

  • 该表中没有该列名的存在 update insert delete

  • 查询语句中没有查询出该列

步骤

1.从Oracle文件下找到jdbc驱动包 ojdbc14.jar

2.项目创建及jar文件导入

1.创建JavaProject

2.项目下创建一个文件夹lib

	项目上右键
	new
	Folder

3.将ojdbc14.jar文件复制到lib目录下

4.选中ojdbc14.jar右击—build path—add buildpath

5.注意:打开数据库监听及服务

3.数据库连接步骤eclipse中

1.导包

import java.sql.*;

2.注册驱动

Class.forName("oracle.jdbc.driver.OracleDriver");

3.获取连接对象

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","a");
Connection 与特定数据库的连接(会话)在连接上下文中执行SQL语句并返回结果
	//第一个参数:jdbc连接数据的url地址  jdbc:oracle:thin:@数据库服务IP:数据库端口号:数据库实例名
	//第二个参数:登录数据库服务器的用户名
	//第三个参数:登录数据库服务器的密码
Java与数据库可以通信 创建session窗口

4.测试是否连接成功

System.out.println(conn.getClass().getName());
连接成功:oracle.jdbc.driver.T4CConnection

5.编写sql语句

需传入的参数用占位符?代替
String sql ="select usid,uname,upwd,uimage,utype,ustate from tb_user where uname=? and upwd=?"

6.通过连接对象加载sql语句获取预编译对象

SQL语句被预编译并存储在PrepareStatement对象中
PrepareStatement pstmt = conn.prepareStatement(sql)

7.给?参数设值

pstmt.setObject(1, uname);//1表示第几个问好
pstmt.setObject(2, pwd);

8.执行查询操作

在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象
	即在数据库中执行sql语句
ResultSet rs = pstmt.executeQuery()
rs.next()
	next方法将光标移动到下一行  在ResultSet对象没有下一行时返回false
rs.getObject("empno")
	获取empno字段的值

9.关闭所有资源

10以上保存在Map中(多Map又可以添加在list中)
JAVA——JDBC
JAVA——JDBC

添加图片—更新操作

//图片的添加   以字节的方式插入
File f = new File("E:\\Orecle_WordSpace\\1.jpg");
InputStream in = new FileInputStream(f);
byte []bt=new byte[(int)f.length()];
in.read(bt);
pstmt.setObject(3, bt);
int result=pstmt.executeUpdate();
  • 在数据库查询该表时,该条数据已被添加!

配置文件db.propreties

  • driver_name

    注册驱动

  • url

  • user

  • password

MyProperties

public class MyProperties extends Properties {
	public static MyProperties instance = new MyProperties();
	private MyProperties(){
		try {
			this.load(this.getClass().getClassLoader().getResourceAsStream("db.properties"));//类路径 src
			//若配置文件放在com.yc.cammons  caom/yc/commons/db.properties
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static MyProperties getInstince(){
		return instance;
	}
}

帮助文档-DBHelper

1.全局变量

private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;

2.驱动加载static{}

static{
	try {
		Class.forName(MyProperties.getInstince().getProperty("driver_name"));
	} catch (ClassNotFoundException e) {
		System.out.println("驱动注册失败"+e.getMessage());//项目上线需删除此行
		e.printStackTrace();
	}
}

3.获取连接对象Connection getConn()

public Connection getConn(){
	try {
		Properties p = MyProperties.getInstince();
		conn = DriverManager.getConnection(p.getProperty("url"),p);
	} catch (SQLException e) {
		System.out.println("获取连接对象失败:"+e.getMessage());
		e.printStackTrace();
	}
	return conn;
}

4.设置参数? void setParams(PreparedStatement pstmt,Object…params)

public void setParams(PreparedStatement pstmt,Object...params) throws Exception{//参数数量无法确定 用不定长度的数组
	if(params==null||params.length<=0){return ;}
	//循环数组
	for(int i=0;i<params.length;i++){
		pstmt.setObject(i+1, params[i]);
	}
}

5.根据结果集获取所有列名 List getColumnNames(ResultSet rs)

public List<String> getColumnNames(ResultSet rs) throws SQLException{
	List<String> colunmNames = new ArrayList<String>();
	//通过结果集对象获取结果集所有的列及属性
	ResultSetMetaData data = rs.getMetaData();// 获取此 ResultSet 对象的列的编号、类型和属性
	int count = data.getColumnCount();//根据sql语句查看列的条数
	//列的编号从1开始
	for(int i=1;i<=count;i++){
		colunmNames.add(data.getColumnName(i));
	}
	return colunmNames;
}

6.更新操作

1.单条sql语句更新
int update(String sql,Object…params)

	public int update(String sql,Object...params) throws Exception{
	int result=0;//记录更新条数
	try {
		conn=getConn();//获取连接对象
		pstmt=conn.prepareStatement(sql);//获取预编译对象
		setParams(pstmt, params);//设置参数
		result=pstmt.executeUpdate();//更新
	} catch (SQLException e) {
		e.printStackTrace();
		System.out.println("单条更新异常:"+e.getMessage());
	}finally {
		closeAll(conn, pstmt, null);
	}		
	return result;
}

2.多条sql语句更新——用事务来处理

int update(List<String> sqls,List<List<Object>> params)
		public int update(List<String> sqls,List<List<Object>> params) throws Exception{
	int result = 0;
	try {
		conn=getConn();
		conn.setAutoCommit(false);//将事务设为手动处理 Connection对象处于自动提交状态
		for(int i=0;i<sqls.size();i++){//循环所有的sql语句
			String sql = sqls.get(i);//获取单条sql语句
			List<Object> param = params.get(i);//获取与sql语句对应位置的参数设置List
			pstmt=conn.prepareStatement(sql);
			//设置参数
			setParams(pstmt, param.toArray());//将集合转为对象数组
			result=pstmt.executeUpdate();
			if(result<=0){
				//更新受影响的函数认为更新失败,撤销前面所有的操作
				conn.rollback();
				return result;
			}
		}
		conn.commit();//执行成功——手动提交事务
	} catch (SQLException e) {
		//事务回滚
		conn.rollback();
		result=0;
		e.printStackTrace();
		System.out.println("多条更新异常:"+e.getMessage());
	}finally {
		//事务还原
		conn.setAutoCommit(true);
		closeAll(conn, pstmt, null);
	}
	return result;
}

7.查询操作

1.单个聚合函数查询
double getPloymer(String sql,Object…params)

select count(*) from 表名
		public double getPloymer(String sql,Object...params) throws Exception{
	double result=0;
	try {
		conn=getConn();
		pstmt=conn.prepareStatement(sql);
		setParams(pstmt, params);
		rs=pstmt.executeQuery();
		if(rs.next()){
			result=rs.getDouble(1);//double 的形式获取此 ResultSet 对象的当前行中指定列的值   列1
		}
	} catch (SQLException e) {
		e.printStackTrace();
		throw new Exception("聚合函数查询失败:"+e.getMessage());
	}finally{
		closeAll(conn, pstmt, rs);
	}
	return result;
}

2.返回一条查询结果(记录)
Map<String,Object> findSingle(String sql,Object…params)

public Map<String,Object> findSingle(String sql,Object...params) throws Exception{
	Map<String,Object> map=null;
	try {
		conn=getConn();
		pstmt=conn.prepareStatement(sql);
		setParams(pstmt, params);
		rs = pstmt.executeQuery();//返回查询出来的结果集
		List<String> columnNames=getColumnNames(rs);//获取所有的列名
		if(rs.next()){
			map = new HashMap<String,Object>();
			for(String name:columnNames){
				Object obj = rs.getObject(name);//根据列名获取值
				if(obj==null)continue;
				String typeName = obj.getClass().getName();//获取当前值的数据类型
				if("oracle.sql.BLOB".equals(typeName)){//照片处理
					Blob blob = (BLOB)obj;
					InputStream in = blob.getBinaryStream();
					byte []bt=new byte[(int)blob.length()];
					in.read(bt);//转换成二进制字节存入
					map.put(name, bt);
				}else if("oracle.sql.CLOB".equals(typeName)){
					//文档
				}else{
					map.put(name, rs.getObject(name));
				}
			}
		}
	} catch (SQLException e) {
		e.printStackTrace();
		System.out.println("单条查询异常:"+e.getMessage());
	}finally {
		closeAll(conn, pstmt, rs);
	}
	return map;
}

3.返回多条查询结果(记录)
List<Map<String,Object>> findMutipl(String sql,Object…params)

public List<Map<String,Object>> findMutipl(String sql,Object...params)throws Exception{
	Map<String,Object> map=null;
	List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
	try {
		conn=getConn();
		pstmt=conn.prepareStatement(sql);
		setParams(pstmt, params);
		rs = pstmt.executeQuery();
		List<String> columnNames=getColumnNames(rs);
		while(rs.next()){
			map = new HashMap<String,Object>();
			for(String name:columnNames){
				Object obj = rs.getObject(name);//根据名称获取值
				if(obj==null)continue;
				String typeName = obj.getClass().getName();//获取当前值的数据类型
				if("oracle.sql.BLOB".equals(typeName)){//照片处理
					Blob blob = (BLOB)obj;
					InputStream in = blob.getBinaryStream();
					byte []bt=new byte[(int)blob.length()];
					in.read(bt);//转换成二进制字节存入
					map.put(name, bt);
				}else if("oracle.sql.CLOB".equals(typeName)){
					//文档
				}else{
					map.put(name, rs.getObject(name));
				}
			}
			list.add(map);
		}
	} catch (SQLException e) {
		e.printStackTrace();
		System.out.println("单条查询异常:"+e.getMessage());
	}finally {
		closeAll(conn, pstmt, rs);
	}
	return list;
}

8.关闭所有资源

1.void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs)

public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
	if(conn!=null){
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	.......
}
上一篇:面试了198天,成功拿到阿里P7offer,全靠我啃烂这300套Java面试题


下一篇:用预查询(JDBC里的preparedstatement)为什么比直接用字符串拼SQL效率高