zoukankan      html  css  js  c++  java
  • java学习日记(29 JDBC)

    01JDBC概念和数据库驱动程序 

    * JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,
    * JDBC是java提供给开发人员的一套操作数据库的接口
    * 数据库驱动就是实现该接口的实现类

    数据准备

    * a: 创建数据库和表结构
    #创建数据库
    create database mybase;
    #使用数据库
    use mybase;
    ###创建分类表
    create table sort(
        sid int PRIMARY KEY AUTO_INCREMENT,
        sname varchar(100),
        sprice DOUBLE,
        sdesc VARCHAR(500)
    );
    View Code

    * b: 向表中插入数据

    #初始化数据
    insert into sort(sname,sprice,sdesc) values('家电',2000, '优惠的促销');
    insert into sort(sname,sprice,sdesc) values('家具',8900, '家具价格上调,原材料涨价');
    insert into sort(sname,sprice,sdesc) values('儿童玩具',290, '赚家长的钱');
    insert into sort(sname,sprice,sdesc) values('生鲜',500.99, '生鲜商品');
    insert into sort(sname,sprice,sdesc) values('服装',24000, '换季销售');
    insert into sort(sname,sprice,sdesc) values('洗涤',50, '洗发水促销');    
    View Code


    04JDBC的开发步骤
    * A: JDBC的开发步骤
    * a: 步骤介绍
    1.注册驱动
      告知JVM使用的是哪一个数据库的驱动
    2.获得连接
      使用JDBC中的类,完成对MySQL数据库的连接
    3.获得语句执行平台
      通过连接对象获取对SQL语句的执行者对象
    4.执行sql语句
      使用执行者对象,向数据库执行SQL语句
      获取到数据库的执行后的结果
    5.处理结果
    6.释放资源 一堆close()

    05导入mysql数据库驱动程序jar包
      * 创建lib目录,用于存放当前项目需要的所有jar包
      * 选择jar包,右键执行build path / Add to Build Path

    public class JDBCDemo {
    public static void main(String[] args)throws ClassNotFoundException,SQLException{
    
    
    // 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver)
    // Diver是一个接口,参数传递,MySQL驱动程序中的实现类
    //DriverManager.registerDriver(new Driver());
    //驱动类源代码,注册2次驱动程序
    
    1.注册驱动 反射技术,将驱动类加入到内容
    Class.forName("com.mysql.jdbc.Driver");
    
    2.获得数据库连接 DriverManager类中静态方法 //sql包
    //static Connection getConnection(String url, String user, String password) 
    //返回值是Connection接口的实现类,在mysql驱动程序
    //url: 数据库地址 jdbc:mysql://连接主机IP:端口号/数据库名字
    
    String url = "jdbc:mysql://localhost:3296/mybase";
    String username="root";
    String password="123";
    Connection con = DriverManager.getConnection(url, username, password);
    
    // 3
    Statement stat = con.createStatement();
    4.执行sql语句
    // 通过执行者对象调用方法执行SQL语句,获取结果
    // int executeUpdate(String sql) 执行数据库中的SQL语句, insert delete update
    // 返回值int,操作成功数据表多少行
    int row = stat.executeUpdate
    ("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')");
    System.out.println(row);
    
    //6.释放资源 一堆close()
    stat.close();
    con.close();
    }
    }
    View Code

    ###12SQL注入攻击用户登录案例

    public class JDBCDemo2 {
    public static void main(String[] args)throws Exception {
    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3296/mybase";
    String username = "root";
    String password = "123";
    Connection con = DriverManager.getConnection(url, username, password);
    Statement stat = con.createStatement();
    
    Scanner sc = new Scanner(System.in);
    String user = sc.nextLine();
    String pass = sc.nextLine();
    
    //执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
    //    String sql = "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";
    String sql = "SELECT * FROM users WHERE username='"+user+"' AND PASSWORD='"+pass+"'";
    System.out.println(sql);
    ResultSet rs = stat.executeQuery(sql);
    while(rs.next()){
    System.out.println(rs.getString("username")+" "+rs.getString("password"));
    }
    
    rs.close();
    stat.close();
    con.close();
    }
    }
    View Code


    ###13PrepareStatement接口预编译SQL语句
    * A: PrepareStatement接口预编译SQL语句
      * a: 预处理对象
        * 使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
        * String sql = "insert into sort(sid,sname) values(?,?)";;
        * PreparedStatement预处理对象代码:
        * PreparedStatement psmt = conn.prepareStatement(sql)

      * b: 执行SQL语句的方法介绍
        * int executeUpdate(); --执行insert update delete语句.
        * ResultSet executeQuery(); --执行select语句.

      * c: 设置实际参数
      * void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。
      * 例如:
        * setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器"

    /*
    * Java程序实现用户登录,用户名和密码,数据库检查
    * 防止注入攻击
    * Statement接口实现类,作用执行SQL语句,返回结果集
    * 有一个子接口PreparedStatement (SQL预编译存储,多次高效的执行SQL) 
    * PreparedStatement的实现类数据库的驱动中,如何获取接口的实现类
    * 
    * 是Connection数据库连接对象的方法
    * PreparedStatement prepareStatement(String sql) 
    
    */
    public class JDBCDemo3 {
    public static void main(String[] args)throws Exception {
    Class.forName("com.mysql.jdbc.Driver"); 1
    
    String url = "jdbc:mysql://localhost:3296/mybase"; //2
    String username = "root";
    String password = "123";
    Connection con = DriverManager.getConnection(url, username, password);
    
    Scanner sc = new Scanner(System.in);
    String user = sc.nextLine();
    String pass = sc.nextLine();
    String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?"; 3 //调用Connection接口的方法prepareStatement,获取PrepareStatement接口的实现类
    //方法中参数,SQL语句中的参数全部采用问号占位符
    
    PreparedStatement pst = con.prepareStatement(sql);
    System.out.println(pst);
    //调用pst对象set方法,设置问号占位符上的参数
    pst.setObject(1, user);
    pst.setObject(2, pass);
    
    //调用方法,执行SQL,获取结果集
    ResultSet rs = pst.executeQuery();
    while(rs.next()){
    System.out.println(rs.getString("username")+" "+rs.getString("password"));
    }
    
    rs.close();
    pst.close();
    con.close();
    }
    }
    
     
    View Code

    14PrepareStatement接口预编译SQL语句执行修改

    /*
    * 使用PrepareStatement接口,实现数据表的更新操作
    */
    public class JDBCDemo {
    public static void main(String[] args) throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3296/mybase";
    String username="root";
    String password="123";
    Connection con = DriverManager.getConnection(url, username, password);    
    
    //拼写修改的SQL语句,参数采用?占位
    String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
    //调用数据库连接对象con的方法prepareStatement获取SQL语句的预编译对象
    PreparedStatement pst = con.prepareStatement(sql);
    //调用pst的方法setXXX设置?占位
    pst.setObject(1, "汽车美容");
    pst.setObject(2, 49988);
    pst.setObject(3, 7);
    //调用pst方法执行SQL语句
    pst.executeUpdate();
    
    pst.close();
    con.close();
    }
    }
    View Code

    15PrepareStatement接口预编译SQL语句执行查询

    /*
    * PrepareStatement接口实现数据表的查询操作
    */
    public class JDBCDemo1 {
    public static void main(String[] args) throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/mybase";
    String username="root";
    String password="123";
    Connection con = DriverManager.getConnection(url, username, password);    
    
    String sql = "SELECT * FROM sort";
    
    PreparedStatement pst = con.prepareStatement(sql);
    
    //调用pst对象的方法,执行查询语句,Select
    ResultSet rs=pst.executeQuery();
    while(rs.next()){
    System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")+" "+rs.getString("sdesc"));
    }
    rs.close();
    pst.close();
    con.close();
    }
    }
    View Code

    16JDBC的工具类和测试

    //JDBCUtils工具类代码
    public class JDBCUtils {
    private JDBCUtils(){}
    private static Connection con ;
    
    static{
    try{
    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3296/mybase";
    String username="root";
    String password="123";
    con = DriverManager.getConnection(url, username, password);
    }catch(Exception ex){
    throw new RuntimeException(ex+"数据库连接失败");
    }
    }
    
    /*
    * 定义静态方法,返回数据库的连接对象
    */
    public static Connection getConnection(){
    return con;
    }
    
    
    public static void close(Connection con,Statement stat){
    
    if(stat!=null){
    try{
    stat.close();
    }catch(SQLException ex){}
    }
    
    if(con!=null){
    try{
    con.close();
    }catch(SQLException ex){}
    }
    
    }
    
    
    public static void close(Connection con,Statement stat , ResultSet rs){
    if(rs!=null){
    try{
    rs.close();
    }catch(SQLException ex){}
    }
    
    if(stat!=null){
    try{
    stat.close();
    }catch(SQLException ex){}
    }
    
    if(con!=null){
    try{
    con.close();
    }catch(SQLException ex){}
    }
    
    }
    }
    View Code

    //测试JDBCUtils工具类的代码

    public class TestJDBCUtils {
    public static void main(String[] args)throws Exception {
    Connection con = JDBCUtils.getConnection();
    PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
    ResultSet rs = pst.executeQuery();
    while(rs.next()){
    System.out.println(rs.getString("sname"));
    }
    JDBCUtils.close(con, pst, rs);
    }
    }
    View Code

    17数据表数据存储对象

    public class StoreInObjectDemo {
        public static void main(String[] args) throws SQLException {
        
            Connection con = JDBCUtils.getConn();
            String sql = "SELECT * FROM sort";
            PreparedStatement pst = con.prepareStatement(sql);
            
            ResultSet rs = pst.executeQuery();
            
            List<SqlObject> list = new ArrayList<>();
            
            while(rs.next()){
                int sid = rs.getInt("sid");
                String sname = rs.getString("sname");
                double sprice = rs.getDouble("sprice");
                String sdesc = rs.getString("sdesc");
                
                SqlObject obj = new SqlObject(sid, sname, sprice, sdesc);
                
                list.add(obj);
            }
            
            list.forEach(o->{
                System.out.println(o);
            });
            
        }
        
        
        
    }
    View Code

    18properties配置文件

    * 通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:
    1. 文件位置:任意,建议src下
    2. 文件名称:任意,扩展名为properties
    3. 文件内容:一行一组数据,格式是“key=value”.
    a) key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
    b) value值不支持中文,如果需要使用非英文字符,将进行unicode转换。

    * b: properties文件的编写(内容如下)
    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3296/mybase
    username=root
    password=123

    20加载配置文件

    public class PropertiesDemo {
        
        public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
            InputStream in = PropertiesDemo.class.getClassLoader().
                    getResourceAsStream("database.properties");
            
            Properties pro = new Properties();
            pro.load(in);
            
            String driverClass = pro.getProperty("driverClass");
            String url = pro.getProperty("url");
            String user = pro.getProperty("user");
            String psd = pro.getProperty("password");
            
            Class.forName(driverClass);
            Connection con = DriverManager.getConnection(url, user, psd);
            System.out.println(con);
            
        }
    }
    View Code

    22读取配置文件的工具类
    * A: 读取配置文件的工具类

    /*
    * 编写数据库连接的工具类,JDBC工具类
    * 获取连接对象采用读取配置文件方式
    * 读取文件获取连接,执行一次,static{}
    */
    public class JDBCUtilsConfig {
    private static Connection con ;
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    
    static{
    try{
    readConfig();
    Class.forName(driverClass);
    con = DriverManager.getConnection(url, username, password);
    }catch(Exception ex){
    throw new RuntimeException("数据库连接失败");
    }
    }
    
    private static void readConfig()throws Exception{
    InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
    Properties pro = new Properties();
    pro.load(in);
    driverClass=pro.getProperty("driverClass");
    url = pro.getProperty("url");
    username = pro.getProperty("username");
    password = pro.getProperty("password");
    }
    
    
    public static Connection getConnection(){
    return con;
    }
    
    }    
    View Code
    public class TestJDBCUtils {
    public static void main(String[] args) {
    Connection con = JDBCUtilsConfig.getConnection();
    System.out.println(con);
    }
    }
    View Code
  • 相关阅读:
    ActiveMQ 即时通讯服务 浅析
    Asp.net Mvc (Filter及其执行顺序)
    ActiveMQ基本介绍
    ActiveMQ持久化消息的三种方式
    Windows Azure Virtual Machine (27) 使用psping工具,测试Azure VM网络连通性
    Azure China (10) 使用Azure China SAS Token
    Windows Azure Affinity Groups (3) 修改虚拟网络地缘组(Affinity Group)的配置
    Windows Azure Storage (22) Azure Storage如何支持多级目录
    Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM
    Azure Redis Cache (2) 创建和使用Azure Redis Cache
  • 原文地址:https://www.cnblogs.com/YKang/p/7350513.html
Copyright © 2011-2022 走看看