jjavaweb-jdbc-024

JDBC:

使用mysql视图工具注意,只有选中的命令执行单行才会执行,否则说没有命令
1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2. 快速入门:
	* 步骤:
		1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
			1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
			2.右键-->Add As Library
		2. 注册驱动
		3. 获取数据库连接对象 Connection
		4. 定义sql
		5. 获取执行sql语句的对象 Statement
		6. 执行sql,接受返回结果
		7. 处理结果
		8. 释放资源
package learn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class test_jdbc {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1. 导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/events_more","root","rootli");
        //5.获取执行sql的对象 Statement
        Statement stat=conn.createStatement();
//        String sql="Update emp set Name='456' where id=1";
//        int count=stat.executeUpdate(sql);
        //4.定义sql语句
        String sql="select * from emp";
        //6.执行sql
        ResultSet rs=stat.executeQuery(sql);
        //7.处理结果
        ArrayList<Dept> li=new ArrayList<Dept>();
        while(rs.next()) {
    
    
            int a = rs.getInt(1);
            String b = rs.getString(2);
            Dept dp = new Dept();
            dp.id = a;
            dp.name = b;
            li.add(dp);
        }
        System.out.println(li.get(1));

//        System.out.println(count);
        //8.释放资源
        stat.close();
        conn.close();
    }
}

  1. 详解各个对象:
    用到的所有类其实都是接口
    1. DriverManager:驱动管理对象
    * 功能:
    1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
    static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
    写代码使用: Class.forName(“com.mysql.jdbc.Driver”);
    通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
 static {
    
    
					        try {
    
    
					            java.sql.DriverManager.registerDriver(new Driver());
					        } catch (SQLException E) {
    
    
					            throw new RuntimeException("Can't register driver!");
					        }
    					}
				注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
			2. 获取数据库连接:
				* 方法:static Connection getConnection(String url, String user, String password) 
				* 参数:
					* url:指定连接的路径
						* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
						* 例子:jdbc:mysql://localhost:3306/db3
						* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
					* user:用户名
					* password:密码 
	2. Connection:数据库连接对象
		1. 功能:
			1. 获取执行sql 的对象
				* Statement createStatement()
				* PreparedStatement prepareStatement(String sql)  
			2. 管理事务:
				* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
				* 提交事务:commit() 
				* 回滚事务:rollback() 
	3. Statement:执行sql的对象
		1. 执行sql
			1. boolean execute(String sql) :可以执行任意的sql 了解 
			2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
				* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
			3. ResultSet executeQuery(String sql)  :执行DQL(select)语句
注意,可能会出现空指针异常:因此可以对此做一些判定与初始化
代码:
 2. Statement stmt = null;
    			        Connection conn = null;
 1. if(count > 0){
    
    
    			                System.out.println("添加成功!");
    			            }else{
    
    
    			                System.out.println("添加失败!");
    			            }
 2. finally {
    
    
    			            //stmt.close();
    			            //7. 释放资源
    			            //避免空指针异常
    			            if(stmt != null){
    
    
    			                try {
    
    
    			                    stmt.close();
    			                } catch (SQLException e) {
    
    
    			                    e.printStackTrace();
    			                }
    			            }
    			
    			            if(conn != null){
    
    
    			                try {
    
    
    			                    conn.close();
    			                } catch (SQLException e) {
    
    
    			                    e.printStackTrace();
    			                }
    			            }
    			        }
  1. ResultSet:结果集对象,封装查询结果
    * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
    * getXxx(参数):获取数据
    * Xxx:代表数据类型 如: int getInt() , String getString()
    * 参数:
    1. int:代表列的编号,从1开始 如: getString(1)
    2. String:代表列名称。 如: getDouble(“balance”)

     	* 注意:
     		* 使用步骤:
     			1. 游标向下移动一行
     			2. 判断是否有数据
     			3. 获取数据
    
				   //循环判断游标是否是最后一行末尾。
 while(rs.next()){
    
    
	                //获取数据
	                //6.2 获取数据
	                int id = rs.getInt(1);
	                String name = rs.getString("name");
	                double balance = rs.getDouble(3);
	
	                System.out.println(id + "---" + name + "---" + balance);
	            }
		* 练习:
			* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
				1. 定义Emp类
					定义好变量后,使用alt+insert可以重写toString与get,set方法
				2. 定义方法 public List<Emp> findAll(){}
				3. 实现方法 select * from emp;
  1. PreparedStatement:执行sql的对象
    1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
    意思就是输入的用户名与密码是sql语句参与数据库sql拼接,导致错误命令。但允许用户执行
    1. 输入用户随便,输入密码:a’ or ‘a’ = 'a
    2. sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’

     	3. 解决sql注入问题:使用PreparedStatement对象来解决
     	4. 预编译的SQL:参数使用?作为占位符
     	5. 步骤:
     		1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
     		2. 注册驱动
     		3. 获取数据库连接对象 Connection
     		4. 定义sql
     			* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
     		5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
     		6. 给?赋值:
     			* 方法: setXxx(参数1,参数2)
     				* 参数1:?的位置编号 从1 开始
     				* 参数2:?的值
     		7. 执行sql,接受返回结果,不需要传递sql语句
     		8. 处理结果
     		9. 释放资源
    
     	6. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
     		1. 可以防止SQL注入
     		2. 效率更高
    
package learn.jdbc;

import java.sql.*;
import java.util.ArrayList;

public class test_jdbc {
    
    
    public static void main(String[] args)  {
    
    
        Connection conn = null;
        Statement stat = null;
        PreparedStatement pstat;
        try {
    
    
            //1. 导入驱动jar包
            //2.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //3.获取数据库连接对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/events_more", "root", "rootli");
            //5.获取执行sql的对象 Statement
            stat = conn.createStatement();
            //4.定义sql语句
            /*注意:sql的参数使用?作为占位符*/
            String sql = "update dept set name='123' where id =? and name=?";
            //开启事务
            conn.setAutoCommit(false);
            /*获取执行sql语句的对象*/
            pstat = conn.prepareStatement(sql);
            //4. 设置参数
            pstat.setInt(1, 1);
            pstat.setString(2, "开发部");

            int count = pstat.executeUpdate();
            //提交事务
            conn.commit();
            System.out.println(count);
        }
        catch (Exception e){
    
    
            if (conn !=null) {
    
    
                try {
    
    
                    //事务回滚
                conn.rollback();
                    //8.释放资源
                stat.close();
                //这里写的错误,因为不能放到一起,可能造成conn不能关闭,内存泄漏
                conn.close();
            } catch (SQLException e1) {
    
    
                e1.printStackTrace();
            }
            }
        }
    }
}

为什么汉子出现乱码?

抽取JDBC工具类 : JDBCUtils

* 目的:简化书写
* 分析:
	1. 注册驱动封装
	2. 获取连接对象封装
		* 需求:不想传递参数(麻烦),还得保证工具类的通用性。
		* 优化链接,对于驱动,密码,用户名不能写死
		* 解决:配置文件
			jdbc.properties
				url=
				user=
				password=
	3. 释放资源封装,同时异常在方法内处理,简化主程序代码
创建一个文件:
url=jdbc:mysql:///db3
user=root
password=root
driver=com.mysql.jdbc.Driver

简化代码,将jdbcl链接,关闭操作封装:

package learn.jdbc;

import java.io.FileReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class javaUtilts {
    
    
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     */
    static {
    
    

        try {
    
    
            //读取资源文件,获取值。
            //1. 创建Properties集合类。
            Properties pro = new Properties();
            //获取src路径下的文件的方式--->ClassLoader 类加载器
            ClassLoader cls = javaUtilts.class.getClassLoader();
            URL res= cls.getResource("jdbc.properties");
            //使用文件加载不得使用绝对路径,不合适。
            String path = res.getPath();
            pro.load(new FileReader(path));
            //3. 获取数据,赋值
            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);

        }
        catch(Exception e){
    
    
            System.out.println(e);
        }


    }
    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
    
    
        return DriverManager.getConnection(url,user,password);
    }
    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stat,Connection conn){
    
    
        if(stat!=null) {
    
    
            try {
    
    
                stat.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
        if(conn!=null) {
    
    
            try {
    
    
                conn.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lidashent/article/details/107184721
024