java 从零开始,学习笔记之基础入门(二十四)

时间:2020-12-21 19:42:11

JDBC

JDBC基本连接知识:

没有使用加工厂的链接

(没有使用加工厂的链接)

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class Conn {

 

    public staticvoid main(String[] args) {

        // addUser("cw", "77777777777");

        // selectAll();

        //deleteUserById(5);

        updateUserById(2,"神马","都是浮云");

    }

 

    publicstaticvoid selectAll() {

        Connection conn = null;

        try {

            // forName方法写上驱动类的完整路径

            // 表示的是一个类加载器通过包名+类名来加载对应的类

            // 类加载器会通过反射来加载字符串指定的类的实例

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            // 创建一个数据库连接

            String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=sofeem";

            conn = DriverManager.getConnection(url,"sa","1234");

            System.out.println(conn);

            // 可以通过创建的conn去访问数据库建立了程序和数据库之间的连接

            // 查询tb_user表中的所有信息

            // 创建一个statement对象sql语句发送到数据库执行

            Statement st = conn.createStatement();

            String sql = "select * from tb_user";

            // 执行查询返回执行之后的结果集创建结果集的对象来接收返回回来的多条数据

            // 如果是查询操作,则调用executeQuery方法

            // 如果是增加、删除、修改操作则调用executeUpdate()方法

            ResultSet rs = st.executeQuery(sql);

            // 从结果集中取出对应的值

            while (rs.next()) {

                System.out.println("用户id:" + rs.getString("uid"));

                System.out.println("用户姓名:" + rs.getString("uname"));

                System.out.println(rs.getString("upass"));

            }

 

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

 

    //往用户表中增加一条记录

    publicstatic void addUser(String name, String pass) {

        Connection conn = null;

        Statement st = null;

        PreparedStatement ps = null;

        try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            conn = DriverManager.getConnection(

                    "jdbc:sqlserver://localhost:1433;databaseName=sofeem",

                    "sa", "1234");

            ps = conn

                    .prepareStatement("insert into  tb_user(uname,upass) values(?,?)");

            // 给问好赋值

            ps.setString(1, name);

            ps.setString(2, pass);

            // 执行

            ps.executeUpdate();

            // 增加完成就完了,没有结果集的返回

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

 

    }

 

    //根据id进行删除一条记录

    public static void deleteUserById(int id) {

        Connection conn = null;

        PreparedStatement ps = null;

        try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            conn = DriverManager.getConnection(

                    "jdbc:sqlserver://localhost:1433;databaseName=sofeem",

                    "sa", "1234");

            // 创建sql语句预编译对象

            String sql = "delete from  tb_user where  uid=?";

            ps = conn.prepareStatement(sql);

            // 给问好赋值

            ps.setInt(1, id);

            ps.executeUpdate();

 

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            // 关闭数据库连接

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

 

    }

 

    //根据uid来更新用户名和密码

    public staticvoid updateUserById(int id, String name, String pass) {

        Connection conn = null;

        PreparedStatement ps=null;

        try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            conn = DriverManager.getConnection(

                    "jdbc:sqlserver://192.168.0.179:1433;databaseName=sofeem",

                    "sa", "1234");

            String sql="update tb_user set  uname=?,upass=? where uid=?";

            ps=conn.prepareStatement(sql);

            ps.setString(1, name);

            ps.setString(2, pass);

            ps.setInt(3, id);

           

            ps.executeUpdate();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            try {

                ps.close();

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

 

     // PreparedStatement  Statement的区别?

     /*

      *  1 Ps都是对sql语句到数据库中执行返回对应的数据,但是Ps有对sql语句进行预编译的过程,而s是直接执行

      *  2 Ps执行sql语句的效率高于s执行sql语句的效率

      *      如果在多次执行同一个操作的时候,那么Ps处理sql语句只需要编译一次,第二次处理sql语句就直接使用已经编译好的sql语句

      *      如果使用的是s,则每次处理相同的操作的时候,每次都需要对sql语句进行编译再到数据库中执行

      *  3 Ps的安全性高于s

      *      正是因为Ps能够对sql语句进行预编译,所以它能够防止sql语句注入攻击,而s是直接执行sql语句,没有预编译过程

      *      不能够防止sql注入

      *      

      * */ 

}

 

 

使用加工厂的链接

(使用加工厂的链接)

package com.ibm.jdbc;

 

import java.sql.Connection;

importjava.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class CopyOfConn {

 

    publicstaticvoid main(String[] args) {

//      addUser("aaaa", "bbbbbbbbbb");

         selectAll();

//      deleteUserById(5);

//      updateUserById(2,"神马","都是浮云");

    }

 

    publicstatic void selectAll() {

        Connection conn = null;

        try {

            conn=ConnFactory.getConn();

            Statement st = conn.createStatement();

            String sql = "select * from tb_user";

            ResultSet rs = st.executeQuery(sql);

            while (rs.next()) {

                System.out.println("用户id:" + rs.getString("uid"));

                System.out.println("用户姓名:" + rs.getString("uname"));

                System.out.println(rs.getString("upass"));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            ConnFactory.closeConn(conn,null);

        }

    }

 

    //往用户表中增加一条记录

    publicstatic void addUser(String name, String pass) {

        Connection conn = null;

        PreparedStatement ps = null;

        try {

            conn=ConnFactory.getConn();

            ps = conn

                    .prepareStatement("insert into  tb_user(uname,upass) values(?,?)");

            // 给问好赋值

            ps.setString(1, name);

            ps.setString(2, pass);

            // 执行

            ps.executeUpdate();

            // 增加完成就完了,没有结果集的返回

        }catch (SQLException e) {

            e.printStackTrace();

        } finally {

            ConnFactory.closeConn(conn, ps);

        }

 

    }

 

    //根据id进行删除一条记录

    public staticvoid deleteUserById(int id) {

        Connection conn = null;

        PreparedStatement ps = null;

        try {

            conn=ConnFactory.getConn();

            String sql = "delete from  tb_user where  uid=?";

            ps = conn.prepareStatement(sql);

            // 给问好赋值

            ps.setInt(1, id);

            ps.executeUpdate();

 

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            // 关闭数据库连接

            ConnFactory.closeConn(conn, ps);

        }

 

    }

 

    //根据uid来更新用户名和密码

    public staticvoid updateUserById(int id, String name, String pass) {

        Connection conn = null;

        PreparedStatement ps=null;

        try {

            conn =ConnFactory.getConn();

            String sql="update tb_user set  uname=?,upass=? where uid=?";

            ps=conn.prepareStatement(sql);

            ps.setString(1, name);

            ps.setString(2, pass);

            ps.setInt(3, id);

           

            ps.executeUpdate();

        }  catch (SQLException e) {

            e.printStackTrace();

        }finally{

            ConnFactory.closeConn(conn, ps);

        }

    }

 

     // PreparedStatement  Statement的区别?

     /*

      *  1 Ps都是对sql语句到数据库中执行返回对应的数据,但是Ps有对sql语句进行预编译的过程,而s是直接执行

      *  2 Ps执行sql语句的效率高于s执行sql语句的效率

      *      如果在多次执行同一个操作的时候,那么Ps处理sql语句只需要编译一次,第二次处理sql语句就直接使用已经编译好的sql语句

      *      如果使用的是s,则每次处理相同的操作的时候,每次都需要对sql语句进行编译再到数据库中执行

      *  3 Ps的安全性高于s

      *      正是因为Ps能够对sql语句进行预编译,所以它能够防止sql语句注入攻击,而s是直接执行sql语句,没有预编译过程

      *      不能够防止sql注入

      *      

      * */

   

   

   

   

   

}

(加工厂)         

package com.ibm.conn;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class ConnFactory {

    static Connectionconn;

    privatestatic final StringURL="jdbc:sqlserver://localhost:1433;databaseName=ibm";

    privatestaticfinal StringUSER="sa";

    privatestatic final StringPASS="123";

    static{

        try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

           

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    public static Connection getConn(){

        if(conn==null){

            try {

                conn=DriverManager.getConnection(URL,USER,PASS);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        returnconn;

    }

    public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs){

        if(conn!=null){

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

           

        }

        if(ps!=null){

            try {

                ps.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        if(rs!=null){

            try {

                rs.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

   

    publicstaticvoid main(String[] args) {

        System.out.println(getConn());

    }

   

}

 

 

DTO_DAO_实现增删改查

package com.ibm.conn;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class ConnFactory {

    static Connectionconn;

    private static final StringURL="jdbc:sqlserver://localhost:1433;databaseName=ibm";

    private static final StringUSER="sa";

    privatestaticfinal StringPASS="123";

    static{

        try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

           

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    public static Connection getConn(){

        if(conn==null){

            try {

                conn=DriverManager.getConnection(URL,USER,PASS);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        returnconn;

    }

    publicstatic void closeConn(Connection conn,PreparedStatement ps,ResultSet rs){

        if(conn!=null){

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

           

        }

        if(ps!=null){

            try {

                ps.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        if(rs!=null){

            try {

                rs.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

   

    public staticvoid main(String[] args) {

        System.out.println(getConn());

    }

   

}

 

 

package com.ibm.dao;

 

import java.util.List;

 

import com.ibm.vo.PersonVO;

 

public interface PDAO {

   

    //在此接口中声明增删改查的方法

    public void addPerson(PersonVO pv);

   

    public void delePerson(int pid);

   

    public void updatePerson(PersonVO pv,int id);

   

    public List<PersonVO> selectPerson();

   

    //模糊查询

    public List<PersonVO> selectLikePerson(String name);

   

    //分页

    public List<PersonVO> selectByFenYe(int pagenum,int pagesize);

 

}

 

package com.ibm.dao.impl;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import com.ibm.conn.ConnFactory;

import com.ibm.dao.PDAO;

import com.ibm.vo.PersonVO;

 

public class PersonDaoImplimplements PDAO{

    Connection conn;//申明一个全局的链接数据库的属性

    PreparedStatement ps;

    ResultSet rs;

    List<PersonVO> list;

    @Override

    publicvoid addPerson(PersonVO pv) {

        String sql="insert into tb_person(pname,ppass,pbirth)values(?,?,?)";

        ps=getPs(sql);

       

        try {

            ps.setString(1, pv.getPname());

            ps.setString(2, pv.getPpass());

            ps.setString(3, pv.getPbirth());

            ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            ConnFactory.closeConn(conn,ps,null);

        }

    }

 

    @Override

    public void delePerson(int pid) {

        String sql="delete from tb_person where pid=?";

        ps=getPs(sql);

        try {

            ps.setInt(1, pid);

            ps.executeUpdate();

           

           

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            ConnFactory.closeConn(conn,ps,null);

           

           

        }

    }

 

    @Override

    publicvoid updatePerson(PersonVO pv,int id) {

        String sql="update tb_person set pname=?,ppass=? where pid=? ";

        ps=getPs(sql);

        try {

//          PersonVO pv1= new PersonVO();

            ps.setString(1, pv.getPname());

            ps.setString(2, pv.getPpass());

            ps.setInt(3, id);

            ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            ConnFactory.closeConn(conn,ps,null);

        }

 

    }

 

    @Override

    public List<PersonVO> selectPerson() {

        list = new ArrayList<PersonVO>();

        String sql="select * from tb_person";

        ps=getPs(sql);

        try {

            rs=ps.executeQuery();

            while(rs.next()){

                PersonVO pv= new PersonVO();

                pv.setPid(rs.getInt("pid"));

                pv.setPname(rs.getString("pname"));

                pv.setPpass(rs.getString("ppass"));

                pv.setPbirth(rs.getString("pbirth"));

                list.add(pv);

            }

           

           

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            ConnFactory.closeConn(conn,ps,rs);

        }

       

       

        returnlist;

    }

 

    @Override

    public List<PersonVO> selectLikePerson(String name) {

        //创建集合对象来存放模糊查询到的结果值

        list = new ArrayList<PersonVO>();

        String sql="select * from tb_person where pname like '%"+name+"%'";

        ps=getPs(sql);

        try {

            rs=ps.executeQuery();

            while(rs.next()){

                PersonVO pv=new PersonVO();

                pv.setPid(rs.getInt("pid"));

                pv.setPname(rs.getString("pname"));

                pv.setPpass(rs.getString("ppass"));

                pv.setPbirth(rs.getString("pbirth"));

                list.add(pv);

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            ConnFactory.closeConn(conn,ps,rs);

        }

        return list;

    }

   

    public PreparedStatement getPs(String sql){

        PreparedStatement ps1=null;

        conn=ConnFactory.getConn();

        try {

            ps1=conn.prepareStatement(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return ps1;

    }

 

    @Override

    public List<PersonVO> selectByFenYe(int pagenum,int pagesize) {

        //取到总的记录数

        int totalCount=getAllCount();

        //定义一个能够分的总的页数

        int totalPage=0;

        if(totalCount%pagesize==0){

            totalPage=totalCount/pagesize;

        }else{

            totalPage=totalCount/pagesize+1;

        }

       

        if(pagenum<1){

            pagenum=1;

        }

        if(pagenum>totalPage){

            pagenum+=1;

        }

       

        int n=(pagenum-1)*pagesize;

        list = new ArrayList<PersonVO>();

        String sql="select top (?) * from tb_person where pid not in" +

                "(select top (?) pid from tb_person order by pid)";

        ps=getPs(sql);

        try {

            ps.setInt(1, pagesize);

            ps.setInt(2, n);

            rs=ps.executeQuery();

            while(rs.next()){

                PersonVO pv=new PersonVO();

                pv.setPid(rs.getInt("pid"));

                pv.setPname(rs.getString("pname"));

                pv.setPpass(rs.getString("ppass"));

                pv.setPbirth(rs.getString("pbirth"));

                list.add(pv);

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            ConnFactory.closeConn(conn,ps,rs);

        }

        returnlist;

    }

   

    public int getAllCount(){

        int count=0;

        String sql="select count(*) from tb_person";

        ps=getPs(sql);

        try {

            rs=ps.executeQuery();

            while(rs.next()){

                count=rs.getInt(1);

            }

           

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return count;

    }

   

 

}

 

package com.ibm.test;

 

importjava.util.List;

 

import com.ibm.dao.PDAO;

import com.ibm.dao.impl.PersonDaoImpl;

import com.ibm.vo.PersonVO;

 

public class Test {

   

    public static void main(String[] args) {

        //创建对象并赋值

        PersonVO pv = new PersonVO();

        pv.setPname("admin");

        pv.setPpass("123");

        pv.setPbirth("2012-2-14");

       

        //调用增加的方法将创建的pv对象传递到增加方法中去

        PDAO pdao = new PersonDaoImpl();

        pdao.addPerson(pv);

       

       

        //模糊查询

//      List<PersonVO> l=pdao.selectLikePerson("a");

//      for(PersonVO s:l){

//          System.out.println(s.getPid()+s.getPname()+s.getPpass()+s.getPbirth());

//      }

       

        //删除记录

//      pdao.delePerson(6);

       

        //更新记录

//      pv.setPname("yyyy");

//      pv.setPpass("123");

//      pdao.updatePerson(pv,5);

       

        //查询所有记录

//      List<PersonVO> ll= pdao.selectPerson();

//      for(PersonVO s:ll){

//          System.out.println("用户ID:"+s.getPid()+"\t\t用户名:"+s.getPname()+"\t\t密码:"+s.getPpass()+"\t\t出生日期:"+s.getPbirth());

//      }

//     

//      List<PersonVO>ls = pdao.selectByFenYe(-3,2);

//      for(PersonVO s:ls){

//          System.out.println("用户ID:"+s.getPid()+"\t\t用户名:"+s.getPname()+"\t\t密码:"+s.getPpass()+"\t\t出生日期:"+s.getPbirth());

//      }

//     

       

    }

 

}

 

package com.ibm.vo;

 

public class PersonVO {

    privateintpid;

    private Stringpname;

    private Stringppass;

    private Stringpbirth;

 

    public void setPid (int pid ){

        this.pid = pid;

    }

   

    publicint getPid(){

    return pid;

    }

 

    public String getPname() {

       

        return pname;

    }

 

    publicvoid setPname(String pname) {

        this.pname = pname;

    }

 

    public String getPpass() {

        returnppass;

    }

 

    publicvoid setPpass(String ppass) {

        this.ppass = ppass;

    }

 

    public String getPbirth() {

        returnpbirth;

    }

 

    publicvoid setPbirth(String pbirth) {

        this.pbirth = pbirth;

    }

}

 

 

事务提交

package com.ibm.dao.impl;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

 

import com.ibm.conn.ConnFactory;

 

public class TransactionDemo {

    Connection conn;

    PreparedStatement ps;

    public PreparedStatement getPs(String sql){

        conn=ConnFactory.getConn();

        try {

            ps=conn.prepareStatement(sql);

            //把链接设置为不自动提交

            conn.setAutoCommit(false);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return ps;

       

    }

   

    //对账户中的存款进行先取出400在存入800

    publicvoid show(int qq,int cq,int id)throws SQLException{

        String sql="update tb_account set amoney=(amoney-?) where aid=?";

        ps=getPs(sql);

        ps.setFloat(1, qq);

        ps.setInt(2, id);

        ps.executeUpdate();

       

       

        String sql2="update tb_account set amoney=(amoney+?) where aid=?";

        ps=getPs(sql2);

        ps.setFloat(1, cq);

        ps.setInt(2,id);

        ps.executeUpdate();

        //执行两个操作的Ps对象是两个不同的对象

        //手动提交事务

        //只要两个ps操作有一个出现异常,那么事务回滚,事务全部失败

        //事务要么全部成功,要么全部失败

        conn.commit();//提交表示结束链接

//      conn.setAutoCommit(true);

       

    }

   

    public static void main(String[] args) {

        try {

            new TransactionDemo().show(400, 800, 1);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

 

}