关于JDBC
JDBC介绍
本文借鉴https://blog.csdn.net/jungle_rao/article/details/81274720#%E5%89%8D%E8%A8%80
JDBC(Java DataBase Connectivity Java数据库连接)用于在Java程序中实现数据库操作功能,他提供了执行SQL语句、访问各种数据库的方法,并为各种不同的数据库提供统一接口的操作。
装载JDBC的步骤
首先访问MySql数据库的时候需要用到第三方类,这些类都被封装到一个jar包中(mysql-connector-java-5.0.8-bin.jar)
导入步骤:右键Project->properties->Java Build Path->Libraries->Add External JARs..->找到下载的jar包导入->Apply
如果没有导入jar包的话,在访问数据库操作的时候会抛出ClassNotFoundException
初始化数据
private Connection conn; private PreparedStatement ps; private ResultSet rs; private static String connForname = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/library"; private static String user = "root"; private static String psw = "root";
1、加载驱动
// 1、加载驱动 static { try { //connForname = "com.mysql.jdbc.Driver" Class.forName(connForname); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Class.forName()方法是将驱动类com.mysql.jdbc.Driver加载到JVM中,加载的时候就会执行里面的静态初始化块,完成驱动相关初始化工作
注意:Class.forName需要捕获ClassNotFoundException
2、获取JDBC和数据库之间的Connection连接
// 2、获取链接 public Connection getconn() { try { //url为数据库的位置,user为数据库用户名,psw为数据库密码 Connection conn = DriverManager.getConnection(url, user, psw); return conn; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
这里 url = "jdbc:mysql://localhost:3306/library"其中location表示本机,也可以使用ip地址
user = “root”是mysql数据库的用户名
psw = “root”是mysql数据库的密码
Connection是与特定数据库连接回话的接口,使用的时候需要导包,而且必须在程序结束的时候将其关闭。getConnection方法也需要捕获SQLException异常。
3.创建Statement或者PreparedStatement接口,执行SQL语句
// 3、修改的方法(增删改) public int upDate(String sql, Object... obj) { conn = getconn(); try { ps = conn.prepareStatement(sql); for (int i = 1; i <= obj.length; i++) { ps.setObject(i, obj[i-1]); } return ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { release(); } return -1; }
首先通过getconn()方法建立连接也就是第二步,然后创建PreparedStatement对象ps并执行sql语句
String sql = "update book set book_code=?,book_name=?,book_other=?,book_placeInfo=?,book_biresTime=?,book_price=?,book_image=? where id=?"; int result = db.upDate(sql, bookCode, bookName, bookOther, bookPlaceInfo, stuBirthday, bookPrice,fileName,id);
增加数据、删除数据同理
麻烦的是查询数据 在查询数据执行完SQL后会返回一个结果集这时候来到第四步
4.处理和显示结果
// 4、查询的方法 public List<Map<String, Object>> query(String sql, Object... obj) { List<Map<String, Object>> list = new ArrayList<>(); conn = getconn(); PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } rs = ps.executeQuery(); ResultSetMetaData rsmt = rs.getMetaData(); while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 1; i <= rsmt.getColumnCount(); i++) { String key = rsmt.getColumnLabel(i); Object value = rs.getObject(key); map.put(key, value); } list.add(map); } return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { release(); } return null; }
使用以下方法进行遍历,并用map集合进行存储并返回
rs = ps.executeQuery();
ResultSetMetaData rsmt = rs.getMetaData();
5、释放资源
在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。关闭的过程中遵循从里到外的原则。因为在增删改查的操作中都要用到这样的关闭操作,为了使代码简单,增加其复用性,这里我将这些关闭的操作写成一个方法和建立连接的方法一起放到一份工具类中。
// 5、释放资源 public void release() { if (rs != null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
另外,Statement和PreparedStatement的异同,execute和executeUpdate的区别等内容,这里做一些介绍。
Statement和PreparedStatement的异同及优缺点
同:两者都是用来执SQL语句的
异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
PreparedStatement的优点:
1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。