static final String DB_URL = jdbc:mysql://localhost:3306/facesho?useSSL=false&serverTimezone=UTC;
conn = DriverManager.getConnection(DB_URL,USER,PASS);
原本的驱动器是:
Class.forName("com.mysql.jdbc.Driver");
在 IDEA 里面提示是:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary
1431Java MySQL 连接
MySQL 8.0 以上版本:
驱动包版本 mysql-connector-java-8.0.12.jar。
数据库 URL 需要声明是否使用 SSL 安全验证及指定服务器上的时区:
原本的驱动器是:
Class.forName("com.mysql.jdbc.Driver");在 IDEA 里面提示是:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary
意思是说原本的驱动器不赞成 或者 是废弃了,自动换成了新的驱动器 com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.cj.jdbc.Driver");1430Java MySQL 连接
DAO 模式
DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
对外提供相应的接口
在面向对象设计过程中,有一些"套路”用于解决特定问题称为模式。DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。
从以上 DAO 模式使用可以看出,DAO 模式的优势就在于它实现了两次隔离。
一个典型的DAO 模式主要由以下几部分组成。
DAO 接口:
public interface PetDao { /** * 查询所有宠物 */ List<Pet> findAllPets() throws Exception; }DAO 实现类:
public class PetDaoImpl extends BaseDao implements PetDao { /** * 查询所有宠物 */ public List<Pet> findAllPets() throws Exception { Connection conn=BaseDao.getConnection(); String sql="select * from pet"; PreparedStatement stmt= conn.prepareStatement(sql); ResultSet rs= stmt.executeQuery(); List<Pet> petList=new ArrayList<Pet>(); while(rs.next()) { Pet pet=new Pet( rs.getInt("id"), rs.getInt("owner_id"), rs.getInt("store_id"), rs.getString("name"), rs.getString("type_name"), rs.getInt("health"), rs.getInt("love"), rs.getDate("birthday") ); petList.add(pet); } BaseDao.closeAll(conn, stmt, rs); return petList; } }宠物实体类(里面get/set方法就不列出了)
public class Pet { private Integer id; private Integer ownerId; //主人ID private Integer storeId; //商店ID private String name; //姓名 private String typeName; //类型 private int health; //健康值 private int love; //爱心值 private Date birthday; //生日 }连接数据库
public class BaseDao { private static String driver="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql://127.0.0.1:3306/epet"; private static String user="root"; private static String password="root"; static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException { if(rs!=null) { rs.close(); } if(stmt!=null) { stmt.close(); } if(conn!=null) { conn.close(); } } public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException { Connection conn = null; PreparedStatement pstmt = null; /* 处理SQL,执行SQL */ try { conn = getConnection(); // 得到数据库连接 pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象 if (param != null) { for (int i = 0; i < param.length; i++) { pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数 } } ResultSet num = pstmt.executeQuery(); // 执行SQL语句 } catch (SQLException e) { e.printStackTrace(); // 处理SQLException异常 } finally { try { BaseDao.closeAll(conn, pstmt, null); } catch (SQLException e) { e.printStackTrace(); } } return 0; } }1429Java 文档注释
看到这里觉得可以分享一下自己的注释,其实很多注释是可以自定义的。
定义成模板在自己的 IDE 上,这样每次通过快捷键就可自动帮你输出在方法中,省去了很多时间,也使代码更加规范。
下面已 eclipse 为例,分析一下自己的。
我是加载了 JAutodoc 插件在 IDE 中,习惯这种格式的小伙伴也可以去下载一下。
首先是在文件头部添加:
/* * <p>项目名称: ${project_name} </p> * <p>文件名称: ${file_name} </p> * <p>描述: [类型描述] </p> * <p>创建时间: ${date} </p> * <p>公司信息: ************公司 *********部</p> * @author <a href="mail to: *******@******.com" rel="nofollow">作者</a> * @version v1.0 * @update [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] */方法:
/** * @Title:${enclosing_method} * @Description: [功能描述] * @Param: ${tags} * @Return: ${return_type} * @author <a href="mail to: *******@******.com" rel="nofollow">作者</a> * @CreateDate: ${date} ${time}</p> * @update: [序号][日期YYYY-MM-DD] [更改人姓名][变更描述] */getter 和 setter
/** * 获取 ${bare_field_name} */ /** * 设置 ${bare_field_name} * (${param})${field} */1428Java 多线程编程
线程安全问题
产生原因:多个线程竞争同一资源(访问同一数据),可参考经典的生产者消费者问题。
解决方案:
run 方法内:同步代码块 synchronized {}
Public synchronized 返回值类型 方法名(){} 自动释放对象锁使用 Lock 锁
Lock 锁需要程序员(在 finally 代码块中)手动释放。
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作,是 JDK1.5 之后出现的。
Lock 接口中的方法:
Lock 接口的实现类:
使用步骤:
public class RunnableImpl implements Runnable{ //定义一个共享的票源 private int ticket = 100; //1.在成员位置创建一个ReentrantLock对象 Lock l = new ReentrantLock(); //设置线程任务:卖票 @Override public void run() { //使用死循环,让卖票重复的执行 while(true){ //2.在可能出现线程安全问题的代码前,调用Lock接口中的方法lock获取锁对象 l.lock(); //判断票是否大于0 if(ticket>0){ //为了提高线程安全问题出现的几率,让程序睡眠10毫秒 try { //可能会产生异常的代码 Thread.sleep(10); //进行卖票 ticket-- System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票!"); ticket--; } catch (InterruptedException e) { //异常的处理逻辑 e.printStackTrace(); }finally { //一定会执行的代码,一般用于资源释放(资源回收) //3.在可能出现线程安全问题的代码后,调用Lock接口中的方法unlock释放锁对象 l.unlock();//无论程序是否有异常,都让锁对象释放掉,节约内存,提高程序的效率 } } } } }1427Java 多线程编程
线程状态图:

线程共包括以下 5 种状态:1. 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3. 运行状态(Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4. 阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
5. 死亡状态(Dead): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。