连接数据库代码,为什么静态类方法可以直接调用?,.PreparedStatement和Statement的使用,结果集(ResultSet)用法

711问题集

  • 1.The local variable conn may not have been initialized

    局部变量没有初始化问题?

局部变量在进行读取操作之前必须进行初始化或进行赋值操作,否则会出现编译错误.

- 2.连接数据库代码

package com.zsz.develop.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BaseConnection {

public static Connection getConnection(){    

    Connection conn=null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "SF948640.");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return conn;
}

}

- 3.为什么静态类方法可以直接调用?

这是因为静态类方法实际上属于类,不同任何类实例相关,也不允许访问任何实例属性;因此这些方法可以共享,可以直接调用;而普通方法需要同类实例相关,因此必须在对应的实例中访问。

    public static void main(String[] args) {
//当connection成为静态时、就可以直接调用。
//        Connection conn=new BaseConnection().getConnection();
    Connection conn=BaseConnection.getConnection();
    System.out.println(conn);
}

- 4.PreparedStatement和Statement的使用

PreparedStatement和Statement都是SQL执行器对象。PreparedStatement 对象已预编译过(所以第一次执行花费更多时间),所以其执行速度要快于 Statement 对象。

JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.

- 5.结果集(ResultSet)用法

ResultSet,数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet里面是一个指针数据,他首先指向0位置,也就是标题。当他使用next()时。他读取的才是真正的数据。然后通过0位置的标题对比逐个取出数据

简单实例

    public ArrayList<UserInfoDao> getList(){
    ArrayList<UserInfoDao> arrayList=new ArrayList<UserInfoDao>();
    Connection conn=BaseConnection.getConnection();
    //sql执行器Statement
    PreparedStatement ps=null;
    //ResultSet结果集对象
    String sql="select * from userinfo";
    try {
        ps=ps=(PreparedStatement) conn.prepareStatement(sql);
        rs =ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("name")+"-----");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return arrayList;
}

把他存进实体类,再读取出来的案例

package com.zsz.develop.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import com.mysql.jdbc.PreparedStatement;
import com.zsz.develop.bean.UserInfo;
import com.zsz.develop.util.BaseConnection;

public class UserInfoDao {

public ArrayList<UserInfo> getList(){
    ArrayList<UserInfo> arrayList=new ArrayList<UserInfo>();
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;

    String sql="select * from userinfo";
    try {
        ps=(PreparedStatement) conn.prepareStatement(sql);
        ResultSet rs =ps.executeQuery();
        while (rs.next()) {
//                System.out.println(rs.getString("name")+"-----");
            //把数据封装到实体类
            UserInfo userInfo=new UserInfo();
            userInfo.setId(rs.getInt("id"));
            userInfo.setName(rs.getString("name"));
            userInfo.setPassword(rs.getString("password"));
            //再把封装好的对象放到我们的集合中去
            arrayList.add(userInfo);
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return arrayList;
}
//添加再其他地方既可以使用。
//    public static void main(String[] args) {
//        ArrayList<UserInfo> arrayList= new UserInfoDao().getList();
//        //用新型for循环把他打印出来
//        for(UserInfo userInfo:arrayList){
//            System.out.println(userInfo.getId()+"  "+userInfo.getName()+"  "+userInfo.getPassword());
//        }
//    }

}