JAVA jdbc(数据库连接池)学习笔记(转)

 

学习内容:

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);

        <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">4.执行一个操作...
        System.out.println("Creating statement"<span style="color: rgba(0, 0, 0, 1)">);
        stmt=<span style="color: rgba(0, 0, 0, 1)">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<span style="color: rgba(0, 0, 0, 1)">.提取数据...

// 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  
    <span style="color: rgba(0, 0, 255, 1)">public<span style="color: rgba(0, 0, 0, 1)"> String toString(){  
        <span style="color: rgba(0, 0, 255, 1)">return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]"<span style="color: rgba(0, 0, 0, 1)">;  
    }  

}

复制代码

接着是我们的 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();
    } <span style="color: rgba(0, 0, 255, 1)">catch<span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated catch block

e.printStackTrace();

    }<span style="color: rgba(0, 0, 255, 1)">finally<span style="color: rgba(0, 0, 0, 1)">{
        <span style="color: rgba(0, 0, 255, 1)">if(ps!=<span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">){
            <span style="color: rgba(0, 0, 255, 1)">try<span style="color: rgba(0, 0, 0, 1)"> {
                ps.close();
            } <span style="color: rgba(0, 0, 255, 1)">catch<span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
                <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated catch block

e.printStackTrace();
}finally{
if(cn!=null){
try {
cn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

}
<span style="color: rgba(0, 0, 255, 1)">public User getUserById(<span style="color: rgba(0, 0, 255, 1)">int<span style="color: rgba(0, 0, 0, 1)"> userid){
    Connection cn=<span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">;
    PreparedStatement ps=<span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">;
    ResultSet rs=<span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">;
    <span style="color: rgba(0, 0, 255, 1)">try<span style="color: rgba(0, 0, 0, 1)"> {
        cn=<span style="color: rgba(0, 0, 0, 1)">DriverManager.getConnection(DB_URL,user_1,pas);
        String sql="select * from userr where id=1"<span style="color: rgba(0, 0, 0, 1)">;
        <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">导入sql语句...
        ps=<span style="color: rgba(0, 0, 0, 1)">cn.prepareStatement(sql);
        <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">保存执行sql语句后的结果对象...
        rs=<span style="color: rgba(0, 0, 0, 1)">ps.executeQuery();
        ps.close();
        cn.close();
        rs.close();
    } <span style="color: rgba(0, 0, 255, 1)">catch<span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)"> 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 {
<span style="color: rgba(0, 0, 255, 1)">private<span style="color: rgba(0, 0, 0, 1)"> UserDao userDao;
<span style="color: rgba(0, 0, 255, 1)">public<span style="color: rgba(0, 0, 0, 1)"> userserves(){
    userDao =DaoFactory.getInstance().createUserDao();<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">通过工厂实例化一个例子。。
    System.out.println("userDao "+<span style="color: rgba(0, 0, 0, 1)">userDao);
}

<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> regist(User user){
    <span style="color: rgba(0, 0, 255, 1)">if(user==<span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">){
        System.out.println("注册表信息无效..."<span style="color: rgba(0, 0, 0, 1)">);
    }<span style="color: rgba(0, 0, 255, 1)">else<span style="color: rgba(0, 0, 0, 1)">{
        userDao.addUser(user);
    }
}

<span style="color: rgba(0, 0, 255, 1)">public User query(<span style="color: rgba(0, 0, 255, 1)">int<span style="color: rgba(0, 0, 0, 1)"> userId){  
    User user =<span style="color: rgba(0, 0, 0, 1)"> userDao.getUserById(userId);  
    <span style="color: rgba(0, 0, 255, 1)">if(user == <span style="color: rgba(0, 0, 255, 1)">null<span style="color: rgba(0, 0, 0, 1)">){  
        System.out.println("查询结果为空!!"<span style="color: rgba(0, 0, 0, 1)">);  
    }<span style="color: rgba(0, 0, 255, 1)">else<span style="color: rgba(0, 0, 0, 1)">{  
        System.out.println(user.getid()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+<span style="color: rgba(0, 0, 0, 1)">user.getMoney());  
    }  
    <span style="color: rgba(0, 0, 255, 1)">return<span style="color: rgba(0, 0, 0, 1)"> userDao.getUserById(userId);  
}  

<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> update(User user){
    <span style="color: rgba(0, 0, 255, 1)">if(user.getid()&lt;0<span style="color: rgba(0, 0, 0, 1)">){
        System.out.println("用户id无效,重新输入"<span style="color: rgba(0, 0, 0, 1)">);
    }<span style="color: rgba(0, 0, 255, 1)">else<span style="color: rgba(0, 0, 0, 1)">{
        userDao.update(user);
    }
}

<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> delete(User user){
    <span style="color: rgba(0, 0, 255, 1)">if(user.getid()&lt;0<span style="color: rgba(0, 0, 0, 1)">){
        System.out.println("用户id无效,重新输入"<span style="color: rgba(0, 0, 0, 1)">);
    }<span style="color: rgba(0, 0, 255, 1)">else<span style="color: rgba(0, 0, 0, 1)">{
        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 {
<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">static <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated method stub
    userserves userse=<span style="color: rgba(0, 0, 255, 1)">new<span style="color: rgba(0, 0, 0, 1)"> userserves();
    System.out.println("添加用户"<span style="color: rgba(0, 0, 0, 1)">);
    userse.regist(<span style="color: rgba(0, 0, 255, 1)">new User()); <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">这句话我们也可以这样
    <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">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