满汉楼01-24.功能实现014.1导入驱动和工具类4.1.1导入驱动

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

4.1.2导入工具类Utility

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

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

package com.hspedu.mhl.utils;/**工具类的作用:处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。*/import java.util.*;/***/public class Utility {//静态属性。。。    private static Scanner scanner = new Scanner(System.in);        /**     * 功能:读取键盘输入的一个菜单选项,值:1——5的范围     * @return 1——5     */public static char readMenuSelection() {        char c;        for (; ; ) {            String str = readKeyBoard(1, false);//包含一个字符的字符串            c = str.charAt(0);//将字符串转换成字符char类型            if (c != '1' && c != '2' &&                 c != '3' && c != '4' && c != '5') {                System.out.print("选择错误,请重新输入:");            } else break;        }        return c;    }/** * 功能:读取键盘输入的一个字符 * @return 一个字符 */    public static char readChar() {        String str = readKeyBoard(1, false);//就是一个字符        return str.charAt(0);    }    /**     * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符     * @param defaultValue 指定的默认值     * @return 默认值或输入的字符     */        public static char readChar(char defaultValue) {        String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符        return (str.length() == 0) ? defaultValue : str.charAt(0);    }    /**     * 功能:读取键盘输入的整型,长度小于2位     * @return 整数     */    public static int readInt() {        int n;        for (; ; ) {            String str = readKeyBoard(2, false);//一个整数,长度 Y n=>N            String str = readKeyBoard(1, false).toUpperCase();            c = str.charAt(0);            if (c == 'Y' || c == 'N') {                break;            } else {                System.out.print("选择错误,请重新输入:");            }        }        return c;    }    /**     * 功能: 读取一个字符串     * @param limit 读取的长度     * @param blankReturn 如果为true ,表示 可以读空字符串。      *   如果为false表示 不能读空字符串。     *  *如果输入为空,或者输入大于limit的长度,就会提示重新输入。     * @return     */    private static String readKeyBoard(int limit, boolean blankReturn) {        //定义了字符串String line = "";//scanner.hasNextLine() 判断有没有下一行        while (scanner.hasNextLine()) {            line = scanner.nextLine();//读取这一行           //如果line.length=0, 即用户没有输入任何内容,直接回车if (line.length() == 0) {                if (blankReturn) return line;//如果blankReturn=true,可以返回空串                else continue; //如果blankReturn=false,不接受空串,必须输入内容            }//如果用户输入的内容大于了 limit,就提示重写输入  //如果用户如的内容 >0 <= limit ,我就接受            if (line.length()  limit) {                System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");                continue;            }            break;        }        return line;    }}

4.1.3导入工具类JDBCUtilsByDruid

package li.dao_.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * 基于Druid数据库连接池的工具类 */public class JDBCUtilsByDruid {    private static DataSource ds;    //在静态代码块完成ds的初始化    //静态代码块在加载类的时候只会执行一次,因此数据源也只会初始化一次    static {        Properties properties = new Properties();        try {            properties.load(new FileInputStream("src\\druid.properties"));            ds = DruidDataSourceFactory.createDataSource(properties);        } catch (Exception e) {            e.printStackTrace();        }    }    //编写getConnection方法    public static Connection getConnection() throws SQLException {        return ds.getConnection();    }    //关闭连接(注意:在数据库连接池技术中,close不是真的关闭连接,而是将Connection对象放回连接池中)    public static void close(ResultSet resultSet, Statement statemenat, Connection connection) {        try {            if (resultSet != null) {                resultSet.close();            }            if (statemenat != null) {                statemenat.close();            }            if (connection != null) {                connection.close();            }        } catch (SQLException e) {            throw new RuntimeException(e);        }    }}
  • 德鲁伊的配置文件,放在src目录下
#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mhl?rewriteBatchedStatements=true#url=jdbc:mysql://localhost:3306/mhlusername=rootpassword=123456#initial connection SizeinitialSize=10#min idle connecton sizeminIdle=5#max active connection sizemaxActive=50#max wait time (5000 mil seconds) maxWait=5000

4.1.4导入BasicDAO

package com.li.mhl.dao;import com.li.mhl.utils.JDBCUtilsByDruid;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;import java.sql.SQLException;import java.util.List;/** * 开发BasicDAO,是其他DAO的父类 */public class BasicDAO {//泛型指定具体的类型    private QueryRunner qr = new QueryRunner();    //开发通用的dml方法,针对任意的表    /**     * @param sql        传入的SQL语句,可以有占位符?     * @param parameters 传入占位符?的具体的值,可以是多个     * @return 返回的值是受影响的行数     */    public int update(String sql, Object... parameters) { //可变参数 Object… parameters        Connection connection = null;        try {            connection = JDBCUtilsByDruid.getConnection();            int update = qr.update(connection, sql, parameters);            return update;        } catch (SQLException e) {            throw new RuntimeException(e);//将一个编译异常转变为运行异常        } finally {            JDBCUtilsByDruid.close(null, null, connection);        }    }    //返回多个对象(即查询的结果是多行),针对任意的表(多行多列)    /**     * @param sql        传入的SQL语句,可以有占位符?     * @param clazz      传入一个类的Class对象,比如 Actor.class[底层需要通过反射来创建Javabean对象]     * @param parameters 传入占位符?的具体的值,可以是多个     * @return 根据传入的class对象 Xxx.class 返回对应的ArrayList集合     */    public List queryMulti(String sql, Class clazz, Object... parameters) {        Connection connection = null;        try {            connection = JDBCUtilsByDruid.getConnection();            return qr.query(connection, sql, new BeanListHandler(clazz), parameters);        } catch (SQLException e) {            throw new RuntimeException(e);//将一个编译异常转变为运行异常        } finally {            JDBCUtilsByDruid.close(null, null, connection);        }    }    //查询单行结果 的通用方法(单行多列)    public T querySingle(String sql, Class clazz, Object... parameters) {        Connection connection = null;        try {            connection = JDBCUtilsByDruid.getConnection();            return qr.query(connection, sql, new BeanHandler(clazz), parameters);        } catch (SQLException e) {            throw new RuntimeException(e);//将一个编译异常转变为运行异常        } finally {            JDBCUtilsByDruid.close(null, null, connection);        }    }    //查询单行单列的方法,即返回单值的方法    public Object queryScalar(String sql, Object... parameters) {        Connection connection = null;        try {            connection = JDBCUtilsByDruid.getConnection();            return qr.query(connection, sql, new ScalarHandler(), parameters);        } catch (SQLException e) {            throw new RuntimeException(e);//将一个编译异常转变为运行异常        } finally {            JDBCUtilsByDruid.close(null, null, connection);        }    }}

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