代码编织梦想

JDBC

JDBC: java database connectivity,即java与数据库的连接。

JDBC常用API作用
Driver接口所有JDBC驱动程序必须实现的接口,专门提供给数据库厂商使用
DriverManager类加载JDBC驱动并创建于数据库的连接
Connection接口代表Java与数据库连接的对象,只有获取这个对象才能操作数据库
Statement接口用于执行静态SQL语句
PreparedStatement接口预处理块,处理SQL语句
ResultSet接口保存返回结果的结果集
ResultSetMetaData结果集元信息(字段名,字段个数等信息)

JDBC使用流程

public class Demo03 {
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//1、加载数据库驱动到JVM
			Class.forName("oracle.jdbc.OracleDriver");
			
			//2、获取数据库连接对象
			//连接数据库的url
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			//登陆的用户名和密码
			String user = "SCOTT";
			String password = "TIGER";
			conn = DriverManager.getConnection(url, user, password);
			
			//3、根据连接得到Statement对象
			stmt = conn.createStatement();
			
			//4、使用Statement对象执行SQL语句,返回一个结果集
			String sql = "select deptno,dname,loc from dept";
			rs = stmt.executeQuery(sql);
			
			//5、操作结果集
			while(rs.next()) {
				System.out.println(rs.getInt(1)+"-->"+rs.getString(2)+"-->"+rs.getString(3));
			}
			
			//6、关闭资源
			rs.close();
			stmt.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上面代码使用了静态处理块,它的缺点是,性能不高,拼接sql麻烦,可能存在sql注入。因此在JDBC中应该使用预处理块PreparedStatement。

public class Demo04 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			//1、加载数据库驱动到JVM
			Class.forName("oracle.jdbc.OracleDriver");
			
			//2、获取数据库连接对象
			//连接数据库的url
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			//登陆的用户名和密码
			String user = "SCOTT";
			String password = "TIGER";
			conn = DriverManager.getConnection(url, user, password);
			
			//3、根据连接得到Statement对象,预处理sql语句,可以用?指代参数
			String sql = "select deptno,dname,loc from dept where deptno = ?";
			pstm = conn.prepareStatement(sql);
			
			//4、使用PreparedStatement对象设置sql里参数,然后执行返回结果集
			pstm.setInt(1, 20);
			rs = pstm.executeQuery();
			
			//5、操作结果集
			while(rs.next()) {
				System.out.println(rs.getInt(1)+"-->"+rs.getString(2)+"-->"+rs.getString(3));
			}
			
			//6、关闭资源
			rs.close();
			pstm.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
}

JDBC的封装

/*
 * 封装JDBC的基本功能
 */
public class DBUtils {
	//配置文件
	private static Properties pro = new Properties();
	//静态块加载类时执行一次,加载配置文件并加载数据库驱动
	static {
		try {
			pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties"));
			Class.forName(pro.getProperty("className"));
		} catch (ClassNotFoundException e) {
			System.out.println("数据库驱动加载异常");
		} catch (IOException e) {
			System.out.println("数据库配置文件加载异常");		
		}
	}
	
	//获取连接
	public static Connection getConnection() throws SQLException {
		Connection conn = null;
		String url = pro.getProperty("url");
		String username = pro.getProperty("username");
		String pwd = pro.getProperty("pwd");
		conn = DriverManager.getConnection(url, username, pwd);
		return conn;
	}
	
	//关闭资源
	public static void close(Connection conn,Statement stmt,ResultSet rs) {
		try {
			if(conn != null) {
				conn.close();
			}
			if(stmt != null) {
				stmt.close();
			}
			if(rs != null) {
				rs.close();
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	public static void close(Connection conn,Statement stmt) {
		close(conn,stmt,null);
	}
}

​ 使用反射操作工具类获得对应pojo类的集合

/*
 * 用DBUtils类操作数据库,将dept表中数据持久化到pojo类中
 */
public class Demo05<T> {

	// 查询数据的方法,返回list集合,储存对象类型由clz确定
	public List<T> queryList(String sql, Class<T> clz, Object... objects) {
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		List<T> list = new ArrayList<T>();
		try {
			//获取连接
			conn = DBUtils.getConnection();
			//获取预处理块
			pstm = conn.prepareStatement(sql);
			//为sql语句的占位符设值
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					pstm.setObject(i + 1, objects[i]);
				}
			}
			//得到结果集
			rs = pstm.executeQuery();
			//得到结果集元信息
			ResultSetMetaData meta = rs.getMetaData();
			
			//用反射为每行记录创建对象
			while(rs.next()) {
				T t = clz.getConstructor().newInstance();
				int count = meta.getColumnCount();
				for(int i=1;i<=count;i++) {
					//该行记录的第i个字段的查询结果
					Object value = rs.getObject(i);
					//该行记录的第i个字段的字段名,注意大小写问题
					String columnName = meta.getColumnName(i).toLowerCase();
					
					//获取属性对象并设置值
                    //oracle数据库number类型默认获取为java中BigDecimal类型
					Field fieldName = clz.getDeclaredField(columnName);
					fieldName.setAccessible(true);
					fieldName.set(t, value);
					fieldName.setAccessible(false);
				}
				//添加对象
				list.add(t);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 

		return list;
	}
}
//测试类
public class Demo06 {
	public static void main(String[] args) {
		Demo05<Dept> d = new Demo05<>(); 
		String sql = "select * from dept where deptno in(?,?,?)";
		List<Dept> list = d.queryList(sql, Dept.class,10,20,30);
		
		list.forEach(System.out::println);
		
	}
}
//运行结果:
Dept [deptno=10, dname=ACCOUNTING, loc=NEW YORK]
Dept [deptno=20, dname=RESEARCH, loc=DALLAS]
Dept [deptno=30, dname=SALES, loc=CHICAGO]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/candycrush_CL/article/details/107569506

《Headfirst设计模式》观察者模式-内置API-爱代码爱编程

除了我们可以自己定义观察者之外,我们还可以使用java工具类中的API实现,但比起我们自己实现的接口,它会存在一些问题 java.util.Observable的黑暗面 如同你所发现的,可观察者是一个“类”而不是一个“接口”,更糟的是,它甚至没有实现一个接口。 首先,因为Observable是一个“类”,你必须设计一个类继承它。如果某类想同时具有Ob

idea 中Update resources和Update classes and resources、Redeploy的区别和应用场景-爱代码爱编程

官方文档链接:https://www.jetbrains.com/help/idea/updating-applications-on-application-servers.html#update_options Application update options The update options are different depending

常见数组算法小解-爱代码爱编程

以下数组皆采用 int[] arr = {30,45,23,24,89,20}; 冒泡排序(相邻两个元素进行比较,每次选出一个最大值放在最后面)for (int i = 0; i < arr.length - 1; i++) { // 每一轮都是从头开始两个元素进行比较 比较最大次数为每一轮 - 1 因为每次选出最大值后不再参与比较

SequoiaDB监控与开发实践分析-爱代码爱编程

使用背景 公司近期上线了一个新应用,底层数据库采用了国产的分布式数据库 – SequoiaDB。   因为需要将 SequoiaDB 集群纳入到公司的整个监控体系中,所以需要对 SequoiaDB 的状态、性能指标等信息收集起来,然后提供监控系统使用。   SequoiaDB 数据库本身提供了一个图形化的监控界面 – SAC,但是里面的监控项,和

Java是什么?学完我们能做什么?-爱代码爱编程

首先简单介绍下Java。 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。 Java一共推出了三个版本,其分别是: JavaSE(J2SE)(Java2 Platform Standard Edition

应届生小白JAVA开发面试经大白话之------http协议(原创)-爱代码爱编程

           应届生小白面试经大白话之------http协议(原创) 讲概念http协议概念首先我们得了解什么是http协议,然后和别人提提“三次握手”,“四次挥手”,基本概念以及一些参数是个啥意思,然后知道为什么要三次,是四次,而不是更多次就够用了。接下來我就针对这几点分享自己这方面的应届面试经。   什麽是HTTP协议?大白话就这么说

数据库-事务-爱代码爱编程

事务 ​ 事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。 事务有一下四个特点:(ACID) 1、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。 2、一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之

ssh远程登陆配置、公私钥密码ssh体系构建-爱代码爱编程

一、远程登陆服务openssh openssh服务器提供ssh远程加密登陆,常用于公网,加密数据传输过程中安全,默认装机最小化时候也是装好的,sshd服务配置文件是/etc/ssh/sshd_conf,ssh协议的端口号默认是22,以防别人发起端口***,现网中正常都是换1024以上的端口号,1024以内一般都有使用需求 talent:远程登陆 默认端口号

MySQL 常用操作-爱代码爱编程

1 创建/打开/删除数据库 create database db; create database db character set utf8mb4; use db; drop database db; alter database db character set utf8mb4; 2 修复表 mysqlcheck --all-databases

SequoiaDB监控与开发实践分析-爱代码爱编程

使用背景 公司近期上线了一个新应用,底层数据库采用了国产的分布式数据库 – SequoiaDB。   因为需要将 SequoiaDB 集群纳入到公司的整个监控体系中,所以需要对 SequoiaDB 的状态、性能指标等信息收集起来,然后提供监控系统使用。   SequoiaDB 数据库本身提供了一个图形化的监控界面 – SAC,但是里面的监控项,和

数据库----数据库语言-爱代码爱编程

SQL概述 SQL特点 结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的***编程语言***,是一种***数据库查询***和***程序设计语言***,用于***存取数据***以及***查询***、更新***和***管理关系数据库系统。 结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它

SpringBoot笔记簿(下)-爱代码爱编程

Spring事务 事务有四大特性(ACID):原子性,一致性,隔离性和持久性。 Spring既支持编程式事务管理(将事务管理代码嵌入业务方法中,以控制事物的提交和回滚,因此,编程式事务管理必须在每个业务操作中包含额外的事务管理代码),又支持声明式事务管理(将事务管理代码从业务方法中分离出来,以声明的方式实现事务管理)。面对众多数据访问技术,Spring在