笔记05-JDBC-事务、反射

  • jdbc事务
    1.什么是事务?
    答:一件事或多件事的集合,要么都执行,要么都不执行。
  • 创建数据库表
  • 创建工程导入mysql的驱动包
  • 完成orm映射思想
  • 创建包
    1.实体映射
  • 设计Dao(model模型层)
    1.com.oracle.test
    2.com.oracle.util
    3.com.oracle.vo
    4.com.oracle.dao (data Acess object)
    5.com.oracle.daoImpl
  • 实现Dao
  • 设计需求(service业务层)
    1.为什么要在java中添加业务层
    答:业务层是用来包装或整合实际数据库功能的,用户只知道需求,不知道操作功能,只针对业务和需求。我们程序员需要将功能整合成需求,从而服务用户。
  • 工具包
package com.oracle.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
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.List;


public class DBUtils {

	public static final String URL = "jdbc:mysql://localhost:3306/java21060?characterencoding = UTF8";
	public static final String USER = "root";
	public static final String PSSWORD = "root";
	
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//创建一个线程类,目的是存储唯一的连接
	public static ThreadLocal<Connection> local  = new ThreadLocal<>();
		

	public static Connection getLocalConnection(){
		//线程类获取连接
		Connection conn = local.get();
		//如果有直接返回
		if(conn == null){
			//没有创建就添加一个连接
			local.set(getConnection());
			conn = local.get();
		}
		return conn;
	}
	
	
	public static Connection getConnection(){
		Connection conn= null;
		try {
			conn = DriverManager.getConnection(URL, USER, PSSWORD);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return conn;
	}
	
	public static void close(Connection conn, Statement state ,ResultSet rs, PreparedStatement ps){
			try {
				if(rs != null){
					rs.close();
				}
				if(state != null){
					state.close();
				}
				if(conn != null){
					conn.close();
				}
				if(ps != null){
					ps.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}
	
	public static int executeUpdate( String sql ,Object...params) throws Exception{

		Connection conn = DBUtils.getLocalConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		
		for (int i = 0; i < params.length; i++) {
			ps.setObject(i+1, params[i]);
		}
		int a = ps.executeUpdate();
		
		return a;
	}
	
	public static <T> T executeQueryOnlyOne(String sql , Class<T> T, Object...params) throws Exception{
		
		Connection conn = DBUtils.getLocalConnection();
		PreparedStatement ps = conn.prepareStatement(sql);

		for (int i = 0; i < params.length; i++) {
			ps.setObject(i+1, params[i]);
		}
		
		ResultSet rs = ps.executeQuery();
		ResultSetMetaData metaData = rs.getMetaData();
		int columnCount = metaData.getColumnCount();
		T t = null;

		while(rs.next()){
			t = T.newInstance();

			for(int i = 1 ; i <= columnCount ; i ++){
				String columnName = metaData.getColumnName(i);
				Object columnValue = rs.getObject(columnName);
				Class class1 = t.getClass();
				Field field = class1.getDeclaredField(columnName);
				field.setAccessible(true);
				field.set(t, columnValue);
			}
		}
		return t;
	}	
	
	
	public static<T> List<T> executeQueryall(String sql , Class<T> T ) throws Exception{
		
		Connection conn = DBUtils.getLocalConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		ResultSetMetaData metaData = rs.getMetaData();
		int columnCount = metaData.getColumnCount();
		T t = null;
		List<T> list = new ArrayList<>();
		
		while(rs.next()){
			t = T.newInstance();
			
			for(int i = 1 ; i <= columnCount ; i ++){
				
				String columnName = metaData.getColumnName(i);
				Object object = rs.getObject(columnName);
				Class class1 = t.getClass();
				Field field = class1.getDeclaredField(columnName);
				field.setAccessible(true);
				field.set(t, object);
			}
			list.add(t);
		}
		
		return list;
	}
	
	
	public static ThreadLocal<Connection> local1 = new ThreadLocal<>();
		
	public static Connection getLocalConnection1(){
		Connection conn = local1.get();
		if(conn== null){
			local1.set(getConnection());
			conn = local1.get();
		}
		
		
		return null;
	}	
}

  • 业务层
package com.oracle.serviceImpl;

import java.sql.Connection;
import java.sql.Savepoint;

import com.oracle.dao.AccountDao;
import com.oracle.daoImpl.AccountDaoImpl;
import com.oracle.service.ServiceDao;
import com.oracle.util.DBUtils;

public class ServiceDaoImpl implements ServiceDao{

	AccountDao accountDao = new AccountDaoImpl(); 
	
	@Override
	public void transfer(String outer, String inner, int money) throws Exception {
		Connection conn = DBUtils.getLocalConnection();
		Savepoint a = null;
		try {
			//设置手动提交
			conn.setAutoCommit(false);
			//设置保存点
			a = conn.setSavepoint("a");
			//调用模型层的汇款方法
			accountDao.outer(outer, money);
			int c = 1/0;
			//调用模型层的汇款方法
			accountDao.inner(inner, money);
			//提交
			conn.commit();
		} catch (Exception e) {
			//回滚
			conn.rollback(a);
		}
	}
}

  • 反射
    1.什么是反射?
    答:可以理解为反向映射,准去的说是程序在“运行时”获取类的能力。(运行时是打成jar包被别人使用)
    2.可以通过反射获取类的属性、成员方法、构造器的结构
  • Class类
    1.可以通过调用Class类中的方法可以获取类的类对象
    1)Class<?> cls = Class.forname(“类的全路径”)
    2)Class cls = Person.Class;
    3)Person person = new Person();
    Class cls = person.getClass();
    2.类的类对象的方法
getName();获取类的全路径名
getSimleName();获取类的简单名
getModifiers();获取类的访问修饰符 返回单个属性

getFields();获取类的所有公共属性 返回数组
getField(“属性名”);获取指定的公共属性
getDeclaredFields();获取所有属性 返回Field类数组 
getDeclaredField("属性名");获取指定的属性 返回单个FieldgetDeclaredMethod("方法名",参数列表);获取指定方法 返回单个MethodgetDeclaredMethods();获取所有方法 返回多Method类数组
getMethod("add",参数列表);获取指定的公共方法 返回单个MethodgetMethods();获取所有公共方法 返回Method类数组

getDeclaredConstructor(Class...para参数列表); 获取指定构造器 返回单个ConstructorgetDeclaredConstructors();获取所有构造器 返回一个Constructor类数组
getConstructor(Class...para);获取指定的公共构造器 返回一个ConstructorgetConstructors();获取多个公共的Constructor

3.Field类的方法

getName();属性名
getModifers();获取属性的访问修饰符
getType();属性类型
get(当前属性对象Object obj);属性值
set(Object obj,Object value);给属性赋值

4.Method方法

getName();
invoke(Object obj ,实参);执行方法
getModifiers()获取访问修饰符
getType();获取数据类型
getreturnType();获取返回值数据类型
getParameterTypes();获取参数数据类型 返回数组
getParameterCount();获取参数个数

5.Constructor方法

getName();获取构造器名字
getModifiers();获取修饰符
getParameterCount();获取数据个数
getParameterTypes();获取数据类型 返回数组
newInstances(实参);创建对象
  • 元数据
    1.什么是元数据(metadata)
    答:修饰数据的数据,select操作才可以用的到,必须同ResultSet获取
    ResultSetMetaData metaData = rs.getMetaData() 获取MetaData

2.方法

getCloumnCount();获取表的字段个数
getCloumnName(int index);获取字段名字
getTableName();获取表名字
getCatalogName();获取数据库名字
getColumnType(int index);获取字段的属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值