1.Jdbc语法
1.加载注册驱动
Class foeName("驱动实现类的全限定名");
mysql:class.forName("com.mysql.jdbc.Driver");
问题:为啥写这一句话,就会把驱动进行加载注册???
步骤1:把com.mysql.jdbc.Driver这份字节码加载进JVM.--->创建class对象。
步骤2:当一份字节码被加载进JVM,就会执行字节码中的静态代码块。
步骤3:而静态代码块中,就是使用DriverManager.registerDriver(new Driver())注册驱动。
2.使用DriverManager获取连接。
Connection conn = DriverManager.getConnection(String url,String user,String password);
参数:
url:jdbc:mysql://ip:端口/数据库的名字
MYSQL:jdbc:mysql://localhost:3306
简写:若连接是本机,并且端口3306:jdbc:mysql:///dbname
Oracle:jdbc:oracle:thin:@127.0.0.1:1521:dbname
user:账号,root
password:密码,admin
验证以获取连接:可以在mysql控制台,使用命令: show processlist; 查看mysql运行进程。
从java6(JDBC4.0)开始,可以不再加载注册驱动。
直接通过DriverManager获取连接对象。
3.为啥不再需要加载驱动了?
从java6开始,规范要求每一个JDBC驱动包,都必须带有META-INF/serveces/java.sql.Driver文件
开发建议:依然还是建议手动的加载注册驱动,如此,可以兼容之前的JDK版本。
PS:有时候,mysql的驱动类也会看到使用org.git.mm.mysql.Driver的情况,它是早期的名称,后来改名为
com.mysql.jdbc.Driver推荐使用它
在最新版本的mysql jdbc驱动中,为了保持对老版本的兼容,仍然保留了org.git.mm.mysql.Driver,但是实际上
org.git.mm.mysql.Driver中调用了com.mysql.jdbc.Driver.因此现在这俩个驱动没有去区别。
public class ConnectionTest {
public static void main(String[] args) throws Exception {
test1();
}
public static void test1() throws Exception {
//贾琏
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","111111");
Thread.sleep(6000);
}
}
2.JDBC的操作步骤
JDBC的操作步骤:
口诀:贾琏欲执事
1.加载注册驱动
2.获取连接对象
3.获取/创建语句对象
4.执行sql
5释放资源
Connection 接口:获取connection对象:
Connection conn = DriverManager.getConnection(String url,String user,String password);
常用方法:
Statement createStatement();创建语句对象,将SQL语句发送到数据库
close();释放连接资源
Statement的继承体系:
Statment接口:
------:CallableStatement接口:操作存储过程,不讲。
------:PreparedStatement接口:表示预编译语句对象,使用?占位符的方式来拼SQL.
Statement接口:用于执行静态SQL(写死的SQL语句)。
常用方法:
int executeUpdate(String sql):执行DDL/DML的SQL语句,DML操作返回受影响的行数,DDL操作返回0
ResultSet executeQuery():执行DQL的SQL语句,做查询并返回ResultSet对象 (结果集)。
close();释放资源
PreparedStatement接口:
常用方法:
int executeUpdate();执行DDL/DML的SQL语句,DML操作返回受影响的行数,DDL操作返回0
ResultSet executeQuery();执行DQL的SQL语句,做查询,并返回ResultSet对象(结果集)。
注意:方法中没有参数SQL;
void setXxx(int index,Xxx value):设置第几个?的参数值,从1开始的。
注意Xxx是数据类型,比如String ,Long,int,boolean等。
ResrutSet接口:表示查询的结果集(查询结果的封装对象),是通过执行查询语句得到的,
在ResultSet中就拥有获得查询结果数据的方法。
常用方法:
boolean next():判断是否有下一行数据,若有,则向下移动一行指针。
Xxx getXxx(int columnIndex):获取当前的第几列的数据,从1开始,(不建议)
Xxx getXxx(String clounmIndex):获取当前行的执行列名,对应列的数据可以使用别名。
注意:Xxx是数据类型,比如。String,long,int,boolean等。
Object getObject(int/String columnIndex):获取某一列的数据,通通使用Object来接收
close();释放结果集资源
使用Statement编译语句对象:
@Test
public void testCreateTable() throws Exception {
//创建一张表:t_student(id,name,age列)
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "111111");
//3.获取/创建语句对象
Statement st = conn.createStatement();
//4.执行sql
String sql = "create table t_student(id int primary key,name varchar(20),age int(11));";
st.executeUpdate(sql);
//5释放资源
st.close();
conn.close();
}
使用PreparedStatement预编译语句对象:
@Test
public void testName() throws Exception {
//贾琏
Connection conn = JdbcUtil.INSTANCE.getConn();
//欲
String sql = "insert into product (ProductName,salePrice,dir_id,brand) values (?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "iphoneX");
ps.setBigDecimal(2, new BigDecimal("8500"));
ps.setLong(3,5L);
ps.setString(4,"iphone");
//执
ps.executeUpdate();
//释
JdbcUtil.INSTANCE.close(conn, ps, null);
}