jdbc是使用Java语言操作关系型数据库的一套API,jdbc定义了操作所有的数据库的规则(接口)。各种数据库分别定义自己对于jdbc的一套实现类(驱动)。
jdbc的本质:
jdbc的好处:
使用不同的数据库时只需导入对应的驱动jar包。
package wryyyyy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class test
{
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
//2.获取连接
/*
1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
*/
String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
//3.定义SQL语句
String sql = "UPDATE ACCOUNT SET MONEY = 2000 WHERE ID = 1;";
//4.获取执行SQL的对象 statement
Statement stmt = conn.createStatement();
//5.执行SQL
int count = stmt.executeUpdate(sql);//返回一个影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
}
jdbc的API
DriverManager(驱动管理类):
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接对象
static Connection getConnection(String url,String user,String password)
Connection(数据库连接对象):
1.获取执行SQL的对象
2.管理任务
package wryyyyy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class test_01
{
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
//2.获取连接
/*
1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
*/
String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
//3.定义SQL语句
String sql1 = "UPDATE ACCOUNT SET MONEY = 3000 WHERE ID = 1;";
String sql2 = "UPDATE ACCOUNT SET MONEY = 3000 WHERE ID = 2;";
//4.获取执行SQL的对象 statement
Statement stmt = conn.createStatement();
/*
回滚事务,利用Java中的异常处理机制trycatch捕获异常,让回滚事务在catch中被执行
*/
try
{
//开启事务
conn.setAutoCommit(false);
//5.执行SQL
int count1 = stmt.executeUpdate(sql1);//返回一个影响的行数
//6.处理结果
System.out.println(count1);
int i = 3/0;
//5.执行SQL
int count2 = stmt.executeUpdate(sql2);//返回一个影响的行数
//6.处理结果
System.out.println(count2);
//提交事务
conn.commit();
}
catch (Exception e)
{
//回滚事务
conn.rollback();
e.printStackTrace();
}
//7.释放资源
stmt.close();
conn.close();
}
}
Statement(执行SQL语句):
ResultSet(结果集对象):
游标默认指向当前数据行的下一行,要获取数据,首先游标要往下移动一行,并且判断这一行是不是有效行。
package wryyyyy;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test_03
{
/**
* 执行对应的DML语句
* @throws Exception
*/
@Test
public void testResultSet() throws Exception
{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
//2.获取连接
/*
1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
*/
String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
//3.定义SQL语句
String sql = "select * from account";
//4.获取执行SQL的对象 statement
Statement stmt = conn.createStatement();
//5.执行SQL
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果
//6.1 光标向下移动一行,并判断当前行是否有数据
while (rs.next())
{
//6.2 获取数据
int id = rs.getInt(1);
String name = rs.getString(2);
double money = rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("---------------------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement(继承于Statement)(预编译SQL语句的对象):
预编译SQL语句并执行,预防SQL注入的问题(SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法)
package wryyyyy;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test_04
{
/**
* 用户登录
*/
@Test
public void testResultSet() throws Exception
{
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
//接收用户输入的用户名和密码
String name = "张三";
String pwd = "123";
String sql = "select * from account where name = '"+name+"' and pwd = '"+pwd+"'";
//获取执行SQL的对象 statement
Statement stmt = conn.createStatement();
//执行SQL
ResultSet rs = stmt.executeQuery(sql);
//判断是否登陆成功
if(rs.next())
{
System.out.println("登陆成功");
}
else
{
System.out.println("登陆失败");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement作用-预编译SQL并执行SQL语句:
package wryyyyy;
import org.junit.Test;
import java.sql.*;
public class test_05
{
/**
* 用户登录
*/
@Test
public void testResultSet() throws Exception
{
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
//接收用户输入的用户名和密码
String name = "张三";
String pwd = "123";
//定义SQL
String sql = "select * from account where name = ? and pwd = ?";
//获取stmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行SQL
ResultSet rs = pstmt.executeQuery();
//判断是否登陆成功
if(rs.next())
{
System.out.println("登陆成功");
}
else
{
System.out.println("登陆失败");
}
//7.释放资源
rs.close();
pstmt.close();
conn.close();
}
}
PreparedStatement原理:
当Java代码把SQL语句发送到服务器中时,mysql服务器:
检查和编译SQL执行时间比执行SQL大,如果没有使用预编译的话,每一次发送SQL语句都会走一遍这整个流程,而预编译SQL时,前面的模板是固定的,后面的?作为占位符来替代,当设置完值的时候,就只剩下执行了。
PreparedStatement预编译功能开启:
useServerPreStmts=true
String url = "jdbc:mysql:///db1?useSSL=false&useServerPreStmts=true";
数据库连接池
在系统启动之前,初始化一个容器(就是集合),在这个容器里面提前申请很多个数据库的连接,连接用完之后归还。
数据库连接池的实现:
Druid实现步骤:
package com.sunyinglian.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* Druid的数据库连接池演示
*/
public class DruidDemo
{
public static void main(String[] args) throws Exception
{
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties prop = new Properties();
/*
获取当前路径:System.out.println(System.getProperty("user.dir"));
*/
prop.load(new FileInputStream("test_module/src/druid.properties"));
//4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}