JavaWeb-JDBC-1-不仅仅只是连接
来源:互联网 发布:汤臣倍健 鱼油 知乎 编辑:程序博客网 时间:2024/05/17 19:19
有位教育家说得好:教育的真正目的就是让你忘掉你所学的所有之后还剩下的东西。在技术行业好像尤其如此,忘掉所学的所有技能,还剩下什么呢?
JDBC——Java DataBase Connectivity,今天小美就在这里回味与分享JDBC从最原始的连接到优化后版本的过程,通过连接方式的不断优化,这种简化思想就是我忘掉所有之后还剩下的。
一、JDBC实现CURD
CURE- Create Update Retrieve Delete前期准备工作: 1 使用MyEclipse创建javaweb项目Test_JDBC 2 导入MySQL连接包,版本:mysql-connector-java-5.1.39.jar 3 使用MySQ数据库,创建数据库news_db,数据表t_news,并添加3条数据。
步骤如下:
#创建数据库news_dbcreate database news_db;use news_db;#创建数据表t_newscreate table t_news ( id int(11) auto_increment primary key, title varchar(255), author varchar(255));#为t_news增加3条数据insert into t_news (title,author) values ("资源和政策堆出来的联通还是衰落了","新华社"),("不要把特斯拉市值超越通用汽车当回事儿","南方日报"),("若iPhone8推迟到11月上市,谁会偷着乐?","羊城晚报");
准备工作完成,Beautiful!
1)实现Select
package com.hmc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @Author Meice * @Date 2017年8月5日 */public class TestJDBCSelect { public void select() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; //1 加载驱动 try { Class.forName("com.mysql.jdbc.Driver"); //2 获取连接 String url = "jdbc:mysql://localhost:3306/news_db"; String user = "root"; String password = "119913"; conn = DriverManager.getConnection(url, user, password); //3 预编译SQL语句 String sql = "select * from t_news"; ps = conn.prepareStatement(sql); //4 执行编译 rs = ps.executeQuery(); //5 遍历结果集 while(rs.next()) { System.out.println(rs.getInt("id")+"--"+rs.getString("title")+"--"+rs.getString("author")); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //6 释放资源 try { if(rs != null) rs.close(); if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { new TestJDBCSelect().select(); }}
2)实现Insert
package com.hmc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @Author Meice * @Date 2017年8月5日 */public class TestJDBCInsert { public void add() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news_db", "root", "119913"); //变化点1:新增sql我们采用参数传递 String sql = "insert into t_news (title,author) values (?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, "我是用参数增加的第一条新闻"); ps.setString(2, "admin1"); //变化点2:执行CUD时候,用的是executeUpdate()方法,不再是executeQuery()方法。 //并且返回结果为int int result = ps.executeUpdate(); if(result>0) { System.out.println("恭喜你,增加新闻成功!"); }else { System.out.println("遗憾,增加新闻失败!"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if(rs != null) rs.close(); if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { new TestJDBCInsert().add(); }}
截图比较费时间,后面除非到了一图胜千言的情况,一般不再截图。所有代码都是编写边测试。
3)实现Update
package com.hmc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @Author Meice * @Date 2017年8月5日 */public class TestJDBCUpdate { public void update() { Connection conn = null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news_db", "root", "119913"); String sql = "update t_news set author = ? where id = ?"; ps = conn.prepareStatement(sql); ps.setString(1, "admin2"); ps.setInt(2, 4); int result = ps.executeUpdate(); if(result>0) { System.out.println("恭喜你,修改成功!"); }else { System.out.println("遗憾,修改失败!"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if(ps != null) ps.close(); if(conn!= null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { new TestJDBCUpdate().update(); }}
4)实现Delete
package com.hmc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;/** * @Author Meice * @Date 2017年8月5日 */public class TestJDBCDelete { public void del() { Connection conn = null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news_db", "root", "119913"); String sql = "delete from t_news where id = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 4); int result = ps.executeUpdate(); if(result>0) { System.out.println("猴赛雷,删除成功!"); }else { System.out.println("嗷嗷,删除失败!"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { new TestJDBCDelete().del(); }}
这里采用的都是DML语句,如果采用DDL(create drop alter)会有效果吗?
5)采用DDL,创建一个表t_news2
package com.hmc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;/** * @Author Meice * @Date 2017年8月5日 */public class TestJDBCCreate { public void addTable() { Connection conn = null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/news_db", "root","119913"); String sql = "create table t_news2(id int(11) auto_increment primary key,title varchar(255),author varchar(255))"; ps = conn.prepareStatement(sql); ps.executeUpdate();//针对DDL,是没有返回类型的。 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ try { if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { new TestJDBCCreate().addTable(); }}
总结:
1 以上代码小美重复了5遍,重复是为了加深印象,只有深刻体会重复的辛劳,才能深刻体会后面优化的快感;
2 Select做了详细备注,后面相同都省了了注释。
3 CURD流程固定都是:
1 加载驱动 (Class.forName)–>
2 创建连接(DriverManager.getConnection(url,user,password))–>
3 预编译(PreparedStatement)–>
4 执行(executeQuery()或者executeUpdate())–>
5 释放资源(close)
4 注意导包正确。都是java.sql下面的包,不要导成com.mysql.jdbc下面的Connection
5 Select的时候用的是PreparedStatement的executeQuery()方法,其他用的是executeUpdate()方法
6 PreparedStatement是接口,而PrepareStatement是Connection的一个方法。
7 重复的过程要体会那些地方可以优化
8 executeUpdate()
在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。(这句话摘抄自API),话虽简单,要深刻体会实际运用。
9 代码中都做了输出处理,为了是验证下,避免控制台什么都没输出(除了Bug)
10 传参是重点,不把SQL语句写死,而是灵活变化,意义重大,我们注意力只用放在变化的部分,其他部分以不变应万变。
11 关闭资源是非常好的习惯,尽管现在还看不出来有什么明确效果,数据列一旦大起来,就非常重要。
好了,Beautiful!后续补充优化版本Version_1.
- JavaWeb-JDBC-1-不仅仅只是连接
- JavaWeb-JDBC-2-不仅仅只是连接
- JavaWeb-JDBC-3-不仅仅只是连接
- JavaWeb-JDBC连接数据库
- [世界杯]世界杯不仅仅只是足球
- JavaWeb入门:JDBC连接数据库
- javaweb通过jdbc连接数据库
- javaweb—JDBC连接数据库
- JavaWeb-JDBC-数据连接池
- JavaWeb-JDBC连接池、JDBC框架
- 虚拟化不仅仅只是一种技术?
- 数字货币,不仅仅只是比特币
- 开始,希望不仅仅只是个开始
- Java8 Lambda不仅仅只是语法糖
- JavaWeb学习笔记-JDBC操作(1)[连接mysql数据库]
- JavaWeb基础(1)—— 使用 JDBC 连接 MySQL
- JavaWeb JDBC初步连接和JDBC连接规范化
- idea下javaWeb jdbc连接sqlite数据库
- 线程池ThreadPoolExecutor使用简介
- 《算法导论》第四章-第4节_练习(参考答案)
- LeetCode 68 Text Justification(Python详解及实现)
- 467. Unique Substrings in Wraparound String
- leetcode 399. Evaluate Division
- JavaWeb-JDBC-1-不仅仅只是连接
- 从Web前端优化网站性能
- 详解浮点运算的定点编程
- Hibernate学习之---映射组件属性
- bayes python 源代码
- 473. Matchsticks to Square
- Microsoft.AspNet.Identity 剖析(一)—— 初识 Identity
- 居中(整理)
- 基于Swift的iOS应用程序开发:使用NSMutableURLRequest向服务器发送请求