JDBC简单的优化连接数据库
来源:互联网 发布:win10安装网络打印机 编辑:程序博客网 时间:2024/06/05 14:19
知识点:
1、JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。J2SE的一部分,由java.sql,javax.sql包组成。
2、连接数据库步骤:(6部曲)
a、注册驱动 (只做一次):
Class.forName(“com.mysql.jdbc.Driver”); 推荐这种方式,不会对具体的驱动类产生依赖。DriverManager.registerDriver(com.mysql.jdbc.Driver); 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。System.setProperty(“jdbc.drivers”, “driver1:driver2”); 虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
b、建立连接(Connection) :
Connection conn = DriverManager.getConnection(url, user, password);url格式: JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…User,password可以用“属性名=属性值”方式告诉数据库;其他参数如:useUnicode=true&characterEncoding=GBK
c、创建执行SQL的语句(Statement):
d、执行语句:
Statement Statement st = conn.createStatement(); st.executeQuery(sql);PreparedStatement String sql = “select * from table_name where col_name=?”; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, “col_value”); ps.executeQuery();
e、处理执行结果(ResultSet):
ResultSet rs = statement.executeQuery(sql);While(rs.next()){ rs.getString(“col_name”); rs.getInt(“col_name”); //…}
f、释放资源:
释放ResultSet, Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放
1、Test.java(简单连接入门还有不足)
package com.jdbc;import java.sql.Connection;import java.sql.DriverAction;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class Test { public static void main(String[] args) throws ClassNotFoundException, SQLException { demo(); } static void demo() throws SQLException, ClassNotFoundException { // 1、下面是三种注册驱动的方法,(推荐第二种) // DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); // System.setProperty("jdbc,drivers", "com.mysql.jdbc.driver"); String url = "jdbc:mysql://localhost:3306/ghq"; String user = "root"; String password = "admin"; // 2、建立连接 Connection conn = DriverManager.getConnection(url, user, password); // 3、创建语句 Statement st = conn.createStatement(); // 4、执行语句 String sql = "select * from mytest"; ResultSet re = st.executeQuery(sql); // 打印输出语句 while (re.next()) { System.out.println(re.getInt("id") + re.getString("name") + re.getInt("age") + re.getDate("birthday")); } // 关闭资源 re.close(); st.close(); conn.close(); }}
2、建立jdbc的工具类(JdbcUtil.java)
package com.jdbc.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JdbcUtil { private static String url = "jdbc:mysql://localhost:3306/ghq"; private static String user = "root"; private static String password = "admin"; //静态代码块在加载虚拟机时只被虚拟机加载一次 static void demo() { try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(); } } //建立连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } //关闭资源(原则是后放进的先关闭) public static void closeTest(Connection conn, Statement st, ResultSet re) { //要用finally保证每个资都关闭 try { //判断re是否为空 if (re != null) re.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (st != null) st.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }}
2.1、CRUD.java(增删改查)
package com.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import com.jdbc.util.JdbcUtil;public class CRUD { private static String Csql = "insert into mytest(id,name,age,birthday) values ('4','woaini',20,'2008/09/09')"; private static String Dsql = "delete from mytest where id > 3"; private static String Usql = "update mytest set name = 'guanhuaqin' where id = 3"; private static String Rsql = "select id,name,age,birthday from mytest"; private static String url = "jdbc:mysql://localhost:3306/ghq"; private static String user = "root"; private static String password = "admin"; public static void main(String[] args) { // create(); // delete(); // update(); read(); } // 增加数据 static void create() { Connection conn = null; Statement st = null; ResultSet re = null; try { conn = DriverManager.getConnection(url, user, password); st = conn.createStatement(); // 返回的是关联到的数据条数 int i = st.executeUpdate(Csql); System.out.println("i = " + i); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, st, re); } } //删除数据 static void delete() { Connection conn = null; Statement st = null; ResultSet re = null; try { conn = DriverManager.getConnection(url, user, password); st = conn.createStatement(); int i = st.executeUpdate(Dsql); System.out.println(" i = " + i); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, st, re); } } //更新数据 static void update() { Connection conn = null; Statement st = null; ResultSet re = null; try { conn = DriverManager.getConnection(url, user, password); st = conn.createStatement(); int i = st.executeUpdate(Usql); System.out.println("i = " + i); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, st, re); } } //查找数据 static void read() { Connection conn = null; Statement st = null; ResultSet re = null; try { conn = DriverManager.getConnection(url, user, password); st = conn.createStatement(); re = st.executeQuery(Rsql); while (re.next()) { System.out .println(re.getInt("id") + re.getString("name") + re.getInt("age") + re.getString("birthday")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, st, re); } }}
2.2、SQLCRUD.java(对上面的例子优化)
优点:
1、解决了SQL注入问题
2、实现了简单的动态操作
package com.jdbc;import com.jdbc.util.*;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Date;public class SQLJdbcTest { public static void main(String[] args) throws SQLException { // 计算运行时间 long start = System.currentTimeMillis(); // sqlRead("zhangsan"); // sqlCreate("aaa", 100, new Date("2018/10/20")); // sqlUpdate("bbb"); sqlDelete("bbb"); long end = System.currentTimeMillis(); System.out.println("所用的时间是:" + (end - start)); } // 查看指点的数据 static void sqlRead(String name) { String sql = "select id,name,age,birthday from test where name = ?"; Connection conn = null; // 解决注入的问题 PreparedStatement ps = null; ResultSet re = null; try { conn = JdbcUtil.getConnection(); // 解决SQL注入问题:实现动态注入 ps = conn.prepareStatement(sql); // "1" 是指 第一个参数,name是要查的值。既是给占位符赋值 ps.setString(1, name); // 下面添加sql,如果添加了会报错 re = ps.executeQuery(); while (re.next()) { System.out.println(re.getInt("id") + "\t" + re.getString("name") + "\t" + re.getInt("age") + "\t" + re.getString("birthday")); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, ps, re); } } // 增加数据 static void sqlCreate(String name, int age, Date birthday) { Connection conn = null; PreparedStatement ps = null; ResultSet re = null; try { String sql = "insert into test(name,age,birthday) values (?,?,?)"; conn = JdbcUtil.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, name); ps.setInt(2, age); // 在util包下new date对象获得他的时间,在传给sql包下的Date。 /* * ava.util.Date 就是在除了SQL语句的情况下面使用 java.sql.Date * 是针对SQL语句使用的,它只包含日期而没有时间部分 它都有getTime方法返回毫秒数,自然就可以直接构建。 * java.util.Date 是 java.sql.Date 的父类(注意拼写) * 前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他 * 后者之后在读写数据库的时候用他,因为PreparedStament的setDate() * 的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date 转换是 * java.sql.Date date=new Java.sql.Date(); java.util.Date d=new * java.util.Date (date.getTime()); */ ps.setDate(3, new java.sql.Date(birthday.getTime())); int i = ps.executeUpdate(); System.out.println("i = " + i); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, ps, re); } } //更新数据 static void sqlUpdate(String name) { Connection conn = null; PreparedStatement ps = null; ResultSet re = null; try { String sql = "update test set name=? where id>7"; conn = JdbcUtil.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, name); int i = ps.executeUpdate(); System.out.println("i = " + i); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, ps, re); } } //删除数据 static void sqlDelete(String name) { Connection conn = null; PreparedStatement ps = null; ResultSet re = null; try { String sql = "delete from test where name = ?"; conn = JdbcUtil.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, name); int i = ps.executeUpdate(); System.out.println("i = " + i); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeTest(conn, ps, re); } }}
阅读全文
0 0
- JDBC简单的优化连接数据库
- 简单的JDBC连接数据库
- 简单JDBC连接数据库
- 简单JDBC连接数据库
- 简单的JDBC连接数据库代码
- 简单的JDBC连接数据库代码
- 简单的jdbc连接mysql数据库
- JDBC-数据库的连接和简单操作
- jdbc连接MySQL数据库的简单应用
- JDBC连接MySql数据库的简单例子
- 使用jdbc连接数据库的简单案例
- 简单的JDBC连接数据库实现
- jdbc连接数据库的优化和防止注入
- jdbc简单的连接
- jdbc数据库的连接
- JDBC数据库的连接
- 数据库的连接JDBC
- JDBC数据库的连接
- 接口设计思想
- mybatis中xml文件编写时需要注意的事项
- js错题集
- PAT 1036 跟奥巴马一起编程
- Java静态变量以及静态方法
- JDBC简单的优化连接数据库
- CentOS7上yum安装数据库服务器MySQL Community Server 5.7
- java 容器学习
- 布隆过滤器【BloomFilter】
- java double数据保留两位小数的4中方法
- Mysql几种索引类型的区别及适用情况
- Mysql-索引-BTree类型【精简版】
- CodeForces-626C Block Towers 二分例题 & 贪心
- 字符流中第一个不重复的字符