满汉楼01-2

4.功能实现01

4.1导入驱动和工具类

4.1.1导入驱动

首先将连接mysql的相关jar包引入项目中,分别右键,点击add as library

4.1.2导入工具类Utility

准备工具类Utility,提高开发效率,并搭建整个项目的整体架构

在实际开发中,公司都会提供相应的工具类和开发库,可以提高效率

  1. package com.hspedu.mhl.utils;
  2. /**
  3. 工具类的作用:
  4. 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
  5. */
  6. import java.util.*;
  7. /**
  8. */
  9. public class Utility {
  10. //静态属性。。。
  11. private static Scanner scanner = new Scanner(System.in);
  12. /**
  13. * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
  14. * @return 1——5
  15. */
  16. public static char readMenuSelection() {
  17. char c;
  18. for (; ; ) {
  19. String str = readKeyBoard(1, false);//包含一个字符的字符串
  20. c = str.charAt(0);//将字符串转换成字符char类型
  21. if (c != '1' && c != '2' &&
  22. c != '3' && c != '4' && c != '5') {
  23. System.out.print("选择错误,请重新输入:");
  24. } else break;
  25. }
  26. return c;
  27. }
  28. /**
  29. * 功能:读取键盘输入的一个字符
  30. * @return 一个字符
  31. */
  32. public static char readChar() {
  33. String str = readKeyBoard(1, false);//就是一个字符
  34. return str.charAt(0);
  35. }
  36. /**
  37. * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
  38. * @param defaultValue 指定的默认值
  39. * @return 默认值或输入的字符
  40. */
  41. public static char readChar(char defaultValue) {
  42. String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
  43. return (str.length() == 0) ? defaultValue : str.charAt(0);
  44. }
  45. /**
  46. * 功能:读取键盘输入的整型,长度小于2位
  47. * @return 整数
  48. */
  49. public static int readInt() {
  50. int n;
  51. for (; ; ) {
  52. String str = readKeyBoard(2, false);//一个整数,长度<=2位
  53. try {
  54. n = Integer.parseInt(str);//将字符串转换成整数
  55. break;
  56. } catch (NumberFormatException e) {
  57. System.out.print("数字输入错误,请重新输入:");
  58. }
  59. }
  60. return n;
  61. }
  62. /**
  63. * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
  64. * @param defaultValue 指定的默认值
  65. * @return 整数或默认值
  66. */
  67. public static int readInt(int defaultValue) {
  68. int n;
  69. for (; ; ) {
  70. String str = readKeyBoard(10, true);
  71. if (str.equals("")) {
  72. return defaultValue;
  73. }
  74. //异常处理...
  75. try {
  76. n = Integer.parseInt(str);
  77. break;
  78. } catch (NumberFormatException e) {
  79. System.out.print("数字输入错误,请重新输入:");
  80. }
  81. }
  82. return n;
  83. }
  84. /**
  85. * 功能:读取键盘输入的指定长度的字符串
  86. * @param limit 限制的长度
  87. * @return 指定长度的字符串
  88. */
  89. public static String readString(int limit) {
  90. return readKeyBoard(limit, false);
  91. }
  92. /**
  93. * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
  94. * @param limit 限制的长度
  95. * @param defaultValue 指定的默认值
  96. * @return 指定长度的字符串
  97. */
  98. public static String readString(int limit, String defaultValue) {
  99. String str = readKeyBoard(limit, true);
  100. return str.equals("")? defaultValue : str;
  101. }
  102. /**
  103. * 功能:读取键盘输入的确认选项,Y或N
  104. * 将小的功能,封装到一个方法中.
  105. * @return Y或N
  106. */
  107. public static char readConfirmSelection() {
  108. System.out.print("确认是否预订(Y/N): ");
  109. char c;
  110. for (; ; ) {//无限循环
  111. //在这里,将接受到字符,转成了大写字母
  112. //y => Y n=>N
  113. String str = readKeyBoard(1, false).toUpperCase();
  114. c = str.charAt(0);
  115. if (c == 'Y' || c == 'N') {
  116. break;
  117. } else {
  118. System.out.print("选择错误,请重新输入:");
  119. }
  120. }
  121. return c;
  122. }
  123. /**
  124. * 功能: 读取一个字符串
  125. * @param limit 读取的长度
  126. * @param blankReturn 如果为true ,表示 可以读空字符串。
  127. * 如果为false表示 不能读空字符串。
  128. *
  129. * 如果输入为空,或者输入大于limit的长度,就会提示重新输入。
  130. * @return
  131. */
  132. private static String readKeyBoard(int limit, boolean blankReturn) {
  133. //定义了字符串
  134. String line = "";
  135. //scanner.hasNextLine() 判断有没有下一行
  136. while (scanner.hasNextLine()) {
  137. line = scanner.nextLine();//读取这一行
  138. //如果line.length=0, 即用户没有输入任何内容,直接回车
  139. if (line.length() == 0) {
  140. if (blankReturn) return line;//如果blankReturn=true,可以返回空串
  141. else continue; //如果blankReturn=false,不接受空串,必须输入内容
  142. }
  143. //如果用户输入的内容大于了 limit,就提示重写输入
  144. //如果用户如的内容 >0 <= limit ,我就接受
  145. if (line.length() < 1 || line.length() > limit) {
  146. System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
  147. continue;
  148. }
  149. break;
  150. }
  151. return line;
  152. }
  153. }

4.1.3导入工具类JDBCUtilsByDruid

  1. package li.dao_.utils;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import javax.sql.DataSource;
  4. import java.io.FileInputStream;
  5. import java.sql.Connection;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.util.Properties;
  10. /**
  11. * 基于Druid数据库连接池的工具类
  12. */
  13. public class JDBCUtilsByDruid {
  14. private static DataSource ds;
  15. //在静态代码块完成ds的初始化
  16. //静态代码块在加载类的时候只会执行一次,因此数据源也只会初始化一次
  17. static {
  18. Properties properties = new Properties();
  19. try {
  20. properties.load(new FileInputStream("src\\druid.properties"));
  21. ds = DruidDataSourceFactory.createDataSource(properties);
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. //编写getConnection方法
  27. public static Connection getConnection() throws SQLException {
  28. return ds.getConnection();
  29. }
  30. //关闭连接(注意:在数据库连接池技术中,close不是真的关闭连接,而是将Connection对象放回连接池中)
  31. public static void close(ResultSet resultSet, Statement statemenat, Connection connection) {
  32. try {
  33. if (resultSet != null) {
  34. resultSet.close();
  35. }
  36. if (statemenat != null) {
  37. statemenat.close();
  38. }
  39. if (connection != null) {
  40. connection.close();
  41. }
  42. } catch (SQLException e) {
  43. throw new RuntimeException(e);
  44. }
  45. }
  46. }
  • 德鲁伊的配置文件,放在src目录下
  1. #key=value
  2. driverClassName=com.mysql.jdbc.Driver
  3. url=jdbc:mysql://localhost:3306/mhl?rewriteBatchedStatements=true
  4. #url=jdbc:mysql://localhost:3306/mhl
  5. username=root
  6. password=123456
  7. #initial connection Size
  8. initialSize=10
  9. #min idle connecton size
  10. minIdle=5
  11. #max active connection size
  12. maxActive=50
  13. #max wait time (5000 mil seconds)
  14. maxWait=5000

4.1.4导入BasicDAO

  1. package com.li.mhl.dao;
  2. import com.li.mhl.utils.JDBCUtilsByDruid;
  3. import org.apache.commons.dbutils.QueryRunner;
  4. import org.apache.commons.dbutils.handlers.BeanHandler;
  5. import org.apache.commons.dbutils.handlers.BeanListHandler;
  6. import org.apache.commons.dbutils.handlers.ScalarHandler;
  7. import java.sql.Connection;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * 开发BasicDAO,是其他DAO的父类
  12. */
  13. public class BasicDAO<T> {//泛型指定具体的类型
  14. private QueryRunner qr = new QueryRunner();
  15. //开发通用的dml方法,针对任意的表
  16. /**
  17. * @param sql 传入的SQL语句,可以有占位符?
  18. * @param parameters 传入占位符?的具体的值,可以是多个
  19. * @return 返回的值是受影响的行数
  20. */
  21. public int update(String sql, Object... parameters) { //可变参数 Object… parameters
  22. Connection connection = null;
  23. try {
  24. connection = JDBCUtilsByDruid.getConnection();
  25. int update = qr.update(connection, sql, parameters);
  26. return update;
  27. } catch (SQLException e) {
  28. throw new RuntimeException(e);//将一个编译异常转变为运行异常
  29. } finally {
  30. JDBCUtilsByDruid.close(null, null, connection);
  31. }
  32. }
  33. //返回多个对象(即查询的结果是多行),针对任意的表(多行多列)
  34. /**
  35. * @param sql 传入的SQL语句,可以有占位符?
  36. * @param clazz 传入一个类的Class对象,比如 Actor.class[底层需要通过反射来创建Javabean对象]
  37. * @param parameters 传入占位符?的具体的值,可以是多个
  38. * @return 根据传入的class对象 Xxx.class 返回对应的ArrayList集合
  39. */
  40. public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {
  41. Connection connection = null;
  42. try {
  43. connection = JDBCUtilsByDruid.getConnection();
  44. return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);
  45. } catch (SQLException e) {
  46. throw new RuntimeException(e);//将一个编译异常转变为运行异常
  47. } finally {
  48. JDBCUtilsByDruid.close(null, null, connection);
  49. }
  50. }
  51. //查询单行结果 的通用方法(单行多列)
  52. public T querySingle(String sql, Class<T> clazz, Object... parameters) {
  53. Connection connection = null;
  54. try {
  55. connection = JDBCUtilsByDruid.getConnection();
  56. return qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);
  57. } catch (SQLException e) {
  58. throw new RuntimeException(e);//将一个编译异常转变为运行异常
  59. } finally {
  60. JDBCUtilsByDruid.close(null, null, connection);
  61. }
  62. }
  63. //查询单行单列的方法,即返回单值的方法
  64. public Object queryScalar(String sql, Object... parameters) {
  65. Connection connection = null;
  66. try {
  67. connection = JDBCUtilsByDruid.getConnection();
  68. return qr.query(connection, sql, new ScalarHandler(), parameters);
  69. } catch (SQLException e) {
  70. throw new RuntimeException(e);//将一个编译异常转变为运行异常
  71. } finally {
  72. JDBCUtilsByDruid.close(null, null, connection);
  73. }
  74. }
  75. }

进过测试,工具类使用正常

day01-2-导入驱动和工具类的更多相关文章

  1. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  2. 关于Excel导入导出POI工具类

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import ...

  3. 封装List集合一个批量导入数据库的工具类

    public class CommonDal { #region 数据导入相关 /// <summary> /// 批量导入数据 /// </summary> /// < ...

  4. NPOI导入导出Excel工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...

  5. 导入导出Excel的Java工具类ExcelUtil

    在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...

  6. Workbook导出excel封装的工具类

    在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...

  7. DESede对称加密算法工具类

    利用Cipher的核心功能,自己封装了一个加密解密的工具类,可以直接使用.在使用之前需要先下载commons-codec-1.9.jar,并导入项目. 工具类如下: package com.pcict ...

  8. 导入导出封装的工具类 (一) 利用POI封装

    对于导入导出各个项目中差点儿都会用到,记得在高校平台中封装过导入导出这部分今天看了看是利用JXL封装的而经理说让我用POI写写导出,这两个导入导出框架是眼下比較流程和经常使用的框架,有必要都了解一下. ...

  9. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  10. 工具类:Colletions ,Arrays(静态导入,可变参数,强循环)

    一.Collecti 专门用来操作集合的工具类,没有构造函数,全静态方法. 常用方法: static <T extends Comparable<? super T>> voi ...

随机推荐

  1. iOS 常用命令行工具总结

    平时工作中会经常用到命令行工具Command Lines Tool.而Command Line Tool本质是一个命令行工具包,内部有很多有用的工具,如Apple LLVM compiler.Make ...

  2. Vue核心概念与其指令

    Vue简述 Vue是一套构建用户UI界面的前端框架. 构建用户界面的意思是:往html中填充数据,框架的意思是:一套开发规范.   Vue的特点 1.数据驱动视图 当页面是一个普通的数据展示时,数据改 ...

  3. Node工程使用云服务器中的redis镜像做数据库

      Redis镜像安装 在云服务器中执行指令 docker pull redis 添加redis镜像实例的配置 [root@VM-0-11-centos ~]# cd /home [root@VM-0 ...

  4. 【双指针】双指针算法详解两道经典OJ【力扣27,力扣26,力扣38】超详细算法教程

    [双指针]双指针算法详解两道经典OJ[力扣27,力扣26,力扣38]超详细算法教程 今天又又到了我们刷力扣题的时间啦! 今天博主给大家带来的三道题是: 27. 移除元素 26. 删除有序数组中的重复项 ...

  5. P10009 [集训队互测 2022] 线段树 题解

    题目链接:P10009 [集训队互测 2022] 线段树 神仙分块题,先给一下出题人的神仙官解: 官解链接 前面还看得懂.后面是啥?这不是 ds 题咋和 dp.轮廓线扯上关系了.看了半天,还是这个启发 ...

  6. Markdown Rules 详解

    使用VSCode编写Markdown文件时,建议安装插件markdownlint,它可以帮助自己更加规范的写文章. 下面是所有的markdown语法错误信息以便纠错. Rules文档 Markdown ...

  7. Java 如何在日志中优雅的打印 Exception

    一.使用 log 库打印 使用 log 库如 slf4j @Slf4j public class MyDemo { public void demo() { try { int a = 10 / 0; ...

  8. MySQL最左匹配原则

    最左匹配原则都是针对联合索引来说的,那么为什么要使用联合索引呢? 一.为什么要使用联合索引? 1.减少开销. 建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,c ...

  9. 多线程系列(二) -Thread类使用详解

    一.简介 在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用 CPU 资源,显著的提升程序的执行效率. 其中java.lang.Thread是 Java 实现多 ...

  10. Linux 中hdparm命令使用说明——带实例

    详解Linux中hdparm命令查看硬盘信息的用法 功能说明:显示与设定硬盘的参数. 语 法:hdparm [-CfghiIqtTvyYZ][-a ][-A <0或1>][-c ][-d ...