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

学习内容:java

1.JDBC的含义...mysql

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

2.使用JDBC的缘由...sql

  那么为何要使用,这个想必你们也是更为了解了,一个应用程序若是不和数据库进行链接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操做的,那么就须要一个辅助工具去链接数据库,从而操做数据库...那这个辅助的工具就是JDBC了,这个仅限于JAVA应用程序...其实整体的规模就是这样:应用程序——>JDBC——>(mysql driver——>mysql)数据库

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

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

3.如何使用JDBC...eclipse

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

我这里只对连接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
);
相关文章
相关标签/搜索