数据库与JDBC工具

数据库:1.索引:索引是提供指向存储在表的指定列中的数据值的指针,后根据指定的排序顺序对这些指针排序。
                       索引分类:普通索引,唯一性索引,主键索引,全文索引,组合索引
                       创建索引:create index 索引名 on 表名(列);
                                        alter table 表名 add index 索引名(列);
                                        create table 表名(列定义...,index 索引名(列));
                                        create unique index 索引名 on 表名(列);
               2.视图:是一个或多个表(或其他视图)导出的表,是一个虚表
                         创建视图:create view 视图名(列)as select(列)from...;
               3.事务:数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
                  MySQL数据库只有InnoDB引擎(MyISAM不支持事务)才支持事务。
                  事务属性(ACID):原子性(Atomicity),一致性(Consistecy),隔离性(Isolation),持久性(Durability)。
                4.存储过程(procedure):数据库操作语言SQL的可编程性实现。 
                                                        create procedure 过程名([[IN |OUT |INOUT ]参数名1 类型1,参数名2 类型2...])
                                                         begin
                                                         【declared】临时变量
                                                           --执行体
                                                           end
                      调用存储过程:call 存储过程名();
                      删除存储过程:drop procedure 过程名;
                   5.函数:CREATE FUNCTION 函数名(参数列表)
                                

RETURNS 返回值类型

BEGIN

    
                                [DECLARE] 临时变量       

    
                                -- 执行体       

    
                                RETURN 返回值;    
                                

END;

                       调用函数:select 函数名(参数);
                      6.数据库优化。
                      7.触发器:CREATE TRIGGER 触发器名


                                       trigger_time trigger_event


                                       ON tbl_name 
                                       

FOR EACH ROW
                                       

BEGIN
                            

    trigger_body

                                        
END; 

                       8.数据库设计范式:
                          1NF:必须保证表中每一列都是原子列,不可再进行分割(每一列只能存在一种数据类型);
                          2NF:在第一范式基础上,要求表中的每一列都必须与主键列存在直接依赖关系,不允许存在部分依赖情况(联合主键);
                          3NF:在第二大范式基础上,要求表中不允许存在传递依赖,主键列A->决定列B->决定列C.
JDBC技术:1.常用接口与类:- Connection
- Statement&PreparedStatement
- ResultSet
- DriverManager
- SQLException

                   2.六大步骤:1. 加载驱动(JDBC4之后无需手动加载)

                                       2. 获取连接

                                       3. 获取处理sql语句命令对象

                                       4. 执行

                                       5. 处理结果

                                       6. 关闭资源

                   3.DTO(数据传输对象)与DAO(数据访问对象);
                   4.jdbc连接池技术:- Druid-alibaba- DBCP (spring管理连接时推荐)
- C3P0(hibernate推荐)
- Proxool
- Tomcat Pool

 

JDBC工具:需要jar包druid-1.1.10.jar,mysql-connector-java-5.1.39-bin.jar。

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * 通用数据库工具,基于Druid连接池实现
 * 包含以下功能:
 * 1.获取资源
 * 2.关闭资源
 * 3.执行通用更新操作
 * 4.执行通用查询操作
 * 5.执行通用单条
 * @author NIUXUYUAN
 *
 */

public class DBUtils {

	//声明一个Druid连接池对象
		private static DruidDataSource pool ;
		/**数据库连接url地址**/
		private static String url;
		/**账号**/
		private static String username;
		/**密码**/
		private static String password;
		/**初始连接数**/
		private static int initialSize;
		/**最大活动连接数**/
		private static int maxActive;
		/**最小闲置连接数**/
		private static int minIdel;
		/**最大等待时间**/
		private static long maxWait;
//		private static String fileName = "/jdbc.properties";
		
		static {
			init();

		}
		 
		/**
		 * 加载属性文件并读取属性文件内容并将其配置给连接信息
		 * @param propName
		 */
		private static void loadProp() {
//			fileName = propName;
			try {
				//属性文件位于src根目录时,加"/"则不用getClassLoader(),繁殖
				InputStream is = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
				Properties p = new Properties();
				p.load(is);
				
				url = p.getProperty("jdbc.url");
				username = p.getProperty("jdbc.username");
				password = p.getProperty("jdbc.password");
				
				initialSize = Integer.parseInt(p.getProperty("initailSize").trim());
				maxActive = Integer.parseInt(p.getProperty("maxActive").trim());
				minIdel = Integer.parseInt(p.getProperty("minIdel").trim());
				maxWait = Long.parseLong(p.getProperty("maxWait").trim());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		private static void init() {
			pool = new DruidDataSource();
			loadProp();
			pool.setUrl(url);
			pool.setUsername(username);
			pool.setPassword(password);
			//设置连接池中初始连接数
			pool.setInitialSize(initialSize);
			//设置最大连接数
			pool.setMaxActive(maxActive);
			//设置最小闲置连接
			pool.setMinIdle(minIdel);
			//设置最大的等待获取连接时间
			pool.setMaxWait(maxWait);
		}
		
		/**
		 * 获取连接
		 * @return
		 */
		public static Connection getConn() {
			try {
				//容错:若连接池为空或被关闭,则重新初始化一个
				if(pool == null || pool.isClosed()) {
					init();
				}
				return pool.getConnection();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return null;
		}

		/**
		 * 关闭
		 * @param stmt
		 * @param conn
		 */
	public static void close(Statement stmt, Connection conn) {
		try {
			if (stmt != null) {
				stmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 封装通用的更新操作,
	 * 
	 * @param sql
	 * @return
	 */
	public static boolean exeUpdate(Connection conn,String sql, Object... obj) {
		PreparedStatement ps = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < obj.length; i++) {
				ps.setObject(i + 1, obj[i]);
			}
			return ps.executeUpdate() > 0;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(ps, null);
		}
		return false;
	}

	/**
	 * 技术参数:泛型、集合框架、反射,JDBC 查询
	 * 
	 * @param t
	 * @param sql
	 * @param params
	 * @return
	 */
	public static <T> List<T> queryList(Class<T> t, String sql, Object... params) {
		List<T> list = new ArrayList<>();
		T obj = null;
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
			ResultSet rs = ps.executeQuery();
			// 获取查询结果集的元数据(获得列的类型、数量及长度)
			ResultSetMetaData rsmd = rs.getMetaData();
			// 申明一个Map集合,用于临时存储一条数据<key:列名,value:列值>
			Map<String, Object> map = new HashMap<>();
			// 遍历结果集
			while (rs.next()) {
				// 防止缓存上一条数据
				map.clear();
				// 遍历所有的列
				for (int i = 0; i < rsmd.getColumnCount(); i++) {
					// 获取列名
					String cname = rsmd.getColumnLabel(i + 1);
					// 获取列值
					Object value = rs.getObject(cname);
					// 将列名与列值存储到map中
					map.put(cname, value);
				}
				// 利用反射将map中数据注入到java对象中,并将对象存入集合
				if (!map.isEmpty()) {
					// 获得map集合键集
					Set<String> columNames = map.keySet();
					// 创建对象
					obj = t.newInstance();
					for (String colum : columNames) {
						// 根据键获取值
						Object value = map.get(colum);
						if(Objects.nonNull(value)) {
							
							// 获取属性对象
							Field f = t.getDeclaredField(colum);
							// 设置属性为可访问状态
							f.setAccessible(true);
							// 为属性设值
							f.set(obj, value);
						}
					}
					list.add(obj);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}

		return list;
	}

	/**
	 * 封装返回一个查询结果
	 * 
	 * @param t
	 * @param sql
	 * @param params
	 * @return
	 */
	public static <T> T queryOne(Class<T> t, String sql, Object... params) {
		T obj = null;
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
			ResultSet rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			//创建一个实例(必须包含无参构造器)
			obj = t.newInstance();
			//ORM操作(对象关系映射)
			if (rs.next()) {
				for (int i = 0; i < rsmd.getColumnCount(); i++) {
					// 获取列名
					String cname = rsmd.getColumnLabel(i + 1);
					//获取对应列名的列值
					Object value = rs.getObject(cname);
					if(Objects.nonNull(value)) {
						
						//根据列名获取Java类的属性名(要求表中列名与类中属性名保持一致)
						Field f = t.getDeclaredField(cname);
						f.setAccessible(true);
						f.set(obj, value);
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return obj;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值