用mysql:mysql-connector-java
在pom.xml中引入SQL和JSTL
mysql-connector-java
jstl-api
jstl-impl
1.JDBC
1.1什么是JDBC:Java Database Connectivity,Java数据库连接,其实就是通过Java语言连接数据库。
原来在操作数据库是控制台写sql语句来操作数据库,是通过JDBC就数据库发送sql语句操作数据库
JDBC原理:
比如:买完电脑,装上显卡,还需要安装显卡的驱动,那么显卡驱动程序包是显卡的厂商的提供。
JDBC操作数据库:MySQL、Oracle、DB2等数据库,前提就是导入数据库驱动的程序包
那么这些数据库驱动程序包是由数据库厂商提供的,经过协商,由sun公司的技术人员提供一套规范,
由不同的数据库厂商按照这套规范去提供数据库驱动包。这套规范(JDBC规范)就是一组接口,
程序员通过操作JDBC这一组接口就可以操作不同的数据库了。
1.2JDBC常用的API
1.Driver:在java.sql包下面(由sun公司提供),里面常用的方法可以常用的方法可以获取数据库驱动程序的版本号
2.DriverManager类:在Java.sql包下面,获取数据库连接对象,注册驱动
第一个方法:注册数据库驱动,registerDriver(Driver driver)
第二个方法:获取数据库连接,Connection con = getConnection(url,username, password);
url:与数据库连接的地址
username:安装数据库时的用户名
password:数据库的密码
3.Connection接口:在java.sql包下面,获取发送sql语句的对象
第一个方法:Statement st =createStatement();
第二个方法:PreparedStatemnt pst=preparedStatement(sql语句);
4.Statement接口:在java.sql包下面,向数据库发送sql语句,操作数据库
第一个方法:对数据库进行添加、删除、修改,或者在数据库再创建表等操作,一句话就是对数据库进行
DML(insert into :添加,update:修改,delete:删除)、DDL(create:创建表,drop:删除表)操作
int row=executeUpdata(String sql)
第二个方法:对数据库进行查询操作。
ResultSet re=executeQuery(String sql) //返回的是一个结果集
5.PreparedStatement接口:在java.sql包下面,是Statement的子接口。
第一个方法:对数据库进行添加、删除、修改,或者在数据库再创建表等操作,一句话就是对数据库进行
DML(insert into :添加,update:修改,delete:删除)、DDL(create:创建表,drop:删除表)操作
int row=executeUpdata()
第二个方法:对数据库进行查询操作。
ResultSet re=executeQuery() //返回的是一个结果集
6.ResultSet接口:在java.sql包下面的,用来封装查询的结果。
常用的方法:获取查询的结果
比如获取字段类型为varchar的值:getstring(字段的名称或者字段的编号)
获取字段类型为int的值:getInt(字段名称或者字段的编号);
结论:获取字段对应的值:getXXX(字段名称或者字段的编号);//XXX表示类型
1.3实现第一个JDBC案例
通过Java代码操作数据库的具体步骤:前提导入数据库的jar包
1.注册并加载驱动:
DriverManager.register(Driver driver); //这种不是很规范
或者Class.forName("com.mysql.jdbc.Driver"); //这种较为规范
2.获取Connection连接对象
Connection con=DriverManager.getConnection(url,username,password);
3.获取操作数据库的对象Statement(或者PreparedStatement)
Statement stmt =con.createStatement();
4.向数据库发送sql语句,执行操作。
比如执行查询操作:String sql=“select * from users”;调用executeQuery(sql);
5.执行查询操作,返回ResultSet结果集对象,结果集里面封装的是查询的结果。
遍历ResultSet,获取我们查询的数据。
6.关闭连接,释放资源(倒关原则:先出现的,后关闭)
对象.close();
准备工作:
1.创建数据库:jdbc,在这个数据库里创建表,插入几条数据(查看sql表是否创建成功:show databases;)
create database jdbc;
use jdbc;
create table users(id int primary key auto_increment,
name varchar(32),
password varchar( 32),
email varchar(160),
birthday Date);
insert into users(name,password,email,birthday) values('zhangsan','123','zhangsan@qq.com','1999-4-26');
insert into users(name,password,email,birthday) values('lisi','234','lisi@qq.com','1998-5-29');
insert into users(name,password,email,birthday) values('wangwu','345','wangwu@qq.com','2000-5-29');
注意:1.在开发中通常使用Class.forName("com.mysql.jdbc.Driver");注册驱动,不用DriverManager.register(Driver driver);
因为该方法注册了两次
2.关闭资源时,关闭资源的代码一定要放在finally快里面,因为前面的代码无论是否发生异常,这个快里的关闭资源
代码总会被执行。因为数据库连接资源很宝贵,数据库连接资源时是有限,所以一定要关。
1.4PreparedStatement对象
PreparedStatement和Statement区别:
1.功能:它们都可以向数据库发送sql语句,对数据库进行crud操作
2.Statement操作数据库时,如果执行相同的sql语句多次,每次都会对sql语句进行编译,效率太低
PreparedStatement操作数据库时,会提前预编,所以执行相同的sql语句多次,效率会提高很多。
3.java.sql.Date和java.util.Date的关系:util的是父类
两个Date之间的相互转换:
java.util.Date utilDate = new java.sql.Date();
java.sql.Date sqlDate = new java.sq1.Date(new java.util.Date().getTime());
注意:数据库插入日期值一定要用java.sql.Date
1.5ResulSet对象
返回的是一个结果集,用来封装查询出来的数据(查询出来的数据其实就是一个表),调用next方法跳转到下一行,逐个获取这一行的所有数据
如果像支持结果集的滚动效果,在创建Statement对象时,就得支持滚动效果
ResultSet之滚动结果集(了解)
ResultSet结果集是否支持滚动,要从Connection类的createStatement()方法说起。也就是说创建的Statement决定了使用statement决定了
Statement createStatement(int resultSetType,int resultSetConcurrency)
resultSetType的可选值:
*ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
*ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
*CONCUR_READ_onLY 只读方式打开结果集。
ResultSet表示结果集,它是一个二维的表格! Resultset内部维护一个行光标((游标),
Resultset提供了一系列的方法来移动游标:
*void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;
*void afterLast():把光标放到最后一行的后面;
*boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;
*boolean last():把光标放到最后一行的位置上;
*boolean isBeforeFirst():当前光标位置是否在第一行前面;
*boolean isAfterLast():当前光标位置是否在最后一行的后面;
*boolean isFirst():当前光标位置是否在第一行上;
*boolean isLast():当前光标位置是否在最后一行上;
*boolean previous():把光标向上挪一行;
*boolean next():把光标向下挪一行;
*boolean jrelative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
*boolean absolute(int row):绝对位移,把光标移动到指定的行上;
*int getRow():返回当前光标所有行。