(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用
一、JDBC相关概念介绍
1.1 JDBC介绍
SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。
如下图所示:
二、编写JDBC程序
2.1 搭建实验环境
A. 启动mysql数据库,即开启mysql/bin/mysqld.exe。
B. 创建数据库,并创建所需的表。如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后期容易出错):
2.2 创建一个web工程,并导入数据库驱动包。
2.3 编写javabean,即PO对象又叫持久化对象,此对象的成员属性与数据库的列一一对应,本例中数据库与userName和passWd两列,则PO对象中也应该有这两个成员属性。
UserPO.java
package po; public class UserPO { private String userName; private String passWd; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWd() { return passWd; } public void setPassWd(String passWd) { this.passWd = passWd; } }
解析: javabean对象中成员属性应该是private的,且必须要有get()和set()方法。
2.4 创建DAO包,专门用于操作数据(即与数据库互动,进行增删改差操作),一般有接口类和实现类。
- UserPOI.java
package dao; import java.util.List; import po.UserPO; public interface UserPOI { public boolean addUser(UserPO user); public List<UserPO> gets(); }
- UserPOImpl.java(可优化本文件代码,在第十八篇中讲解)
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import po.UserPO; public class userPOImpl implements UserPOI { public boolean addUser(UserPO user) { boolean flag=false; Connection conn=null; Statement stat=null; try { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //从驱动中获取数据库的链接 conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", ""); //创建条件语句对象,即创建数据库中写入sql语句的对象 stat= conn.createStatement(); //执行sql语句,并得到如果是增删改操作都是用executeUpdate()方法返回执行成功的记录的条数,如果是查操作得到ResultSet返回值 int res=stat.executeUpdate("insert into user values('"+user.getUserName()+"','"+user.getPassWd()+"') "); if(res!=0){ //如果res不等于0则说明sql语句执行成功。 flag=true; } } catch (Exception e) { e.printStackTrace(); }finally{ try{ if(conn!=null && !conn.isClosed()){ conn.close(); } if(stat!=null && stat.isClosed()){ stat.close(); } }catch(Exception e){ e.printStackTrace(); } } return flag; } public List<UserPO> gets() { List<UserPO> list=new ArrayList<UserPO>(); Connection conn=null; Statement stat=null; ResultSet res=null; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", ""); stat=conn.createStatement(); res=stat.executeQuery("select * from user"); while(res.next()){ //不能是if UserPO user=new UserPO(); //注意这里的new UserPO()的位置,不能放在外面new 否则list里只有一个对象 user.setUserName(res.getString("userName")); user.setPassWd(res.getString("passWd")); list.add(user); } } catch (Exception e) { e.printStackTrace(); }finally{ try{ if(conn!=null && !conn.isClosed()){ conn.close(); } if(stat!=null && stat.isClosed()){ stat.close(); } if(res!=null && res.isClosed()){ res.close(); } }catch(Exception e){ e.printStackTrace(); } } return list; } }
2.5 创建测试类进行测试。
- UserTest.java
package test; import java.util.List; import org.junit.Test; import dao.userPOImpl; import po.UserPO; public class UserTest { @Test public void UserPOTest(){ userPOImpl im=new userPOImpl(); UserPO user=new UserPO(); user.setUserName("张三"); user.setPassWd("123"); im.addUser(user); } @Test public void userPOget(){ userPOImpl im=new userPOImpl(); List<UserPO> list=im.gets(); for(int i=0;i<list.size();i++) System.out.println(list.get(i).getUserName()); } }
结果:
三、注意
- URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
- 常用数据库URL地址的写法:
- Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
- SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
- MySql写法:jdbc:mysql://localhost:3306/sid
- Statement类讲解
Jdbc程序中的Statement对象用于向数据库发送SQL语句, Statement对象常用方法:
- executeQuery(String sql) :用于向数据发送查询语句。
- executeUpdate(String sql):用于向数据库发送insert、update或delete语句
- execute(String sql):用于向数据库发送任意sql语句
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
- ResultSet类讲解
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
ResultSet还提供了对结果集进行滚动的方法:
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
- 释放资源
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。