学习内容:

1.JDBC的含义...

JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些API...

2.使用JDBC的原因...

  那么为什么要使用,这个想必大家也是更为了解了,一个应用程序如果不和数据库进行连接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操作的,那么就需要一个辅助工具去连接数据库,从而操作数据库...那这个辅助的工具就是JDBC了,这个仅限于JAVA应用程序...其实总体的规模就是这样:应用程序——>JDBC——>(mysql driver——>mysql)

                       JDBC——>(oracle driver——>oracle)

                       JDBC——>(DB2 driver——>db2)就是这么简单的事...多余的就不罗嗦了...

3.如何使用JDBC...

如何使用JDBC,才是真正的重点...使用JDBC分为几个步骤...

我这里只对链接mysql进行讲解...

i.首先注册驱动

Class.forName("com.mysql.Driver");//这种方式是最好的,不会对具体驱动产生依赖...
DriverManager.registerDriver(com.mysql.jdbc.Driver);//会产生两个相同的驱动,并会对具体驱动产生依赖...
System.setProperty("jdbc.drivers","driver1:driver2");//基本不常用,所以可以不用记,一般就使用第一种就行了...

ii.建立连接

Connection conn = DriverManager.getConnection(url, user, password);  

iii.创建执行SQL语句...

Statement st = conn.createStatement();
st.executeQuery(sql);
PreparedStatement
String sql = "select * from table_name where col_name=?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "col_value");
ps.executeQuery();

iv.处理执行结果...

    ResultSet rs = statement.executeQuery(sql);
While(rs.next()){
rs.getString(“col_name”);
rs.getInt(“col_name”);
}

v.释放资源...

释放资源这是必须的,使用close()进行关闭...由于数据库的资源是非常珍贵的,因此只要我们不去使用资源的时候,一定要记得释放...

先来个例子:还是例子更加的好理解...

import java.sql.*;//1.引包是必须的...

public class JDBC_1_1 {
static final String JDBC_DRIVER="com.mysql.jdbc.Driver";
static final String DB_URL ="jdbc:mysql://localhost:3306/emp";//这个链接是我本机的数据库emp...emp里有个表格叫employees....
/*表格的信息
*create table employees
*(
* id int not null,
* first varchar(255) not null,
* last varchar(255) not null,
* age int not null
*);
*/
static final String USER="root";//登陆数据库时的用户名...
static final String PAS="49681888";登陆时的密码...
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;//
try {
//2.注册JDBC驱动程序...
Class.forName("com.mysql.jdbc.Driver");
//3.打开一个链接...
System.out.println("Connection database....");
conn=DriverManager.getConnection(DB_URL,USER,PAS); //4.执行一个操作...
System.out.println("Creating statement");
stmt=conn.createStatement();
// String sql;
// sql="select id,first,last,age from employees"; 这个是查询操作...
// ResultSet rs=stmt.executeQuery(sql);
String sql_1="insert into employees " + "values (7, 'z', 'yh', 20)";//插入操作...
stmt.executeUpdate(sql_1); 5.提取数据...
// while(rs.next()){ //rs用来保存sql执行后的结果...
// int id=rs.getInt("id");
// int age=rs.getInt("age");
// String first=rs.getString("first");
// String last=rs.getString("last");
// System.out.println(id+" "+age+" "+first+" "+last);
// }
6.清理环境
// rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("no class");
}finally{
if(stmt!=null){
try {
stmt.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();
}
}
}
System.out.println("Goodbye");
} }

其他操作,比如说删除啊,更改啊,这个模式基本都差不多...就不进行解释了...

注意:如果我们使用JDBC的时候,一定要检查检查自己的的jdk的lib文件夹下有没有mysql-connector-java-5.1.18-bin.jar这个压缩文件..如果没有,那么程序运行时会出现错误...解决方法就是我们下一个mysql-connector-java-5.1.18-bin.jar这个文件,几k而已,下载完毕之后直接拷贝到jdk的lib文件夹下即可..

  如果使用的是eclipse,我们还要导入这个文件...右击我们建立的项目文件,然后点击build path——>configure build path,弹出对话框以后,点击Libraries——>Add External JARs...找到这个mysql-connector-java-5.1.18-bin.jar文件导入,然后就可以了...

4.使用JDBC实现CURD操作...什么是CURD操作呢?其实就是对数据进行更新,删除等操作...

这里我们采用分层操作...这个代码很长...

首先是User实体...

package JDBC_3;
import java.util.Date;
class User{ //user类..
private int id;
private String name;
private Date birthday;
private float money;
public User(){
}
public User(int id,String name,Date birthday,float money){
this.id=id;
this.name=name;
this.birthday=birthday;
this.money=money;
}
public int getid(){
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
} @Override
public String toString(){
return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]";
}
}

接着是我们的Dao层,就是接口...

package JDBC_3;

interface UserDao{
public abstract void addUser(User user);
public abstract User getUserById(int userid);
public abstract int update(User user);
public abstract int delete(User user);
}

然后是实现接口的类...

package JDBC_3;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
/*
* JDBC实现crud操作
* crud操作就是对数据进行增删改查...
* */
public class JDBC_3_1_server implements UserDao{
static final String DB_URL="jdbc:mysql://localhost:3306/emp";
static final String user_1="root";
static final String pas="49681888";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void addUser(User user){
Connection cn=null;
PreparedStatement ps=null;
try {
cn=DriverManager.getConnection(DB_URL,user_1,pas);
String sql="insert into userr values(2,'clearlove','1995-01-26',200)";
//String sql="insert into userr values(?,?,?,?)";这句话是传参数是未知的,需要我们进行获取...
ps=cn.prepareStatement(sql);
//这四个函数就是为了获取我们插入的信息...上面采用了直接在sql里写入我们要插入的数据,其实我们也可以在主函数里进行传参...见下面主函数...
// ps.setInt(1,user.getid());
// ps.setString(2,user.getName());
// ps.setDate(3, new Date(user.getBirthday().getTime()));
// ps.setFloat(4, 20);
int count=ps.executeUpdate();
System.out.println("添加的记录数"+count);
ps.close();
cn.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace(); }finally{
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(cn!=null){
try {
cn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} }
public User getUserById(int userid){
Connection cn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
cn=DriverManager.getConnection(DB_URL,user_1,pas);
String sql="select * from userr where id=1";
//导入sql语句...
ps=cn.prepareStatement(sql);
//保存执行sql语句后的结果对象...
rs=ps.executeQuery();
ps.close();
cn.close();
rs.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(cn!=null){
try {
cn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
public int update(User user){
Connection cn=null;
PreparedStatement ps=null;
try {
cn=DriverManager.getConnection(DB_URL,user_1,pas);
String sql="update userr set name='clearlove',birthday='1994-12-19',money=60 where id=1";
ps=cn.prepareStatement(sql);
int count=ps.executeUpdate();
return count;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
cn.close();
ps.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}
public int delete(User user){
Connection cn=null;
PreparedStatement ps=null;
try {
cn=DriverManager.getConnection(DB_URL,user_1,pas);
String sql="delete from userr where id=1";
ps=cn.prepareStatement(sql);
int count=-1;
count=ps.executeUpdate();
return count;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
cn.close();
ps.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}
}

接着是服务层...

package JDBC_3;
class userserves { private UserDao userDao;
public userserves(){
userDao =DaoFactory.getInstance().createUserDao();//通过工厂实例化一个例子。。
System.out.println("userDao "+userDao);
} public void regist(User user){
if(user==null){
System.out.println("注册表信息无效...");
}else{
userDao.addUser(user);
}
} public User query(int userId){
User user = userDao.getUserById(userId);
if(user == null){
System.out.println("查询结果为空!!");
}else{
System.out.println(user.getid()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+user.getMoney());
}
return userDao.getUserById(userId);
} public void update(User user){
if(user.getid()<0){
System.out.println("用户id无效,重新输入");
}else{
userDao.update(user);
}
} public void delete(User user){
if(user.getid()<0){
System.out.println("用户id无效,重新输入");
}else{
userDao.delete(user);
}
}
}

定义一个工厂模式来实例化对象UserDao。。。

package JDBC_3;
class DaoFactory{
private static UserDao userdao=null;
private static DaoFactory instance= new DaoFactory();
private DaoFactory(){
try {
userdao=(UserDao)Class.forName("JDBC_3.JDBC_3_1_server").newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static DaoFactory getInstance(){
return instance;
}
public UserDao createUserDao(){
return userdao;
}
}

最后是测试类...

package JDBC_3;
import java.sql.Date;
public class JDBC_3_1_ceshi { public static void main(String[] args) {
// TODO Auto-generated method stub
userserves userse=new userserves();
System.out.println("添加用户");
userse.regist(new User()); //这句话我们也可以这样
//userse.regist(new User(1,"clearlove","1995-01-26",300));这样写我们可以固定传参...但是上面的一些代码就要进行修改了...
} }

上面的代码估计是有点长,但是也没关系...一名优秀的程序员这点代码对于我们来说算什么呢?其实上面的例子是很好理解的...都是一些基本的东西...

我们除了上述那种方式可以对类名进行加载,我们还可以使用proprties...是一种很灵活的方式...

private DaoFactory(){
/**
* 通过读取属性文件来动态的加载Dao层类
*/
Properties prop = new Properties();
try{
FileInputStream fis = new FileInputStream("src/com/weijia/domain/daoconfig.properties");
prop.load(fis);
String className = prop.getProperty("userDaoClass");
Class<?> clazz = Class.forName(className);
userDao = (UserDao)clazz.newInstance();
fis.close();
}catch(Exception e){
}
}

这里的数据库就是一个简单的数据库...

create table userr
(
id int not null,
name varchar(255) not null,
birthday Date,
money float not null
);

http://www.cnblogs.com/RGogoing/p/4515521.html

JAVA jdbc(数据库连接池)学习笔记(转)的更多相关文章

  1. JAVA jdbc(数据库连接池)学习笔记(二) SQL注入

    PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念...   所谓SQL注 ...

  2. JAVA jdbc(数据库连接池)学习笔记(一)

    学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些 ...

  3. Java jdbc数据库连接池总结!(转)

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  4. day13_Mysql事务与数据库连接池学习笔记

    一.Mysql事务 事务: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功(数据回滚).  例如:A给B转帐,对应于如下两条sql语句 : update account ...

  5. Java -- JDBC 数据库连接池

    1. 原理代码示例 public class JdbcPool implements DataSource { private static LinkedList<Connection> ...

  6. Java自学-JDBC 数据库连接池

    数据库连接池 与线程池类似的,数据库也有一个数据库连接池. 不过他们的实现思路是不一样的. 本章节讲解了自定义数据库连接池类:ConnectionPool,虽然不是很完善和健壮,但是足以帮助大家理解C ...

  7. JAVA之JDBC数据库连接池总结篇

    JDBC数据库连接池 一.JDBC数据库连接池的必要性 二.数据库连接池技术 三.多种开源的数据库连接池 3.1 C3P0数据库连接池 3.2 DBCP数据库连接池 3.3 Druid(德鲁伊)数据库 ...

  8. JAVA基础知识之JDBC——JDBC数据库连接池

    JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...

  9. JDBC 数据库连接池

    http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html JDBC 数据库连接池 小结   当对数据库的访问不是很频繁时,可以在每次 ...

随机推荐

  1. map size mismatch; abort

    数据库启动时有莫名的提示map size mismatch; abort 原帖在这里:http://t.askmaclean.com/thread-1397-1-1.html 今天帮网友(centos ...

  2. Linux命令之rz - 批量上传文件,简单易用(转载)

    用途说明 rz命令能够批量上传文件,当然也可上传单个文件啦.使用的协议是古老的ZMODEM协议,尽管协议古老,但毫不影响的简单易用的特性.一般情 况我们要上传文件到Linux系统,要么使用ftp(还得 ...

  3. 跨域GET、POST请求

    跨域GET.POST请求的小结 重点:跨域POST大量数据: JQuery:$.ajax/$.getJSON支持jsonp格式的跨域,但是只支持GET方式,暂不支持POST: CORS:w3c关于跨域 ...

  4. 在VM已安装Android4.4 连接小米手环 网络设置

    1.打开一个终端 2.输入su,选择同意 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dW4xMjNneA==/font/5a6L5L2T/fon ...

  5. android新浪分享实例

    新浪分享比较简单,新浪有提供完整的demo. android实现新浪的分享功能,分3种分享情况: 纯文本的,带图片的,图片为本地图片(传入的是图片在手机的地址),第2种带图片的是,网络图片,图片地址为 ...

  6. 自顶向下分析Binder【1】—— Binder实例篇

    欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 一个Binder实例 我们Binder的学习将从以下的一个实例開始.依据Android文档中的描写叙述,创建一个Bin ...

  7. 30岁生日,媳妇赏的,U-BOAT手表一枚-数字尾巴

    http://bbs.dgtle.com/thread-139611-1-1.html

  8. 关于Platinum库的MediaRender具体C++代码实现探讨

    接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...

  9. BGP的状态机制

    Idle 状态:即空闲状态,不接受任何BGP的连接,等待Start事件的产生,如果有start事件产生,若有start事件产生,系统开启ConnectRetry定时器,向邻居发起TCP连接,并将状态变 ...

  10. Gradle 修改 Maven 仓库地址(转)

    近来迁移了一些项目到Android Studio,采用Gradle构建确实比原来的Ant方便许多.但是编译时下载依赖的网速又着实令人蛋疼不已. 如果能切换到国内的Maven镜像仓库,如开源中国的Mav ...