JDBC编程
目录
概念
JDBC示例
JDBC API
1.DriverManager
2.Connection
3.Statement
4.ResultSet
5.PreparedStatement
数据库连接池
DataSource
Druid
概念
JDBC全称Java DataBase Connectivity (java数据库连接),是一套操作关系型数据库的javaAPI。
数据库驱动jar包:JDBC接口的实现类,由数据库厂商实现。
意义:
面向接口编程,java代码不需要针对不同的数据库分别开发。
在更换底层数据库时,也不需要大量更改代码。
JDBC示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class Main {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn=DriverManager.getConnection(url,username,password);//3.定义SQLString sql="update student set age=18 where name='wj'";//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sqlint count=stmt.executeUpdate(sql);//6.处理结果System.out.println(count);//7.释放资源stmt.close();//先conn.close();//后}
}
JDBC API
1.DriverManager
驱动管理类 工具类,全是静态方法
作用:
1.注册驱动
static void registDriver(Driver driver)
#Driver类中静态代码块中调用了该方法。
2.获取数据库连接
static Connection getConnection(String url,String user,String password)
String url="jdbc:mysql://127.0.0.1:3306/mybase";
url: jdbc:mysql://ip地址或域名:端口号/数据库名称?参数键值对1&参数键值对2...
连接本机mysql服务器,并且服务器默认端口3306,可简写。
2.Connection
与特定的数据库连接,执行SQL语句并在连接的上下文返回结果
作用:
1.获取执行SQL的对象
i.普通执行SQL对象 Statement createStatement()
ii.预编译SQL的执行SQL对象:防止SQL注入 PreparedStatement preparedStatement(sql)
iii.执行存储过程的对象 CallableStatement prepareCall(sql)
2.管理事务
i.开启事务 setAutoCommit(boolean autoCommit);//true为自动提交,false手动
ii.提交事务 commit();
iii.回滚事务 rollback()
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class connection {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql1="update student set age=20 where name='wj'";//check约束,0--100String sql2="update student set sex='男' where name='wj'";//有check约束,只能说男/女//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sql//6.处理结果try {conn.setAutoCommit(false);int count1=stmt.executeUpdate(sql1);System.out.println(count1);int count2=stmt.executeUpdate(sql2);System.out.println(count2);conn.commit();} catch (SQLException e) {conn.rollback();throw new RuntimeException(e);}//7.释放资源stmt.close();//先conn.close();//后}
}
3.Statement
作用:执行SQL语句
执行DML和DDL语句 int executeUpdate(sql);
//DML语句返回影响的行数,DDL执行成功有可能返回0
执行DQL语句 ResultSet executeQuery(sql);//返回ResultSet结果集对象
4.ResultSet
结果集对象 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql);//返回ResultSet结果集对象
获取查询结果
- boolean next();//将光标下移,判断是否为有效行
- xxx getXxx(参数);//参数为:列号(从1开始)或列名;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class resultset {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql="select * from student";//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sqlResultSet rs=stmt.executeQuery(sql);//6.处理结果//6.1光标向下移动while(rs.next()){//6.2 获取数据 getXxx()int id=rs.getInt(1);String name=rs.getString(2);int age=rs.getInt(3);String sex=rs.getString(4);String address=rs.getString(5);System.out.println(id);System.out.println(name);System.out.println(age);System.out.println(sex);System.out.println(address);System.out.println("-------------");}//7.释放资源stmt.close();//先conn.close();//后}
}
5.PreparedStatement
继承自Statement
作用:预编译SQL语句并执行:预防SQL注入
SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
String name="' or '1'='1";System.out.println(name);//3.定义SQLString sql="update student set age=18 where name='"+name+"'";
通过操作name,使得where语句恒为true
PreparedStatement的使用:
1.sql语句中的参数值用占位符?替代 where name = ?
2.获取PreparedStatement对象 PreparedStatement pstmt=conn.preparedStatement(sql);
3.设置参数 pstmt.setXxx(参数1,参数2);//给?赋值。
Xxx为数据类型,参数1为?的位置从1开始,参数2为?的值
4.执行SQL pstmt.executeUpdate();或executeQuery(); 不需要传参
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;public class preparedStatement {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql="update student set age=8 where name=?";//4.获取执行sql的对象PreparedStatement pstmt=conn.prepareStatement(sql);//给?赋值pstmt.setString(1,"wj");//5.执行sqlint count=pstmt.executeUpdate();//6.处理结果System.out.println(count);//7.释放资源pstmt.close();//先conn.close();//后}
}
String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
uesServerPrepStmts=true开启预编译功能
预编译,性能更高
相同模板的sql,只需要进行一次检查和编译
数据库连接池
一个容器,负责分配、管理数据库连接
应用程序从连接池里面取出现有的数据库连接,不需要重新建立一个(资源再用,提高速度)
还会释放空闲时间过长的连接,避免遗漏
DataSource
数据库连接池接口,由厂商实现
Druid
德鲁伊数据库连接池
配置文件
#druid???? driverClassName = com.mysql.jdbc.Driver #url url=jdbc:mysql://127.0.0.1:3306/mybase?&uesServerPrepStmts=true username=root password=111111 #初始化连接数 initialSize = 5 #最大连接数 maxActive = 10 #最大等待时间 maxWait = 3000
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;public class druid {public static void main(String[] args) throws Exception{//1.导入jar包druid//2.定义配置文件druid.properties//3.加载配置文件Properties prop=new Properties();prop.load(new FileInputStream("src/druid.properties"));//4.获取连接池对象DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection conn= dataSource.getConnection();System.out.println(conn);//System.out.println(System.getProperty("user.dir"));}
}