zoukankan      html  css  js  c++  java
  • 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
    );

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

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/softidea/p/4515819.html
Copyright © 2011-2022 走看看