java:基础,JDBC,AOP

Java 入门之3:JDK 8 版本的目录结构及bin目录中工具命令的作用概览

1. java Date中方法toLocaleString过时的替代方案

现在toLocaleString()方法已过时,由DateFormat.format(Date date)取代。
DateFormat ddf = DateFormat.getDateInstance();
DateFormat dtf = DateFormat.getTimeInstance();
DateFormat ddtf = DateFormat.getDateTimeInstance();
Date date = new Date();
System.out.println(“日期:” + ddf.format(date));
System.out.println(“时间:” + dtf.format(date));
System.out.println(“日期时间:” + ddtf.format(date));
SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateTimeInstance();
System.out.println(“日期时间:” + sdf.format(date));

2.mysql 连接

utf8mb4比utf8多了emoji编码支持.
使用了Mysql Connector/J 6.x以上的版本,在配置url的时候不能简单写成 : jdbc:mysql://localhost:3306/yzu 而是要写成 : jdbc:mysql://localhost:3306/yzu?serverTimezone=UTC
北京时间使用 Asia/Shanghai

5.x版本的驱动文件jar包对应的是:
Class.forName(“com.mysql.jdbc.Driver”);
语句来加载数据库驱动

8.0x版本的驱动文件jar包对应的是:
Class.forName(“com.mysql.cj.jdbc.Driver”);

mysql8.x使用url连接,写utf8mb4会报错,原因如下:
jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8

Java语言里面所实现的UTF-8编码就是支持4字节的,所以不需要配置 mb4 这样的字眼,但如果从MySQL读写emoji,MySQL驱动版本要在 5.1.13 及以上版本,数据库连接依然是 characterEncoding=UTF-8 。

但还没完,遇到一个大坑。官方手册 里还有这么一段话:

Connector/J did not support utf8mb4 for servers 5.5.2 and newer.

Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed
using characterEncoding=… as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)

意思是,java驱动会自动检测服务端 character_set_server 的配置,如果为utf8mb4,驱动在建立连接的时候设置 SET NAMES utf8mb4。然而其他语言没有依赖于这样的特性。

3.JDBC

  • statement会有sql注入问题,使用PreparedStatement
    MySQL驱动版本不同,驱动名有差异

      //使用jdbc.properties配置文件
       Class.forName("com.mysql.cj.jdbc.Driver");
          Properties properties = new Properties();
          InputStream resourceAsStream = JDBCutils.class.getClassLoader().getResourceAsStream("jdbc.properties");
          properties.load(resourceAsStream);
         String url = properties.getProperty("url");
         String user = properties.getProperty("user");
         String password = properties.getProperty("password");
         Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8", "root", "mysql3306");
      String sql = "select * from user_info where username=? and password=?";
      PreparedStatement preparedStatement = connection.prepareStatement(sql);
      preparedStatement.setString(1,"紫烟‘ --");
      preparedStatement.setString(2,"asd123");
      ResultSet resultSet = preparedStatement.executeQuery();
     if(resultSet.next()){
         System.out.println("登录成功");
      }else{
         System.out.println("登录失败");
     }
     //释放资源
      if (statement != null) {
          try {
              statement.close();
          } catch ( SQLException sqlex) {
    
              statement = null;
          }
    
      }
    
      if (connection != null) {
          try {
              connection.close();
          } catch (SQLException sqlex) {
              connection = null;
          }
      }
    
      if (resultSet != null) {
          try {
              resultSet.close();
          } catch (SQLException sqlex) {
              resultSet = null;
          }
      }
    

    //c3p0使用

      @Test
    public void testPool() throws PropertyVetoException, SQLException {
      ComboPooledDataSource cpds = new ComboPooledDataSource();
      cpds.setDriverClass( "com.mysql.cj.jdbc.Driver" ); //loads the jdbc driver
      cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8" );
      cpds.setUser("root");
      cpds.setPassword("mysql3306");
      Connection connection = cpds.getConnection();
      System.out.println(connection);
      connection.close();
    }
    
  • C3P0:
    c3p0-config.xml 名称必须是固定,必须放在resources下面。编码写在配置文件第一行
    new ComboPooledDataSource(); 通常一个程序只会创建一个连接池
    ```

      <c3p0-config encoding="UTF-8">
       <default-config>
      <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=UTC</property>
      <property name="user">root</property>
      <property name="password">mysql3306</property>
    
      <property name="automaticTestTable">con_test</property>
      <property name="checkoutTimeout">30000</property>
      <property name="idleConnectionTestPeriod">30</property>
      <property name="initialPoolSize">10</property>
      <property name="maxIdleTime">30</property>
      <property name="maxPoolSize">100</property>
      <property name="minPoolSize">10</property>
      <property name="maxStatements">200</property>
     </default-config>
      </c3p0-config>
    
  • commons-dbutils,通常使用的jar包
    QueryRunner(池子)
    update(sql,params…)

4.JDBCutils.java

package com.demo.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**

* @Description: 抽取工具类
*
* 1. 注册驱动
*
* 2.对外提供:获取连接的方法
*
* 3.对外提供: 释放资源的方法
*/
public class JDBCUtils {
   //一个程序中,通常只会有一个池子
   private static ComboPooledDataSource dataSource = new ComboPooledDataSource();


   //返回连接池
   public static DataSource getDataSource(){
       return dataSource;
   }
   /**
    * @return  获取连接对象的方法
    * @throws Exception
    */
   public static Connection getConnection() throws Exception {
       //从连接池中去获取

       return dataSource.getConnection();
   }
   /**
    * 释放资源
    */
   public static void release(Connection connection,Statement statement){
       release(connection,statement,null);
   }

   /**
    *  释放资源的方法
    */
   public static void release(Connection connection, Statement statement, ResultSet resultSet) {

       if (resultSet != null) {
           try {
               resultSet.close();
           } catch (SQLException sqlEx) { // ignore }
               resultSet = null;  //GC 垃圾回收器, 让回收器尽快回收
           }
       }

       if (statement != null) {
           try {
               statement.close();
           } catch (SQLException sqlEx) { // ignore }
               statement = null;
           }
       }

       if (connection != null) {
           try {
               connection.close();
           } catch (SQLException sqlEx) { // ignore }
               connection = null;
           }
       }
   }
}

5.AOP

不改动源码的情况下,对原有功能进行扩展或增强
装饰者模式和代理模式可以实现,spring框架AOP使用动态代理。因为装饰者模式和静态代理都需要写扩展类

1. 动态代理实现方式

  • JDK
  • Cglib
    如果真实类是一个普通类,没有实现接口,那么就采用这种方式, 创建出来真实类的子类作为代理类。

2.AspectJ

AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值