JDBC是java中用来规范客户端访问数据库的应用程序接口,里面提供了查询(excuteQuery)和更新数据库(excuteUpdate)的方法.
一.用JDBC来往数据库中添加删除和修改数据的步骤
1.装载驱动
Class.forName("com.mysql.jdbc.Driver");
2.加载驱动,获取连接(DriverManager可以用来加载驱动并返回一个Collection类型的连接)
conn=DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/java2106?useUnicode=true&characterEncoding=UTF-8",
"root","123456");
3.创建连接对象(执行sql语句的工具)
state=conn.createStatement();
4.执行sql语句,excuteUpdate():执行数据库的增删改操作的方法,该方法会返回一个int类型的值,这个值就相当于操作完之后,返回来的发生变化的数据条数,如果返回的int值大于0,则表示数据操作成功了
String sql = "insert into dept values()";
int num=state.executeUpdate(sql);
5.处理结果集,为了使结果更加直观
if(num>0){
System.out.println("插入成功");
}else{
System.out.println("插入失败");
}
6.关闭连接和执行工具
conn.close();
state.close();
public class JDBCDdemo1 {
public static void main(String[] args) {
Connection conn=null;//连接对象
Statement state=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn=DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/java2106?useUnicode=true&characterEncoding=UTF-8",
"root","123456");
//3.创建连接对象
state=conn.createStatement();
String sql = "insert into dept values()";//写60,'剪辑部','株洲'sql语句
//执行sql语句
/**
* excuteUpdate():执行数据库的增删改操作的方法
* 该方法会返回一个int类型的值,这个值就相当于操作完之后,
* 返回来的发生变化的数据条数
* 如果返回的int值大于0,则表示数据操作成功了
*/
int num=state.executeUpdate(sql);
//5.处理结果集()
if(num>0){
System.out.println("插入成功");
}else{
System.out.println("插入失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
conn.close();
state.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二.使用JDBC实现对数据库的查询
1.创建实体类(封装并重写toString方法)
public class Dept {
private int deptno;
private String dname;
private String local;
private String manager;
// private Emp emp;
public int getDeptno() {
return deptno;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLocal() {
return local;
}
public void setLocal(String local) {
this.local = local;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", local=" + local + ", manager=" + manager + "]";
}
}
2.为了简化主函数中的语句,创建一个JDBCHelper类来实现加载驱动和关闭的方法
public class JDBCHelper {
private static String className="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://127.0.0.1:3306/java2106?useUnicode=true&characterEncoding=UTF-8";
private static String user="root";
private static String pass="123456";
/**
* 使用静态块加载驱动
*/
static{
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败!");
e.printStackTrace();
}
}
/**
* 专门用来提供Connection对象的方法
*/
public static Connection getConn(){
Connection conn = null;
try {
conn=DriverManager.getConnection(url,user,pass);
} catch (SQLException e) {
System.out.println("获取连接失败!");
e.printStackTrace();
}
return conn;
}
/**
* 专门用来关闭所有连接的方法
*/
public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.具体实现过程与增删改差不多,用exuteQuery来执行sql语句,返回的是一个结果集,用一个结果集ResultSet rs来接收,为了能将查询的结果更好的遍历和用作其他地方,我们用一个List来装这个结果集rs.
public class JDBCdemo4 {
public static void main(String[] args) {
Connection conn=null;
Statement state=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java2106?useUnicode=true&characterEncoding=UTF-8","root","123456");
state = conn.createStatement();
String sql="select * from dept";
/**
* excuteQuery():用来进行查询的方法,
* 该方法会返回一个ResultSet类型的结果集
*/
rs = state.executeQuery(sql);
List<Dept> list= new ArrayList<Dept>();
while(rs.next()){//判断rs中是否有下一个元素
Dept d = new Dept();
//获取rs字段中名为deptno的值(是一个int值)
d.setDeptno(rs.getInt("deptno"));
d.setDname(rs.getString("dname"));
d.setLocal(rs.getString("local"));
// System.out.println(deptno+","+dname+","+local);
list.add(d);
}
System.out.println(list);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
conn.close();
state.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
三.PreparedStatement 预加载的连接对象
用这个连接对象加载sql语句时,可以预加载sql语句
String sql="insert into dept values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, 80);//设置第一个占位符的值为60
ps.setString(2, "回收部");
ps.setString(3, "五一广场");
这个sql语句中未知的数据都可以用?来代替,加载这个sql语句的时候并不知道要执行的是什么语句,只是预加载了这个语法格式,之后可以用ps.set()这个语句来给值,使得语句执行速度加快.