JDBC

时间:2022-06-01 20:24:15

 JAVA Database Connectivity java 数据库连接


###使用JDBC的基本步骤

1. 注册驱动
    
 
    `DriverManager.registerDriver(new com.mysql.jdbc.Driver());<这里需要抛出异常>`

1. 建立连接

//DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");

(参数一: 协议 访问的数据库,参数二:用户名,参数三:密码)
<下面例子:>

    Connection coon = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "123456");

3.创建statement,跟数据库打交道,一定需要这个对象

  `Statement st = conn.createStatement();`

4.执行查询,得到结果集

执行sql,得到ResultSet


     String sql = "select * from 你的表名";
    
     ResultSet rs = st.executeQuery(sql);

通过遍历 :

while(rs.next()){

    int id = rs.getInt("id");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    ......
    System.out.println("输出语句");

}

*****记得释放资源
    
        if(rs !=null){
            try{
            rs.close();
        }catch (SQLException sqlEx){} //ignore
        rs = null;
    }
    .....
    
###JDBC工具类构建

1.资源释放工作的整合

2.驱动防二次注册

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

Driver 这个类里面有静态代码块,一上来就执行了,所以等同于我们注册了两次驱动。 其实没这个必要的。
       
//静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new Driver());

最后形成以下代码即可

    Class.forName("com.mysql.jdbc.Driver");

3.使用properties配置文件

         1.在src底下声明一个文件xxx.properties,里面的内容如下:
            driverClass=com.mysql.jdbc.Driver
            url=jdbc:mysql://localhost/数据库名
            name=root
            password=123456
    
        2.在工具类里面,使用静态代码块,读取属性
        还有一段配置如下:
             static String driverClass = null;
             static String url =null;
             static String name = null;
             static String password = null;

            static{
            try{
            //1.创建一个属性配置对象
            Properties.properties = new Properties();
            //InputStream is = new FileInputStream("xxx.properties");//对于文件位于工程根目录
            //使用类加载器,去读取src底下的资源文件.后面再servlet //对应文件位于src目录底下
            InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("xxx.properties");
            //导入输入流
            properties.load(is);
    
            //读取属性
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            name = properties.getProperty("name");
            password = properties.getProperty("password");
    
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    

###数据库的CRUD sql

* **insert**
         
     ` INSERT INTO 表名(NAME,age)VALUES(‘wangqiang‘,28)`
    
     ` INSERT INTO 表名 VALUES(NULL,‘wangqiang‘,28)`

        //1.获取连接对象
        conn = JDBCUtil.getConn();
        // 2. 根据连接对象,得到statement
        st = conn.createStatement();
        
        //3. 执行添加
        String sql = "insert into t_stu values(null , ‘aobama‘ , 59)";
        //影响的行数, ,如果大于0 表明操作成功。 否则失败
        int result = st.executeUpdate(sql);
        
        if(result >0 ){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }



* **delete**
        
        DELETE FROM 表名 WHERE id = 1

        //1.获取连接对象
        
        Connection conn = JDBCUtil.getConn();
    
        //2.根据连接对象,得到statement
    
        st = conn.createStatement();
    
        //3
        String sql = "delete from 表名 where id = 1";
    
        //影响的行数, ,如果大于0 表明操作成功。 否则失败
        int result = st.executeUpdate(sql);
        
        if(result > 0 ){
          System.out.println("删除成功");
        }else{
           System.out.println("删除失败");
        }
        


*    **query**
    
    `SELECT * FROM 表名`

     

        Statement st = null;
        ResultSet rs = null;
         Connection conn = null;
        //1.获取连接对象    
            conn = JDBCUtil.getConn();
        //2.根据连接对象,得到statement对象
    
        st = conn.createStatement();
        
        //3.执行sql,返回ResultSet
        
        String sql = "Select * from 表名";
        ResultSet rs = st.executeQuery(sql);
    
        //4.遍历结果集
    
        while(rs.next()){
            String name = rs.getString("name");
            ...
        System.out.println("name=" name "...");
        }
     

*  **update**

    `UPDATE 表名 SET age = 18 WHERE id = 1;`

        //1.获取连接对象
        conn = JDBCUtil.getConn();  
    
        //2.根据连接对象,得到statement对象
    
        st = conn.createStatement();
        
        String sql = "update 表名 set age = 18 where id = 1";
        int result = st.executeUpdate(sql);

            if(result >0 ){
            System.out.println("更新成功");
        }else{
            System.out.println("更新失败");
        }
        



###使用单元测试,测试代码

1.定义一个类,TestXXX,里面定义方法testXXX.

2.添加junit的支持

    右键工程 --- add Library---Junit---Junit4

3.在方法的上面加上注解,其实就是一个标记
    
        @Test
      public void testQuery(){
            ...  
    }

4.光标选中方法名字,然后右键执行单元测试.或者是打开outline视图,然后选择方法右键执行


###Dao模式

>Data Access Object 数据访问对象


1.新建一个dao的接口,里面声明数据库访问规则
    
        //定义数据库的方法
        public interface UserDao(){
            //查询所有
            void findAll();
    }

2.新建一个dao的实现类

    public class UserDaoImpl implements UserDao{

    @Override
    public void findAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1. 获取连接对象
            conn = JDBCUtil.getConn();
            //2. 创建statement对象
            st = conn.createStatement();
            String sql = "select * from t_user";
            rs = st.executeQuery(sql);
            
            while(rs.next()){
                String userName = rs.getString("username");
                String password = rs.getString("password");
                
                System.out.println(userName "=" password);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.release(conn, st, rs);
          }
        }
     }
        
3.直接使用实现

    public class TestUser {
    @Test
    public void demo1(){
       UserDao userDao =  new UserDaoImpl();
       userDao.findAll();
      }
    }
   

##Statement安全问题

1.Statement执行,其实是拼接sql语句的.先拼接sql语句,然后在一起执行.

        String sql = "select * from t_user where username=‘" username   "‘ and password=‘" password "‘";

        UserDao dao = new UserDaoImpl();
        dao.login("admin", "100234khsdf88‘ or ‘1=1");

        SELECT * FROM t_user WHERE username=‘admin‘ AND PASSWORD=‘100234khsdf88‘ or ‘1=1‘ 

        前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 
         rs = st.executeQuery(sql)


###PrepareStatement

>该对象就是替换前面的statement对象


1.相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。

    
     sql = "insert into t_user values(null , ? , ?)";
         ps = conn.prepareStatement(sql);
         
         //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远从1开始。
         ps.setString(1, userName);
         ps.setString(2, password);


##总结:

1.JDBC入门

2.抽取工具类 ###

3.Statement CRUD###
    
        演练crud

4.Dao模式###

        声明与实现分开

5.PrepareStament CRUD###

    预处理sql语句,解决上面statement出现的问题