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

时间:2021-05-12 11:53:38

学习内容:

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