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"> screenshot

</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:

  • What is Mathematics: Solution Chapter 3
  • What is Mathematics: Solution Chapter 2
  • What is Mathematics: Solution Chapter 1
  • A small guide to supplements: What you need to know
  • 混乱与秩序