(十七)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语句中。

 

posted @ 2017-03-06 19:32  shyroke、  阅读(387)  评论(0编辑  收藏  举报
作者:shyroke 博客地址:http://www.cnblogs.com/shyroke/ 转载注明来源~