• 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);
    
                //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()+"	"+user.getName()+"	"+user.getBirthday()+"	"+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
    );
  • 相关阅读:
    计算机网络 其他1
    C++ part9
    C++ part8
    操作系统 part5
    C++ part7
    MyXls导出Excel的各种设置
    C# excel操作
    Castle
    C# Keycode对照表
    IEnumerable.Select和SelectMany的区别
  • 原文地址:https://www.cnblogs.com/RGogoing/p/4515521.html
Copyright © 2020-2023  润新知