1.JDBC概述
是Java和数据库之间的一个桥梁
是一个规范而不是一个实现,能够执行SQL语句
它由一组用Java语言编写的类和接口组成
各种不同类型的数据库都有相应的实现的
2.配置JDBC JDBC-Connector下载地址 ,若MySQL版本为8以上,则下载版本为8以上的驱动
导入IDEA的Global Libraries每个Moudles使用时只需调用即可
3.建立连接 1 2 Class.forName("com.mysql.jdbc.Driver" );
1 2 3 4 String url = "jdbc:mysql://localhost:3306/数据库名称?userUnicode=true&characterEncoding=字符集&useSSL=true" ;String name = "用户名" ;String pass = "密码" ;
1 2 Connection con = DriverManager.getConnection(url, name, pass);
1 2 Statement statement = con.createStatement();
1 2 String sql = "这里写sql语句" ;
1 2 ResultSet resultSet = statement.executeQuery(sql);
1 2 3 4 while (resultSet.next()){ System.out.println(resultSet.getXxx("字段名" )); }
1 2 3 4 resultSet.close(); statement.close(); con.close();
4.Utils类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 private static String driver = null ,String url = null ;private static String username = null ,String password = null ;static { InputStream in = 本类类名.class.getClassLoader().getResourceAsStream("配置文件名.properties" ); Properties pis = new Properties (); pis.load(in); driver = pis.getProperty("driver" ); url = pis.getProperty("url" ); username = pis.getProperty("username" ); password = pis.getProperty("password" ); Class.forName(driver); }
1 2 3 4 public static Connection getConnection () throws Exception{ return DriverManager.getConnection(url, username, password); }
1 2 3 4 5 6 7 public static void CloseConnection (Connection con, Statement sta, ResultSet rst) { con.close(); sta.close(); rst.close(); }
5.SQL注入
Statement主要用于向数据库发送sql语句
增删改使用excute update
查询使用excute query
excute以上都可,执行时间会增长
PreparedStatement和statement的区别
前者更安全不会被sql注入,后者则相反
同时前者继承了后者
5.1Statement使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public void loginTest () throws Exception { user_login(" 'or ' 1=1" ,"'or ' 1=1" ); }public void user_login (String name,String pass) throws Exception{ Connection con = JDBC_Util.getConnection(); Statement statement = con.createStatement(); String sql = "select * from 数据库.表名 where 字段名 ='" +name+"' and 字段名='" +pass+"'" ; ResultSet rss = statement.executeQuery(sql); while (rss.next()){ System.out.println(rss.getObject("NAME" )); System.out.println(rss.getObject("PASSWORD" )); } JDBC_Util.CloseConnection(con,statement,rss); }
5.2PreparedStatement使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public static void user_login (String name,String password) throws Exception { Connection con = JDBC_Util.getConnection(); String sql = "select * from jdbcstudy.users where name =? and password=?" ; PreparedStatement pst = con.prepareStatement(sql); pst.setString(1 ,name); pst.setString(2 ,password); ResultSet rst = pst.executeQuery(); if (rst.next()){ System.out.println(rst.getObject("NAME" )); }else { System.out.println("检验失败,请重新核对你的信息!!!" ); } JDBC_Util.CloseConnection(con,pst,rst); }
6.DCBP连接池
DBCP是Apche提供的一个数据库连接池
我们在连接数据库时直接设置好配置文件
通过对应的三个jar包中提供的类和方法直接调用即可
commons-dbcp 、commons-logging 、commons-pool
导入方式和开头提及的JDBC导入方式相似
6.1DCBP工具类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 private static DataSource dse = null ;static { InputStream in = 本类类名.class.getClassLoader().getResourceAsStream("配置文件名.properties" ); Properties pis = new Properties (); pis.load(in); dse = BasicDataSourceFactory.createDataSource(pis); }public static Connection getConnection () throws Exception{ return dse.getConnection() }public static void CloseConnection (Connection con, Statement sta, ResultSet rst) { con.close(); sta.close(); rst.close(); }
6.2properties文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=true username=root password=123456 # initialSize=10 #最大连接数量 maxActive=50 # maxIdle=20 # minIdle=5 # maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】 #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=UTF8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED