JDBC学习记录

jdbc学习

认真的回顾一下jdbc。巩固一下知识。争取用最通俗的话来解释。

首先我们在编程中肯定是要用到数据库的,一个方法就是每次使用的时候去使用sql语句去操作增删改查,第二个就是可以使用一些软件,是数据库操作可视化,更加直观。

上面这两种方法虽然可以实现操作数据库,但是如果我们在代码中需要去操作数据库,就不能再去自己输入sql语句,所以就需要有一个解决办法让我们可以在java代码里面去对数据库进行操作。

现在我们有java,有了mysql,那怎么把这两个连起来,能让我在java中用mysql呢?就是上面提到的第三种方法,也就是jdbc(Java Data Base Connectivity,java数据库连接)是最基础的一个在java中操作数据库的方法。

首先我们要知道jdbc会提供一个API,里面有一些东西是给我们用来建立连接的。最主要的是三个:

1.DriverManager:驱动管理,这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。

上面这段话有点复杂,先可以将驱动简单的认为是判断是那种数据库的方法。

在java中使用的方法

mysql:Class.forName("com.mysql.jdbc.Driver")

oracle:Class.forName("oracle.jdbc.driver.OracleDriver")

2.Connection:此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。

这个就是去配置和数据库连接的信息了,比如数据库的url,用户名,密码。我们肯定是要告诉java,去哪里找数据库,然后数据库的密码是什么,这样才能连接到数据库。

使用方法:

Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chenh","root","123456");

数据库所处于的ip:localhost (本机)

数据库的端口号:3306(mysql专用端口号)

数据库名称chenh

账号root

密码admin

3.Statement:可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数.

这个的作用就是去执行sql语句了,把sql语句通过建立好的连接,发送到数据库执行,并且返回结果。

4.ResultSet:返回结果集

这个的作用是获取到查询表里面的数据,resultset有getString,getInt等方法,用来获取不同类型的字段。另外需要使用result.next()方法来获取第一行的数据,这个方法是Boolean类型,判断下一行是不是有数据。

有上面的这几部分,我们就可以使用jdbc去操作数据库了。

首先建一个user表,里面两个字段id,name,插入一条数据id=1,name="坤哥"

然后model类。

public classUser {

private intid;

private

Stringname;

publicUser(){

}

public intgetId() {

return  id;

}

public voidsetId(intid) {

this.id= id;

}

publicStringgetName() {

return  name;

}

public voidsetName(String name) {

this.name= name;

}

接下来是一个类,来测试能不能正常使用。

public classjdbc {

public staticUserGetOneUser(String sql) {

User user=null;

try{

Class.forName("com.mysql.jdbc.Driver");

Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/chenhao","root","123456");

PreparedStatement prsmt = conn.prepareStatement(sql);

ResultSet rs=prsmt.executeQuery();

rs.next();

//result.next的意思是读取到结果集的下一行内容。使用while(rs.next)意思是将结果集内容全部读取出来。

//next返回的是boolean类型,来判断下一行是不是为空。

user=newUser();

user.setId(rs.getInt("id"));

user.setName(rs.getString("name"));

//通过rs.get来获取到从数据库查到的数据。name是model中对应的内容

}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(SQLException e) {

e.printStackTrace();

}

return  user;

}

public static voidmain(String[] args) {

User user=GetOneUser("select *from user where id=1");

System.out.println("id"+user.getId()+"姓名"+user.getName());

}

}

结果应该是

实现了以后就可以继续深入一点点。

我们在每次获取连接之后,连接就会存在,如果每次都不关闭连接释放资源的话,在数据量比较大的情况下会吧内存占满,会导致内存溢出,程序中断。所以我们在建立连接使用完之后一定要去释放链接。

顺序是:先关闭ResultSet -----statement-----connection。

每一个都可以调用close方法去关闭。

加上以后完整的是这样的:

public classjdbc {

public staticUserGetOneUser(String sql) {

Connection conn=null;

PreparedStatement prsmt =null;

ResultSet rs=null;

User user=null;

try{

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chenhao","root","123456");

prsmt = conn.prepareStatement(sql);

rs=prsmt.executeQuery();

rs.next();

//result.next的意思是读取到结果集的下一行内容。使用while(rs.next)意思是将结果集内容全部读取出来。

//next返回的是boolean类型,来判断下一行是不是为空。user=newUser();

user.setId(rs.getInt("id"));

user.setName(rs.getString("name"));

//通过rs.get来获取到从数据库查到的数据。name是model中对应的内容}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(SQLException e) {

e.printStackTrace();

}

finally{

try{

if(rs !=null)

rs.close();

if(prsmt !=null)

prsmt.close();

if(conn !=null)

conn.close();

}catch(SQLException e) {

e.printStackTrace();

}

}

return user;

}

public static voidmain(String[] args) {

User user=GetOneUser("select *from user where id=1");

System.out.println("id"+user.getId()+"姓名"+user.getName());

}

}

到这里我们是使用了基本的jdbc进行操作数据库。但是上面只用到了一个方法就是根据id查找,那还有增删改怎么做?

也比较简单就是建立连接-----使用sql语句-----关闭连接。然后把这个流程写成一个方法,去main函数调用写一下。

这样写肯定是没错的,但是想一下,如果真这么做的话,我是不是每个方法里面都需要去建立连接,关闭连接。这些重复的部分写起来很麻烦,那么我们用面向对象的思想,把建立连接和关闭连接写成一个类,里面有两个方法,那我每次需要的时候,就直接去调用一下,这样不是方便很多?而且看起来也会更加清晰。

我们把重复的部分拿出来写成一个类:如下

public classDBConnection {

//获取数据库连接public staticConnectiongetConnection() {

Connection conn =null;

try{Class.forName("com.mysql.jdbc.Driver");

//将驱动加载,供给jmv使用,开始执行静态初始化代码时,会自动新建一个Driver的对象,并调用DriverManager.registerDriver把自己注册到DriverManager中去。

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chenh,"root","123456");

}

catch(ClassNotFoundException e) {

e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因}catch(SQLException e) {

e.printStackTrace();

}

return   conn;

}

//关闭所有资源public static voidcloseAll(ResultSet rs,Statement stmt,Connection conn){

try{

if(rs!=null)

rs.close();//result set

if(stmt!=null)

stmt.close();

if(conn!=null)

conn.close();//connection

}catch(SQLException e) {

e.printStackTrace();

}

}

}

这个时候我们再去调用的时候就方便很多了,建立连接只要写

Connectionconn = DBConnection.getConnection();

关闭连接:

DBConnection.closeAll();

然后这时候再去实现增删改:

public classcrud {

//增加public static voidadd(User user){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rs=null;

String sql="insert into user( id, name)values (?,?)";

try{

conn= DBConnection.getConnection();

pstmt=conn.prepareStatement(sql);

pstmt.setInt(1,user.getId());

pstmt.setString(2,user.getName());

pstmt.execute();

}catch(SQLException e) {

e.printStackTrace();

}

finally{

DBConnection.closeAll(rs,pstmt,conn);

}

}

//删除public static voiddelete(intid){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rs=null;

String sql="delete from user where id=?";

try{

conn=DBConnection.getConnection();

pstmt=conn.prepareStatement(sql);

pstmt.setObject(1,id);

pstmt.executeUpdate();

System.out.println("删除學生成功!");

}catch(SQLException e) {

e.printStackTrace();

}finally{

DBConnection.closeAll(rs,pstmt,conn);

}

}

//修改public static voidupdate(User user){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rs=null;

String sql="update user set name=? where  id=?";

try{

conn=DBConnection.getConnection();

pstmt=conn.prepareStatement(sql);

pstmt.setString(1,user.getName());

pstmt.setInt(2,user.getId());

pstmt.executeUpdate();

System.out.println("修改学生成功");

}catch(SQLException e){

e.printStackTrace();

}

finally{

DBConnection.closeAll(rs,pstmt,conn);

}

}

//查询public staticUsergetUser(intid){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rs=null;

User user=null;

String sql="select*from user where id=?";

try{

conn=DBConnection.getConnection();

pstmt=conn.prepareStatement(sql);

pstmt.setInt(1,id);

rs=pstmt.executeQuery();

rs.next();

user =newUser();

user.setId(id);

user.setName(rs.getString("name"));

}catch(SQLException e) {

e.printStackTrace();

}

finally{

DBConnection.closeAll(rs,pstmt,conn);

}

returnuser;

}

//查询列表public staticListlistUser(){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rs=null;

String sql="select*from user";

List list=null;

try{

conn=DBConnection.getConnection();

pstmt=conn.prepareStatement(sql);

rs=pstmt.executeQuery();

User user=null;

list=newArrayList();

while(rs.next()){

user=newUser();

user.setId(rs.getInt("id"));

user.setName(rs.getString("name"));

list.add(user);

}

}

catch(SQLException e) {

e.printStackTrace();

}

return  list;

}

public static voidmain(String[] args) {

//增加

//User user=new User();

//user.setId(10);

//user.setName("haha");

//crud.add(user);

//删除

//crud.delete(10);

//修改

//User user=new User();

//user.setId(1);

//user.setName("haha");

//crud.update(user);

//查询

//User user =crud.getUser(1);

//System.out.println(user.getName());

//查询列表List list=crud.listUser();

for

(User aaa:list){

System.

out.println(aaa.getName()+""+aaa.getId());

}

}

}

到这里我们就实现了增删改查基本的操作。

自己学习的一个总结,能帮助到人的话就更荣幸啦。另外有错误欢迎大家讨论!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • JDBC简介 SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。JDBC...
    奋斗的老王阅读 1,490评论 0 51
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,497评论 18 399
  • 本人的环境为Myeclipse10、MySQL5.7.15 本文包括:简介JDBC编程步骤打通数据库程序详解—Dr...
    廖少少阅读 3,913评论 7 39
  • 预编译sql处理(防止sql注入) Statement : 执行SQL命令CallableStatement : ...
    奋斗的老王阅读 1,140评论 2 52
  • Aaaaaa Bbbb 我要吃饭 这次是认真的 可以了 测试百度 那天
    陈建利阅读 191评论 0 0