/* 操作myee_2104数据库的账户表account
* zhangsan 给lisi转账500块钱
*
* 需要使用jdbc--创建连接对象之后,同时操作两个sql(参数的sql)
* update account set balance = balance - ? where id = ? ;
* update account set balance = balance + ? where id = ? ;
*
* 操作语句中,第一句成功后,后面出现异常,第二个sql就执行失败,那么转账的业务就没有完成!
* 这个时候就是需要使用事务!
*
*
* 操作步骤:
* 1)获取数据库连接对象 Connection(DruidDataSource:数据源来获取连接对象)
* 2)Connection接口
* void setAutoCommit(boolean autoCommit) throws SQLException;
* 3) void commit() throws SQLException;
* 4)void rollback() throws SQLException;
*/
public class TransactonDemo {
public static void main(String[] args) {
Connection conn = null ;
PreparedStatement ps1 = null ;
PreparedStatement ps2 = null ;
try{
//获取数据库的连接对象
conn = MyJdbcUtils.getCoonnection();
//不加入事务管理
//当第一个sql执行完毕,后面出现异常,第二个sql执行失败!转账也就失败了:
//加入事务,要么同时成功,要么同时失败!
//开启事务
// conn.setAutoCommit(false);
MyJdbcUtils.setAutoCommit(conn);
//准备sql语句:参数化的sql
//zhangsan 账户-500
String firSql = "update account set balance = balance - ? where id = ?" ;
//将firSql发送数据库进行编译解析并且同时获取预编译对象
ps1 = conn.prepareStatement(firSql);
//参数赋值
ps1.setInt(1,500);
ps1.setInt(2,1);
//执行更新
int count1 = ps1.executeUpdate();
System.out.println(count1);
// int x = 10/0 ;
// System.out.println("程序出问题了...");
//lisi 账户+500
String senSql = "update account set balance = balance + ? where id = ?" ;
//将senSql发送到数据库进行编译同时获取预编译对象
ps2 = conn.prepareStatement(senSql) ;
//参数赋值
ps2.setInt(1,500);
ps2.setInt(2,2);
//执行更新
int count2 = ps2.executeUpdate();
System.out.println(count2);
//没有问题:提交事务并关闭
// conn.commit();
MyJdbcUtils.commitAndClose(conn);
}catch (SQLException e){
//System.out.println("回滚了...");
//事务回滚
MyJdbcUtils.rollbackAndClose(conn);
/* try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}*/
e.printStackTrace();
}finally {
try {
MyJdbcUtils.close(ps1,conn);
} catch (SQLException e) {
e.printStackTrace();
}
try {
MyJdbcUtils.close(ps2,conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class MyJdbcUtils {
private static DataSource dataSource = null ;
private static ThreadLocal<Connection> t1 = new ThreadLocal<Connection>() ;
//一个链接对象---相当线程
private MyJdbcUtils(){}
static{
try {
//创建一个属性集合类
Properties prop = new Properties() ;
//读取druid.properties的参数
InputStream inputStream = MyJdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//加载属性集合列表中
prop.load(inputStream);
//通过工厂类
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据链接
public static Connection getCoonnection(){
//声明conn变量
Connection conn = null ;
try{
//获取连接对象
//先判断 ,如果当前conn 为null
if(conn==null){
//从连接池获取到
conn = dataSource.getConnection();
//一个连接相当一一个线程
//连接对象绑定ThreadLocal中
t1.set(conn);
}
return conn ;
}catch(Exception e){
e.printStackTrace();
}
return null ;
}
//获取数据源
public static DataSource getDataSource(){
return dataSource;
}
//释放资源
//提供关闭资源方法:针对DQL语句:查询获取结果集,关闭相关资源
public static void close(ResultSet rs, Statement stmt, Connection conn) throws SQLException {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
conn.close();
//解绑:从ThreadLocal (连接使用完毕,线程就执行完毕
t1.remove();
}
}
//针对DDL,DML操作:不需要ResultSet
public static void close(Statement stmt,Connection conn) throws SQLException {
close(null,stmt,conn);
}
//开启事务
public static void setAutoCommit(Connection conn){
try {
//开启事务
conn.setAutoCommit(false); //取消自动提交
} catch (SQLException e) {
e.printStackTrace();
}
}
//如果事务的操作没有问题,提交事务并释放连接
//使用 同一个连接对象
public static void commitAndClose(Connection conn) {
try {
//提交事务
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
//解绑
t1.remove(); //线程(用户操作的时候,连接对象是完毕,线程执行完毕!)
}
}
//如果执行过程中出现问题,回滚事务
public static void rollbackAndClose(Connection conn) {
try {
//事务回滚
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放连接--归还到连接池
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
//解绑
t1.remove(); //线程(用户操作的时候,连接对象是完毕,线程执行完毕!)
}
}
public static void main(String[] args) {
Connection connection = MyJdbcUtils.getCoonnection();
System.out.println(connection);
DataSource dataSource = MyJdbcUtils.getDataSource();
System.out.println(dataSource);
}
}
代理:描述 让代理类帮助真实角色完成一些事情!
静态:
代理和被代理类都需要实现同一个接口(线程中的Runnable接口)
动态代理:在程序的执行过程中,通过反射的方式获取代理对象!
JDK动态代理:基于接口来完成
cglib动态代理:基于子类完成
JDK动态代理:基于接口来完成
必须存在一个接口
java.lang.reflect.Proxy提供用于创建动态代理类和实例的静态方法
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
参数1:定义代理类的类加载器
参数2:代理类要实现的接口列表
参数3:指派方法调用的调用处理程序
InvocationHandler h完成功能的增强
接口: 代理实例的调用处理程序 实现的接口
Object invoke(
Object proxy, 在其上调用方法的代理实例
Method method, 调用的接口方法的 Method 实例(需要被增强的业务方法)
Object[] args)方法调用的参数值 :就是当前业务方法中的参数(参数数组)
throws Throwable 完成对UserDao的业务功能进行增强
自定义一类来实现InvocationHandler,或者接口的匿名内部类
/* 针对用户操作接口
*/
public interface UserDao {
void add() ;
void delete() ;
void find() ;
void update() ;
}
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("添加用户");
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void find() {
System.out.println("查询用户");
}
@Override
public void update() {
System.out.println("更新用户");
}
}
public class UserDaoImpl2 implements UserDao {
@Override
public void add() {
//加入一些监控行为
System.out.println("权限校验");
System.out.println("添加用户");
//日志
System.out.println("日志记录");
}
@Override
public void delete() {
//加入一些监控行为
System.out.println("权限校验");
System.out.println("删除用户");
//日志
System.out.println("日志记录");
}
@Override
public void find() {
//加入一些监控行为
System.out.println("权限校验");
System.out.println("查询用户");
//日志
System.out.println("日志记录");
}
@Override
public void update() {
//加入一些监控行为
System.out.println("权限校验");
System.out.println("修改用户");
//日志
System.out.println("日志记录");
}
}
public class JdkProxy {
public static void main(String[] args) {
//创建UserDao类对象
//接口多态实现
UserDao ud = new UserDaoImpl() ;
ud.add();
ud.delete();
ud.find();
ud.update();
System.out.println("------------------------------");
//版本2:针对上面的代码进行增强
UserDao ud2 = new UserDaoImpl2() ;
ud2.add();
ud2.delete();
ud2.find();
ud2.update();
System.out.println("没有使用代理完成-----------------------------");
MyInvocationHandler handler = new MyInvocationHandler(ud) ;//针对ud对象--产生代理实例
//使用jdk动态代理完成
UserDao userDao = (UserDao) Proxy.newProxyInstance(
//代理类的类加载器
ud.getClass().getClassLoader(),
//代理类要实现的接口列表UserDao
//public Class>[] getInterfaces()
ud.getClass().getInterfaces(),
//指派方法调用的调用处理程序
handler
);
userDao.add();
userDao.delete();
userDao.update();
userDao.find();
}
}
/* 指派的代理程序
*/
public class MyInvocationHandler implements InvocationHandler {
//针对谁来产生代理对象
private Object target ; //目标对象
public MyInvocationHandler(Object target){ //UserDao ud = new UserDaoImpl() ;
this.target = target ;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限校验");
//Method:针对业务方法调用
Object obj = method.invoke(target, args);
//add/delete/update/find
System.out.println("日志记录检查...");
return obj;//返回的技术代理实例
}
}
html常用的标签
文本标签
图像标签
超链接
表格标签
表单标签
框架标签
文本标签
div标签:块标签:占一行内容
div很少单独使用 + css :盒子模型 (网页层级布局)
第一个div
第二个div
标题标签
h1-h6 从到大小
EE_2104
EE_2104
EE_2104
EE_2104
EE_2104
EE_2104
段落标签
XXXX
水平线标签hr
滚动标签:marquee
behavior属性:滚动的方式
slide:滚动的一边停止
scroll:交替滚动
alternate:来回滚动
scrollamount:滚动的速度(正整数)
direction:默认就是left(从右到左)
bgcolor:背景色
hello,JavaEE
行内标签 span
没有效果 : 结合+js :完成原生的表单校验
span1
span2
上标签sub和sup
转义字符:© 版权所有
® 已经注册的商品
一个空格
一个符号代表两个空格
sup:上标
sub:下标
pre:原样输出标签
<%
Date date = new Date() ;
System.out.println(date) ;
%>
4). 进入到Linux根目录有哪些文件夹
cd :change directory(改变目录名称)
ls :罗列当前目录下的所有文件以及文件夹名称
ls -a 和ll命令等价:罗列详情 以及看他当前文件是否有权限 以及隐藏文件
bin 存储的二进制相关的数据
lib64 —linux系统存储的一些库
lib — 存储一些相关的centos的一些库
sbin— 存储的相关的二进制数据
相当于windows系统的桌面快捷图片
home:用户目录
存放普通用户:zhansan…
tmp:临时目录
boot:安装过程linux中(下载启动包)
etc:(将所有的核心配置文件以及网络配置文件都会存起来)
usr:
资源共享目录
将jdk.tar.gz/mysql/tomcat存储在usr/local里面 (usr/share)
network-scripts 有一个文件
ifcg-ens33 (网络配置文件) ens33:网卡号
cat ifcfg-ens33: 查看当前文件的内容,查看所有
6). 给ifcfg-ens33里面添加固定ip
修改配置文件:使用Linux 自带编辑器
vim 文件名称 --回车之后
进入到命令行模式
按i---->进入到编辑模式
编辑完成之后—>按esc (进入底行模式) —>输入:wq(保存并退出)
如果编辑中有问题,按esc—>(进入底行模式)输入:q 不保存,只是退出
改完内容之后需要重启ens33网卡
方式1:
nmcli c reload + 网卡名
方式2:
nmcli connection reload
如果上面两个不行:
nmcli c up +网卡名
nmcli d reapply +网卡名
nmcli d connect +网卡名
如果上面两个不行:
nmcli c up +网卡名
nmcli d reapply +网卡名
nmcli d connect +网卡名