jdbc连接mysql
- JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
- JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
- JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信
- mysql的驱动mysql-connector-java-5.1.30-bin.jar
- JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供
public class TestJDBC {
public static void main(String[] args) {
Connection conn =null;
Statement stmt=null;
ResultSet rs=null;
String Driver ="com.mysql.jdbc.Driver";
try{
//1、加载jdbc驱动程序
Class.forName(Driver);
//2、提供jdbc连接的url
String url = "jdbc:mysql://localhost:3306/itcast";
String username= "root";
String password = "123456";
//3、创建数据库的连接
conn = DriverManager.getConnection(url,username,password);
//4、创建一个statement,将sql语句发送到数据库
stmt = conn.createStatement();
//5、执行sql语句
rs=stmt.executeQuery("select*from student2");
//6、处理结果
while(rs.next()){
System.out.println(rs.getString("name"));
System.out.println(rs.getFloat("grade"));
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally{
//7、关闭jdbc对象
try{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
DriverManager类
- 驱动管理者
静态方法
1、static tegisterDriver(Driver driver)
用于驱动的加载
一般下驱动的加载采用下列方式
Class.forName("com.mysql.jdbc.Driver");
2、static Connection getConnection(String url,String user,String password);
返回值是Connection接口的实现类对象
url:数据库地址
格式:连接方式:数据库//主机IP地址:端口号/数据库名
Connection conn = DriverManager.getConnection(url,username,password);
创建出数据库的连接对象conn
Statement接口
数据库的连接对象conn调用方法createStatement();获取Statement实现类对象stmt,将SQL语句发送到数据库
Statement stmt= conn.createStatement();
通过执行者对象调用方法执行SQL语句,获取结果
1、int executeUpdate(sql);
执行数据库中的SQL 包含(insert delete update)
2、ResultSet executeQuery(String sql);
执行数据库SQL的select查询
返回的是ResultSet接口的实现类对象
ResultSet接口方法
boolean next()
有结果返回true
没有结果返回false
Statement的子接口PrepareStatement
对SQL语句编译存储,多次高效的执行SQL语句
PrepareStatement PrepareStatement(String sql);
PreparStatement pstmt = conn.prepareStatement("insert into student2 values(?,?,?,?)");
//5、执行sql语句
pstmt.setInt(1, 0);
pstmt.setString(2, "123");
pstmt.setInt(3, 98);
pstmt.setString(4, "女");
pstmt.executeUpdate();
java中Properties配置文件
* Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型
属性文件db.properties如下
读取db.properties属性列表
public class jdbcUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try{
Properties p=new Properties();
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
driver= p.getProperty("Driver");
url=p.getProperty("url");
username=p.getProperty("username");
password=p.getProperty("password");
Class.forName(driver);
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public static Connection createConnection(){
Connection conn=null;
try {
conn= DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close (Connection conn,Statement stmt,ResultSet rs){
try{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));//此处不解???????????
连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能
连接池(connection pool)
就是讲Connection接口的实现类对象放入List中,反复使用
连接池的初始化
事先放入多个连接对象
从连接池中获取连接对象
如果池中有可用连接,则将池中最后一个返回,同时,将该连接从池中remove,表示正在使用
如果池中无可用连接,则创建一个新的
关闭连接
不是真正的关闭,而是将用完的放回去
//连接池对象
private static List<Connection> pool;
//最大连接数
private static final int POOL_MAX_SIZE = 100;
//最小连接数
private static final int POOL_MIN_SIZE = 10;
//声明一个临时变量来计算连接对象的数量
private int currentsize = 0;
public DBConnPool() {
initPool();
}
//初始化连接池,让池中的连接数达到最小值
public void initPool(){
if(pool == null){
pool = new ArrayList<Connection>();
}
while(pool.size()<POOL_MIN_SIZE){
pool.add(jdbcUtil.createConnection());
System.out.println("初始化池,池中连接数:"+pool.size());
currentsize++;
}
}
//从池中取连接,连接池中的最后一个
public synchronized Connection getConnection(){
System.out.println("连接池里资源数"+currentsize);
int last_index;
if(pool.size() > 0){
last_index = pool.size()-1;
Connection conn = pool.get(last_index);
pool.remove(last_index);
return conn;
}
//连接池被拿空,且连接数没有达到上限,创建新的连接
else if(pool.size() == 0 && currentsize<POOL_MAX_SIZE){
System.out.println("没有资源啦,要创建一个新的");
pool.add(jdbcUtil.createConnection());
currentsize++;
System.out.println(currentsize);
Connection conn = pool.get(0);
pool.remove(0);
return conn;
}
throw new RuntimeException("连接数达到上限,请等待");
}
//将连接池放回池中
public synchronized void close(Connection conn){
pool.add(conn);
}
}
网友评论