前言:想必大家在实际编码中都遇到过JDBC的操作, 这里仅做自己的一个总结, 有错误和不完整之处还请大家提出来. 1,JDBC其实一套规范(接口)数据库厂商需要实现此接口(实现类)--数据库驱动
2,jdbc的作用: 可以和数据库创建链接 发送sql语句 接收返回值,处理结果
3,api详解(java.sql或者javaX.sql)
DriverManager 类:
管理一组 JDBC 驱动程序的基本服务。 常用方法: registerDriver(Driver):注册驱动 查看 mysql的Driver的时候有下面一段代码: 发现在类加载的时候已经注册过驱动,我们以后只需要把Driver加载到内存即可 类.Class 对象.getClass() Class.forName("全限定名(包名+类名)") 以后开发中我们通过Class.forName("com.mysql.jdbc.Driver")把驱动注册进去即可. static Connection getConnection(String url, String user, String password) :获取链接 参数说明: url:告诉jdbc去连接那个数据库 固定格式: 协议:子协议:子协议名称 参数 mysql: jdbc:mysql ://localhost:3306/databaseName oracle: jdbc:oracle:thin :@localhost:1521:实例名 user:数据库的登录名 password:数据库的登录密码Connection 接口:
创建语句执行者: Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "root", "123456");常用方法:
Statement createStatement():创建Statement -语句执行者 PreparedStatement prepareStatement(String sql) :创建一个预编译的语句执行对象 CallableStatement prepareCall(String sql) :(了解) 创建一个 CallableStatement 对象来调用数据库存储过程。 Statement 接口(容易产生sql注入, 后期使用PreparedStatement. 后面会有blog说明这个问题) sql语句执行者: Statement st=conn.createStatement();常用方法:
ResultSet executeQuery(String sql) :执行查询语句,返回一个集合 ☆ int executeUpdate(String sql) :执行更新 插入 删除语句,返回影响行数.☆ boolean execute(sql):执行给定的 SQL 语句,该语句可能返回多个结果。 若返回true ,执行是的查询语句 调用 getResultSet 获取查询结果 若返回false,执行的是更新 插入 删除语句 调用 getUpdateCount 获取影响的行数 ResultSet 接口 返回的查询结果: String sql = "..."; ResultSet rs=st.executeQuery(sql);常用方法:
boolean next() :判断是否有下一条记录,并且移动到下一行 获取内容: getXXX(参数) 参数的写法: 1.字段名称 字符串 2.第几列 从1开始 getInt() getString() getObject()4, 实例JDBCUtil类的书写(1)配置文件 jdbc.properties
drivername=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/ddatabaseNameuser=rootpassword=1234
(2)JDBCUtil.java
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 import java.util.ResourceBundle; 7 8 public class JDBCUtil { 9 //ctrl + shift + x 转成大写10 //ctrl + shift + y 转成小写11 static final String DRIVERNAME;12 static final String URL;13 static final String USERNAME;14 static final String PASSWORD;15 16 static{17 18 /*通过ResourceBundle 专门用来加载properties文件19 ResourceBundle bundle=ResourceBundle.getBundle("文件名称");20 21 通过 bundle.getString(键的名字)22 String value=bundle.getString("url");23 */24 25 ResourceBundle bundle=ResourceBundle.getBundle("jdbc");26 DRIVERNAME=bundle.getString("drivername");27 URL=bundle.getString("url");28 USERNAME=bundle.getString("user");29 PASSWORD=bundle.getString("password");30 }31 32 static{33 try {34 Class.forName(DRIVERNAME);35 } catch (ClassNotFoundException e) {36 e.printStackTrace();37 }38 }39 40 //获取链接41 public static Connection getConnection() throws SQLException{42 return DriverManager.getConnection(URL,USERNAME,PASSWORD);43 }44 45 //释放资源46 public static void closeResource(Connection conn,Statement st,ResultSet rs){47 if (rs!=null) {48 try {49 rs.close();50 } catch (SQLException e) {51 e.printStackTrace();52 }53 }54 55 if (st!=null) {56 try {57 st.close();58 } catch (SQLException e) {59 e.printStackTrace();60 }61 }62 63 if (conn!=null) {64 try {65 conn.close();66 } catch (SQLException e) {67 e.printStackTrace();68 }69 }70 71 }72 }
(3)CRUDDemo, 使用PreparedStatement方式
1 public class PPCRUDDemo { 2 public static void main(String[] args) { 3 //插入 4 //insert("赵四","123","zhaosi@163.com"); 5 //更新 6 //updateByName("赵四","尼古拉斯.赵四"); 7 //获取 8 //getByName("尼古拉斯.赵四"); 9 //删除 10 deleteByName("尼古拉斯.赵四"); 11 } 12 13 private static void deleteByName(String string) { 14 //模版 15 Connection conn=null; 16 PreparedStatement st=null; 17 ResultSet rs=null; 18 19 try { 20 //获取链接 21 conn=JDBCUtil.getConnection(); 22 //编写sql 23 String sql="delete from user where username =?"; 24 //获取预编译执行者 25 st=conn.prepareStatement(sql); 26 //设置参数 27 st.setString(1, string); 28 //执行sql 29 int i = st.executeUpdate(); 30 //处理结果 31 if (i>0) { 32 System.out.println("成功"); 33 }else{ 34 System.out.println("失败"); 35 } 36 } catch (Exception e) { 37 e.printStackTrace(); 38 }finally{ 39 //释放资源 40 JDBCUtil.closeResource(conn, st, rs); 41 } 42 43 } 44 45 private static void getByName(String string) { 46 47 Connection conn=null; 48 PreparedStatement st=null; 49 ResultSet rs=null; 50 51 try { 52 conn=JDBCUtil.getConnection(); 53 String sql="select * from user where username=? limit 1"; 54 st=conn.prepareStatement(sql); 55 56 st.setString(1, string); 57 rs=st.executeQuery(); 58 if (rs.next()) { 59 System.out.println(rs.getInt(1)+":"+rs.getString(2)+":"+rs.getObject(3)+":"+rs.getObject(4)); 60 } 61 } catch (Exception e) { 62 // TODO: handle exception 63 e.printStackTrace(); 64 }finally{ 65 66 JDBCUtil.closeResource(conn, st, rs); 67 } 68 69 } 70 71 private static void updateByName(String oldName, String newName) { 72 Connection conn=null; 73 PreparedStatement st=null; 74 ResultSet rs=null; 75 76 try { 77 conn=JDBCUtil.getConnection(); 78 String sql="update user set username = ? where username = ?"; 79 st=conn.prepareStatement(sql); 80 st.setString(1, newName); 81 st.setString(2, oldName); 82 83 int i=st.executeUpdate(); 84 //处理结果 85 if (i>0) { 86 System.out.println("成功"); 87 }else{ 88 System.out.println("失败"); 89 } 90 91 } catch (Exception e) { 92 e.printStackTrace(); 93 }finally{ 94 JDBCUtil.closeResource(conn, st, rs); 95 } 96 97 98 } 99 100 private static void insert(String username, String password, String email) {101 Connection conn=null;102 PreparedStatement st=null;103 ResultSet rs=null;104 105 try {106 //获取链接107 conn=JDBCUtil.getConnection();108 //编写sql109 String sql="insert into user values(null,?,?,?)";110 //获取预编译语句执行者111 st=conn.prepareStatement(sql);112 //设置参数113 st.setString(1, username);114 st.setString(2, password);115 st.setString(3, email);116 //执行sql117 int i=st.executeUpdate();118 //处理结果119 if (i>0) {120 System.out.println("成功");121 }else{122 System.out.println("失败");123 }124 } catch (Exception e) {125 e.printStackTrace();126 }finally{127 JDBCUtil.closeResource(conn, st, rs);128 }129 }130 131 }
这里没有多么高深的东西, 熟能生巧, 暂时总结的就这么多.