Java学习日志Day32_jdbc操作事务_反射动态代理(重要的-----Mybatis,Spring -aop动态代理)_html,css(掌握常用标记以及常用css属性样式)

一、通过jdbc方式操作事务

连接池

/* 操作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);
    }
}

二、反射:动态代理(重要的-----Mybatis,Spring -aop动态代理)

  1. 代理:描述 让代理类帮助真实角色完成一些事情!
    静态:
    代理和被代理类都需要实现同一个接口(线程中的Runnable接口)
    动态代理:在程序的执行过程中,通过反射的方式获取代理对象!

  2. 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,css(掌握常用标记以及常用css属性样式)

  1. html常用的标签
    文本标签
    图像标签
    超链接
    表格标签
    表单标签
    框架标签

  2.  <meta charset="utf-8">
     <!-- 标题标签 -->
     <title>文本标签</title>
    
  3. div标签:块标签:占一行内容
    div很少单独使用 + css :盒子模型 (网页层级布局)

     <div>第一个div</div>
     <div>第二个div</div>
    
  4. 标题标签
    h1-h6 从到大小

     <h1>EE_2104</h1>
     <h2>EE_2104</h2>
     <h3>EE_2104</h3>
     <h4>EE_2104</h4>
     <h5>EE_2104</h5>
     <h6>EE_2104</h6>
    
  5. 段落标签

     <p>XXXX</p>
    
  6. 水平线标签hr
    滚动标签:marquee
    behavior属性:滚动的方式
    slide:滚动的一边停止
    scroll:交替滚动
    alternate:来回滚动
    scrollamount:滚动的速度(正整数)
    direction:默认就是left(从右到左)
    bgcolor:背景色

    hello,JavaEE

  7. 行内标签 span
    没有效果 : 结合+js :完成原生的表单校验

     <span>span1</span>
     <span>span2</span>
    
  8. 上标签sub和sup

     转义字符:&copy; 版权所有
          			&reg; 已经注册的商品
     	 			&nbsp;一个空格
     	 			&ensp; 一个符号代表两个空格
     sup:上标
     sub:下标
    
  9. pre:原样输出标签

     <pre>
     <%
     		Date date = new Date() ;
     		System.out.println(date) ;
     %> 
     </pre>
    

四、在win10上,安装centos8虚拟机及配置静态ip

安装linux系统配置

  1. Linux相关的操作

1). 登录成功之后
登录成功之后

2). ifcofnig:Linux 查看ip地址
ifcofnig:Linux 查看ip地址

3). nmcli 查看ip详细信息
nmcli 查看ip详细信息

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)
linux目录

  1. .进入到/etc/sysconfig/network-scripts

network-scripts 有一个文件
ifcg-ens33 (网络配置文件) ens33:网卡号

cat ifcfg-ens33: 查看当前文件的内容,查看所有

6). 给ifcfg-ens33里面添加固定ip

修改配置文件:使用Linux 自带编辑器

vim 文件名称 --回车之后
进入到命令行模式
按i---->进入到编辑模式
编辑完成之后—>按esc (进入底行模式) —>输入:wq(保存并退出)
如果编辑中有问题,按esc—>(进入底行模式)输入:q 不保存,只是退出
修改静态ip

改完内容之后需要重启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 +网卡名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

igfff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值