signed

QiShunwang

“诚信为本、客户至上”

JDBC核心技术总结 一文看懂

2021/3/21 10:54:37   来源:

1.JDBC概述

Java Database Connectivity
通用的SQL数据库存取和操作的公共接口
	使用这套类库可以以一种标准的方法、方便地访问数据库资源
 JDBC驱动
	JDBC接口的实现类
	由数据库厂商提供
	JDBC的编程,编写代码阶段,可以没有驱动,但是要运行JDBC程序必须要有驱动,否则接口的方法都是抽象方法,没有方法体,无法执行,而且接口也没有办法创建对象,要具体的实现类才能创建对象,实现类对象往往通过工厂等一些方法获取
面向接口编程的思想
	JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。————面向接口编程

使用jdbc以后的好处
	1.程序员不需要关注不同数据库的细节
	2.使得编写的程序具有更好的可移植性

面向接口编程的思想

2.如何获取数据库的连接

如何连接
// 获取数据库的连接

	public static Connection getConnection() throws Exception {

		// 1.从配置文件中读取连接的基本信息

		Properties pros = new Properties();

		// 默认加载的文件就在src下

		InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

		pros.load(is);

		// 读取4个基本信息

		String userName = pros.getProperty("userName");

		String password = pros.getProperty("password");

		String driverClass = pros.getProperty("driverClass");

		String url = pros.getProperty("url");

		// 2.加载驱动

		Class clazz = Class.forName(driverClass);

		// 3.获取连接

		Connection conn = DriverManager.getConnection(url, userName, password);

		return conn;

	}

对应的配置文件为【jdbc.properties】

userName=root

password=abc123

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8
	需要:IP,端口号,用户名,密码,数据库名
	其中IP地址和端口号,以及数据库名,通过URL进行传递
	URL的规范:jdbc:<子协议>:<子名称>
		mysql的url标准
			jdbc:mysql://localhost:3306/数据库名
		oracle的url标准
			jdbc:oracle:thin:@localhost:1521:数据库名
		sqlserver的url标准
			jdbc:sqlserver://localhost:1433:DatabaseName=数据库名

3.Statement的弊端

1.必要情况下,需要拼串
2.存在SQL注入的问题

4.PreparedStatement实现CRUD操作

1.PreparedStatement作为Statement的子接口
2.相较于Statetment的好处
	1.不用拼串,避免了sql注入问题
	2.预编译sql语句,当执行批量操作时,效率要高于Statement
	3.方便来操作Blob类型的数据
3.通用的增删改操作
//提供通用的增删改的方法

	public int update(String sql,Object ... args){

		//1.获取连接

		Connection conn = null;

		//2.预编译sql语句

		PreparedStatement ps = null;

		//4.执行

		int updateCount = 0;

		try {

			conn = JDBCUtils.getConnection();

			ps = conn.prepareStatement(sql);

			//3.填充占位符

			for(int i = 0;i < args.length;i++){

				ps.setObject(i + 1,args[i]);

			}

			updateCount = ps.executeUpdate();

		} catch (Exception e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}finally{

			//5.关闭资源

			JDBCUtils.close(conn, ps,null);


		}
		
		return updateCount;
	}
4.通用的查询操作
//通用的查询操作(返回类的一个对象)

	public <T> T getInstance(Class<T> clazz,String sql,Object ... args){

		Connection conn = null;

		PreparedStatement ps = null;

		ResultSet rs = null;

		T t = null;

		try {

			//1.获取连接

			conn = JDBCUtils.getConnection();

			//2.预编译sql语句

			ps = conn.prepareStatement(sql);

			//3.填充占位符

			for(int i = 0;i < args.length;i++){

				ps.setObject(i + 1, args[i]);

			}

			//4.获取结果集

			rs = ps.executeQuery();

			

			//5.获取结果集的元数据:ResultSetMetaData

			ResultSetMetaData rsmd = rs.getMetaData();

			//5.1:可以获取结果集的列数

			int columnCount = rsmd.getColumnCount();

			if(rs.next()){//对应一行数据

				//创建Class对应的运行时类的对象

				t = clazz.newInstance();

				for(int i = 0;i < columnCount;i++){

					//5.2取出每一列的值

					Object columnVal = rs.getObject(i + 1);

					//5.3获取列的名字(即为java类的属性名)

					String columeLabel = rsmd.getColumnLabel(i + 1);

//				System.out.println(columnVal);

				

					//使用反射装配属性

					Field field = clazz.getDeclaredField(columeLabel);

					field.setAccessible(true);

					field.set(t, columnVal);

				}

			}

		} catch (Exception e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}finally{

			//关闭资源

			JDBCUtils.close(conn, ps,rs);

		}

		return t;

	}
	ORM编程思想
		 * ORM思想: object relational mapping
  • 一个java类 对应 数据库中的一个表
  • java类的一个属性 对应 数据表中的一个字段(列)
  • java类的一个对象 对应 数据表的一行数据
 5.PreparedStatement其他操作
	1.操作Blob类型的数据
		写入
			setBlob(int index,InputStream is)
		读取
			Blob blob = getBlob(String columnLabel);InputStream is = blob.getBinaryStream()
	2.批量插入数据
		使用addBatch()/executeBatch()/clearBatch()
		添加参数:?rewriteBatchedStatements=true
		使用mysql更新的驱动
		操作完,一次性提交

5.数据库事务
什么是事务?
事务处理的原则?
要么都提交,要么都不提交
改进原有的CRUD操作
事务操作的步骤
conn.setAutoCommit(false);
conn.commit();
conn.rollback();

6.提供通用的DAO
abstract class BaseDAO
interface CustomerDAO
class CustomerDAOImpl extends BaseDAO implements CustomerDAO

7.如何使用数据库连接池连接数据库
连接池的好处?
1.提高响应速度(减少了创建新的数据库连接的时间)
2.降低资源消耗(重复利用数据库连接池中的数据,不需要每次都创建)
3.便于管理
C3P0数据库连接池
DBCP数据库连接池
druid数据库连接池

8.如何使用dbutils.jar中的QueryRunner实现CRUD操作