JDBC学习笔记(一)
前两天考完软考,昨天才刚过科目一,感觉一切都还是很新鲜的样子,最近马里兰的学生演讲很火,算是2017的一个时间节点吧,时值2017.5.24, 学霸开始说要进_BAT_,这两天在刷算法,我还在JAVA知识的海洋里挣扎,Anyway,还是得挖坑自填.断断续续学习了_JDBC_到_DataSource_自己写框架,这里做下总结。
- JDBC简介
JDBC:Java DataBase Connectivity,是_SUN_推出的操作数据库的规范。 JDBC_和数据库驱动:规范和实现的关系。 _JDBC:JDK_中 _java.sql.*;javax.sql.*;
- JDBC开发步骤
0、搭建开发环境:把数据库驱动的jar包加入到构建路径中。 1、注册驱动 2、获取与数据库的链接 3、创建代表SQL语句的对象 4、执行SQL语句 5、如果是查询语句:返回结果集。 6、释放资源
1 public class JdbcDemo1{
2 //0、搭建开发环境:把数据库驱动的jar包加入到构建路径中。
3 //1、注册驱动
4 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
5 //2、获取与数据库的链接
6 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15","root","123456");
7 System.out.println(conn.getClass().getName());
8 //3、创建代表SQL语句的对象
9 Statement stmt = conn.createStatement();
10 //4、执行SQL语句
11 ResultSet rs = stmt.executeQuery("select * from users");
12 //5、如果是查询语句:返回结果集。
13 while(rs.next()){
14 //封装 把结果弄到实体Bean(Domain) 模型对象
15 //推荐使用第一种
16 System.out.println(rs.getObject("id"));
17 System.out.println(rs.getObject("name"));
18 System.out.println(rs.getObject("password"));
19 System.out.println(rs.getObject("email"));
20 System.out.println(rs.getObject("birthday"));
21 System.out.println(rs.getObject("--------"));
22 }
23 //6、释放资源 栈 倒着释放资源
24 rs.close();
25 stmt.close();
26 conn.close();
27 }
- JDBC规范中常用得接口或类
- 1.DriverManage
a、注册驱动 方式一:
1 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
缺点: 1、严重依赖具体的数据库驱动 2、导致数据驱动注册2遍 方式二:(推荐)
1 Class.forName("com.mysql.jdbc.Driver");
b、获取与数据库的链接
方式一、
1 Connection conn =
2 DriverManager.getConnection("jdbc:mysql://localhost:3306/day15",
3 "root", "123456");
方式二、
1 Properties info = new Propoties();
2 info.setProperty("user","root");
3 info.setProperty("password","123456");
4 Connection conn = DriverManager.getConnection("jdbc:mysql///day15",info);
方式三、
1 Connection conn
2 = DriverManager.getConnection("jdbc:mysql:///day15?user=root&password=123456");
- Connection
- 作用:所有与数据库的交互都是基于链接的。 _Statement createStatement():_创建代表SQL语句的对象
- Statement
- 作用:代表SQL语句对象 常用方法: _ResultSet executeQuery(String sql):_执行查询,返回结果集。 _int executeUpdate(String sql):_执行DML语句。返回的是SQL语句影响到的记录条数。 _boolean execute(String sql):_执行任何的SQL语句。返回值不代表成功与否。如果执行的语句有结果集,返回true,否则返回false.
- ResultSet 作用:封装了结果集。
- 数据库类型和Java类型的对应关系:<p align="center">
</p>
_boolean next():_向下移动。返回有没有记录 _ boolean provious():_向上移动。返回有没有记录 _ boolean absolute(int row):_定位。返回有没有记录。看第2条,写2. _ void beforeFirst():_移动到第一条记录的前面。默认位置 _ void afterLast():_移动到最后一条记录的后面。
- 释放资源
- 抽取JDBC的工具类 ```java
1 public class JdbcUtil{ 2 private static String driverClass; 3 private static String url; 4 private static String user; 5 private static String password; 6 7 //静态代码块在编译之前就读取了 8 static{ 9 try{ 10 InputStream in = JdbcUtil.class.getClassLoader(). 11 getResourceAsStream(“dbcfg.properties”); 12 Properties props = new Properties(); 13 props.load(in); 14 15 driverClass = props.getProperty(“driverClass”); 16 url = props.getProperty(“url”); 17 user = props.getProperty(“user”); 18 password = props.getProperty(“password”); 19 Class.forName(driverClass); 20 }catch(Exception e){ 21 throw new ExceptionInInitializerError(e); 22 } 23 } 24 25 public static Connection getConnection() throws Exception { 26 Connection conn = DriverManager.getConnection(url,user,password); 27 return conn; 28 } 29 30 //判断三个流分别不存在时处理 返回null 31 public static void release(ResultSet rs, Statement stmt, Connection conn) { 32 if (rs != null) { 33 try { 34 rs.close(); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 rs = null; 39 } 40 if (stmt != null) { 41 try { 42 stmt.close(); 43 } catch (SQLException e) { 44 e.printStackTrace(); 45 } 46 stmt = null; 47 } 48 if (conn != null) { 49 try { 50 conn.close(); 51 } catch (SQLException e) { 52 e.printStackTrace(); 53 } 54 conn = null; 55 } 56 } 57 }
- **JDBC进行单表的CRUD操作 (上课去 中午回来写)** CRUD操作在Dao层进行,不关乎业务逻辑,只实现这些方法。
```java
1 //dao层接口定义
2 public interface CusomerDao{
3 List<Customer> findAll();
4
5 void save(Customer c);
6
7 void del(Integer customerId);
8
9 void update(Customer c);
10
11 Customer findOne(Integer customerId);
12 }
具体实现方法
1 //dao层实现
2
3 /*
4 相同点:
5 定义连接 PreparedStatement语句
6 try catch块里面进行得到连接
7 定义执行语句
8 执行返回结果集
9 结果集的遍历
10 finally处释放连接
11
12 细节:要得到结果集 使用stmt.executeQuery
13 无需得到结果集 用stmt.executeUpdate
14 */
15 public class CustomerDaoMySQLImpl implements CustomerDao {
16 //用List中的add方法存储每一个的数据
17 public List<Customer> findAll(){
18 Connection conn = null;
19 PreparedStatement stmt = null;
20 ResultSet rs = null;
21
22 try{
23 conn = JdbcUtil.getConnection();
24 stmt = conn.prepareStatement("select * from customers");
25 rs = stmt.executeQuery();
26 List<Customer> cs = new ArrayList<Customer>();
27 while(rs.next()){
28 Customer c = new Customer();
29 c.setId(rs.getInt("id"));
30 c.setName(rs.getString("name"));
31 c.setGender(rs.getString("gender"));
32 c.setBirthday(rs.getDate("birthday"));
33 c.setCellphone(rs.getString("cellphone"));
34 c.setEmail(rs.getString("email"));
35 c.setHobby(rs.getString("hobby"));
36 c.setType(rs.getString("type"));
37 c.setDescription(rs.getString("description"));
38 cs.add(c);
39 }
40
41 return cs;
42 }catch(Exception e){
43 throw new RuntimeException(e);
44 }finally{
45 JdbcUtil.release(rs, stmt, conn);
46 }
47 }
48 }
49
50 public void save(Customer c){
51 Connection conn = null;
52 PreparedStatement stmt = null;
53 ResultSet rs = null;
54 try{
55 conn = JdbcUtil.getConnection();
56 stmt = conn.prepareStatement("insert into customers
57 (name,gender,birthday,cellphone,email,hobby,type,description) values (?,?,?,?,?,?,?,?)");
58 stmt.setString(1,c.getName());
59 stmt.setString(2,c.getGender());
60 stmt.setDate(3,new java.sql.Date(c.getBirthday().getTime()));
61 stmt.setString(4,c.getCellphone());
62 stmt.setString(5,c.getEmail());
63 stmt.setString(6,c.getHobby());
64 stmt.setString(7,c.getType());
65 stmt.setString(8,c.getDescription());
66 stmt.executeUpdate();
67 }catch(Exception e){
68 throw new RuntimeException(e);
69 }finally{
70 JdbcUtil.release(rs.stmt,conn);
71 }
72 }
73
74 public void del(Integer customerId){
75 Connection conn = null;
76 PreparedStatement stmt = null;
77 ResultSet rs = null;
78 try{
79 conn = JdbcUtil.getConnection();
80 stmt = conn.prepareStatement("delete from customers where id=?");
81 stmt.setInt(1,customerId);
82 stmt.executeUpdate();
83 }catch(Exception e){
84 throw new RuntimeException(e);
85 }finally{
86 JdbcUtil.release(rs, stmt, conn);
87 }
88 }
89
90 public void update(Customer c) {
91 Connection conn = null;
92 PreparedStatement stmt = null;
93 ResultSet rs = null;
94 try{
95 conn = JdbcUtil.getConnection();
96 stmt = conn.prepareStatement("update customers set name=?,gender=?,birthday=?,cellphone=?,email=?,hobby=?,type=?,description=? where id=?");
97 stmt.setString(1,c.getName());
98 stmt.setString(2,c.getGender());
99 stmt.setDate(3,new java.sql.Date(c.getBirthday().getTime()));
100 stmt.setString(4,c.getCellphone());
101 stmt.setString(5,c.getEmail());
102 stmt.setString(6,c.getHobby());
103 stmt.setString(7,c.getType());
104 stmt.setString(8,c.getDescription());
105 stmt.setInt(9, c.getId());
106 stmt.executeUpdate();
107 }catch(Exception e){
108 throw new RuntimeException(e);
109 }finally{
110 JdbcUtil.release(rs, stmt, conn);
111 }
112
113 }
114
115 }
-
**PreparedStatement_接口** 原则:能用_PreparedStatement_就不要使用_Statement 优点: 参数使用占位符(?)替代 预编SQL语句,执行效率高 不存在SQL注入问题
后记:JDBC是java开发中非常重要的知识,这一部分的知识要能理解到位,跟着打一遍+理解一遍+自己实现两遍,后续进行第二篇。
查理2017.5.24、
Enjoy Reading This Article?
Here are some more articles you might like to read next: