JavaWeb学习笔记之Jdbc(一)

1.概念

Jdbc(java database connectivity):Java数据库连接,就是用Java语言来操作数据库。原来我们操作数据库是在控制台中通过sql语句来操作数据库,而Jdbc是用Java语言来向数据库发送sql语句来操作数据库。

2.流程

2.1得到Connection对象

  • 1.导jar包。mysql-connector-java jar
  • 2.加载驱动类:Class.forName(“类名”);
  • 3.给出url、username、password等参数。
  • 4.使用DriverManager类来的到Connection对象。

时刻牢记Jdbc中的四大参数:

  • driverClassName:com.mysql.jdbc.Driver
  • url:jdbc:mysql://localhost:3306/数据库名
  • username:mysql用户名
  • password:mysql密码

Demo:

1
2
3
4
5
6
7
8
9
10
11
public class Demo{
public void main(String[] args) throws ClassNotFoundException,SQLException{

Class.forName("com.mysql.jdbc.Driver");//加载驱动类。
String url="jdbc:mysql://localhost:3306/数据库名";
String username="root";
String password="123";

Connection con=DriverManager.getConnection(url,username,password);
}
}

代码分析:

  1. url的格式为–jdbc:厂商名称:子协议(由厂商自己来规定)。对于mysql而言,它的子协议结构的格式为://localhost:3306/数据库名。
  2. 出现SQLException的原因:1.url username password 是否正确。2.检查是否打开了sql服务器
  3. 出现ClassNotFoundException的原因:1.没导入驱动包。2.Class.forName()传入的字符串参数错误。

3.Jdbc对数据库进行增、删、改、查

3.1增、删、改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Demo{
public void main(String[] args) throws ClassNotFoundException,SQLException{

Class.forName("com.mysql.jdbc.Driver");//加载驱动类。
String url="jdbc:mysql://localhost:3306/数据库名";
String username="root";
String password="123";

Connection con=DriverManager.getConnection(url,username,password);

Statement stmt=con.createStatement();//调用Connection的方法创建Statement对象,它是sql语句的发送器,功能就是向数据库发送sql语句
String sql="insert into stu values('...','...','...','...')";//右括号不需要打分号,打了就会出错,因为程序会自动帮我们加。
stmt.executeUpdate(sql);//调用此方法向数据库发送sql语句。该语句返回的值为改变数据库的行数。
}
}

注意:上述中出现的Connection和Statement都应该导入java.mysql下的包,而不是java.jdbc下的包。

3.2查询

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Demo{
public void main(String[] args) throws ClassNotFoundException,SQLException{

Class.forName("com.mysql.jdbc.Driver");//加载驱动类。
String url="jdbc:mysql://localhost:3306/数据库名";
String username="root";
String password="123";

Connection con=DriverManager.getConnection(url,username,password);

Statement stmt=con.createStatement();

String sql="selece * from stu";

ResultSet rs=stmt.execute(sql);

/*
*解析ResultSet
*ResultSet提供了一系列的getXxx()方法
*/

while(rs.next())//第一次调用next()方法是将光标移动到该表的第一行
{
rs.getInt(1);//通过列编号来获取该列的值
rs.getString("name");//通过列名称来获取该列的值。
}
}
}

4.关闭资源

关闭资源时采用倒关的手法将对象进行处理:即先得到的对象后关,后得到的对象先关。

1
2
3
rs.close();
stmt.close();
con.close();

为了注意代码的规范化:在try外给出引用的定义,在try内位对象实例化,在finally中对资源进行关闭。

5.PreparedStatement(预处理)

5.1介绍

PrepaerdStatement是Statement的子接口。下面通过一个例子学习PreparedStatement,注意与上述例子中Statement的区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Demo{
public void main(String[] args) throws ClassNotFoundException,SQLException{

Class.forName("com.mysql.jdbc.Driver");//加载驱动类。
String url="jdbc:mysql://localhost:3306/数据库名"; String username="root";
String password="123";

Connection con=DriverManager.getConnection(url,username,password);

String sql="insert into stu values(?,?)";//定义sql模板,即参数以问号的形式给出

PreparedStatement pst=con.prepaerStatement(sql);
pst.setString(1,username);//数字1代表第一个问号
pst.setString(2.password);//数字2代表第二个问号
pst.executeUpdate();//向数据库发送sql语句
}
}

5.2预处理的原理

服务器的工作:

  • 1.检验sql语句的语法
  • 2.编译:一个与函数相似的东西
  • 3.执行:调用函数

PreparedStatement使用的前提就是:连接的数据库必须支持预处理。

以后我们要学的DAO模式就是写一个类,把访问数据库的代码封装起来,DAO在数据库与业务逻辑层之间。

6.Java中的时间类型和mysql中的时间类型转换

6.1数据库类型与Java中类型的对应关系

数据库中的DATE–>java.sql.Date–>java.util.Date;

数据库中的TIME–>java.sql.Time–>java.util.Date;

数据库中的TIMESTAMP–>java.sql.Timestamp–>java.util.Date;

需要注意的是:

  • 1.领域对象(domain)中的所有属性不能出现java.sql包下的东西,即不能使用java.sql.Date、java.sql.Time、java.sql.TimeStamp。
  • 2.ResultSet的getDate()返回的是java.sql.Date()。
  • 3.PreparedStatment的setDate(int,Date),其中第二个参数是sql包下的java.sql.Date()。为了在java中使用sql包下的时间类型,这是就出现了时间类型的转换。

6.2转换

6.2.1将util包下的Date转换为sql包下的Date、Time、Timestamp

步骤如下:

  • 1.把util的的Date转换成毫秒值。
  • 2.使用毫秒值创建sql的Date、Time、Timestamp

    java.util.Date date=new java.util.Date();
    long l=date.getTime();
    java.sql.Date sqlDate=new java.sql.Date(l);

6.2.2将sql包下的Date、Time、Timestamp转换为util包下的Date

这一步不需要处理了,因为sql包下的Date、Time、和Timestamp继承自util包下的Date。所以可以直接用:

1
2
3
new java.util.Date()=new java.sql.Date();或
new java.util.Date()=new java.sql.Time();或
new java.util.Date()=new java.sql.Timestamp();

7.大数据

将大数据的歌曲存入数据库。代码日后补上。

8.批处理

8.1Statement批处理

批处理就是一批一批的处理,而不是一个一个的处理。

当你有10条sql语句要执行时,一次向服务器发送一条语句,这么做效率很差。处理的方案是用批处理,即一次向服务器发送多条sql语句,然后由服务器一次性处理。

批处理只针对更新(增、删、改),没有查询什么事。

添加批的语句:PreparedStatement.addBatch();
执行批的语句:PreparedStatement.executeBatch();

mysql默认批处理是关闭的,需要在url参数后面加上?rewriteBatchedStatement=true;

2018.3.19更

欢迎加入我的Java交流1群:659957958。

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626

9.联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

记得扫一扫领一下红包再走哦