- 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("属性名");获取指定的属性 返回单个Field类
getDeclaredMethod("方法名",参数列表);获取指定方法 返回单个Method类
getDeclaredMethods();获取所有方法 返回多Method类数组
getMethod("add",参数列表);获取指定的公共方法 返回单个Method类
getMethods();获取所有公共方法 返回Method类数组
getDeclaredConstructor(Class...para参数列表); 获取指定构造器 返回单个Constructor类
getDeclaredConstructors();获取所有构造器 返回一个Constructor类数组
getConstructor(Class...para);获取指定的公共构造器 返回一个Constructor类
getConstructors();获取多个公共的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);获取字段的属性