JAVA零基础自学笔记-JDBC篇

个人自学笔记

(2015年版本--黑马视频)

大神勿喷!

  

 

JDBC的定义

Java代码一执行,sql语句显示到控制台

操作数据库的标准规范   Java database connectivity

 

Java语言来操作数据库   J   DB   C

 

JDBC           数据库驱动

 

接口(规范)------实现类 (*驱动*)------各类数据库

************程序员不需要关心驱动,只需要会JDBC这个接口

 

(数据库很多,oracle,mysql)

 

 

Client.java(客户端)============数据库DB===========控制台

                  

Select语句从客户端出发,到达DB,再到控制台

statement(),通过connection()---------------statement返回,ResultSet

    ResultSet是客户端的在内存里的一个对象,DB里返回的数据

 

如何添加Jar

Lib  下面有mysql-connector-5.0.8-java-bin.jar

     Build path     

     ADD  to build path   classpath路径        

 

 

 

接口         JDK中   java.sql.*  javax.sql.*

驱动,是实现类-------------jar

 

 

JDBC规范(掌握四个核心对象):

DriverManager:用于注册驱动           

Connection: 表示与数据库创建的连接   接口      接口的实现在数据库驱动中

Statement: 操作数据库sql语句的对象   接口

ResultSet: 结果集或一张虚拟表         接口      (封装结果集)

 

*****需要加入所需要的厂商的jar包  ****构建path

 

 

 

 

 

 

3、实现JDBC操作

//1、注册驱动                               加载类

DriverManager.registerDrivernew com.mysql.jdbc.Driver());

//2、创建连接                               drivemanger创建connection

Connection conn=DriverManger.getConnection             

//能用接口就别用实现类(conectionsun公司的接口和mysql的实现类)

 

(“jdbc   mysql//localhost:3306/day06’’, ’’root”,”root”)

jdbcmysql   //local:         3306 /  DAY06             (数据库名)(密码)

 协议: 连接mysql:  ip地址127.0.0.1端口号  数据库

 

//3、得到执行sql语句的Statement对象        statement sql发送到DB

        Statement smt=conn.createStatement();      

//4、执行sql语句,并返回结果               statement,将table换成resultset

ResultSet = Smt.executeQuery(“select*from users”);   

//Query查询//能用接口就别用实现类

//5、处理结果

       While(rs.next()){                        //列:字段    //行:对象

rs.getObject(1);

rs.getObject(2);

rs.getObject(3);

};            

//6关闭资源

 Rs.close();stmt,close();conn.close()    //关闭三个接口

 

 

修改

DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用

原因有2个:

> 导致驱动被注册2次。    里面有静态代码块

> 强烈依赖数据库的驱动jar     mysql

解决办法:

解决方法:Class.forName("com.mysql.jdbc.Driver");

 

 

 

static Connection getConnection(String url, String user, String password)

试图建立到给定数据库 URL 的连接。

     getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");

URL:SUN公司与数据库厂商之间的一种协议。

jdbc:mysql://localhost:3306/day06

协议 子协议  IP :端口号 数据库

  jdbc:mysql:///day14(默认本机连接)

oracle: jdbc:oracle:thin:@localhost:1521:sid

 

修改2

解决方法

原来用Connection conn=DriverManger.getConnection

(“jdbc :mysql//localhost:3306/day06’’, ’’root”,”root”;

 

方法1 ******不常用

getConnection(String url, Properties info)

1    Properties info = new Properties();//要参考数据库文档   //map集合,hashtable

        //用来操作属性字段文件//

2     info.setProperty("user", "root");     //两个都是字符串   

//参考    mysql 5.1文档------26.连接器---JDBC的引用

3    info.setProperty("password","root");

4    Connection conn=DriverManger.getConnection

(“jdbc :mysql//localhost:3306/day06’’, info);

或者

1      

方法二******不常用

getConnection(String url)

1 DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=root");

模拟url传值的方式

 

}

修改3

不用

While(rs.next()){

rs.getObject(1);rs.getObject(2);rs.getObject(3);rs.getObject(3);rs.getObject(5);

}

   //可以用getObject(’’passworld’’);  这样的话顺序就不会颠倒了

   //可以用getObject(’’id’’);

*首先

Public  class User {

Private   各列的类型  各列名

 

生成set/get方法等一系列         //右键选择GGaS    select All 会把所有的方法打出来

}

*创建一个list<User> list =new ArrayList<User>();

**修改内容 while(rs.next()){

User u =new User(); //必须放在for循环里面,放在for循环上面会被覆盖,三行一模一样的数据

                 //会出现list装了n个对象,但是地址值一样

u.setId(rs.getId(‘id’));

``````````````````````````

List.add(u);

}

***最后用for循环输出

修改4

使用的是int executeUpdateString sql

更换后

Int i=Stms.executeUpdate(“InsertXXXXXXX ”)

If(i>0){

System.out.println(“success”)

}

删除ResultSet 语句

删除re.close

 

 

 

 

ConnectionDriverManager创建的

Statement Connection创建的

 

Connection是一个接口,接口的实现类在数据库的驱动中-----------mysqljar

作用:和数据库交互,基于Connection

Statement       接口,同样实现类在数据库的驱动中---------------

作用:操作sql语句,载着ResultSet返回相应结果

 

 

 

 

 

关于修改顺序会导致出现的问题       JVM

 

//细讲

Int x  变量名

User u 对象名   

         

          u   中间变量                 对象名 地址值1

                                        地址值2                                 

          List                          地址值3

 

 

   

                                     u

                                     u

                                     u

 

 

List<User>list=new Arraylist<User>();

User u=new users();

While(){                 循环三次的话

list.add(u)}

 

得到的是:u=地址值0011

          每次u.set???   都会覆盖前值,地址值不变

          u的地址值里的值不断变化,u的地址值不变)

List列表里有3u,地址都是0011

            (答应出来的u都相同)

 

List<User>list=new Arraylist<User>();

While(){

User u=new users();

list.add(u)}

3u,有三个地址,001101111111

Object x=new User();

Object y=new User();

System.out.println(x);

System.out.println(y);            //重写了toString方法

System.out.println(x.equals(y));    //false

因此new一次  地址值只有一个(只在堆内创建一个)  

List里面是   地址值1  地址值1  地址值1

New多次      地址值有几个(在堆内创建多个)u被赋予的地址值不断被变化

List 里面是   地址值1  地址值2  地址值3

 

 

Junit    3个方法写到一个类里面是不可以的

 

(写一个类,可以执行好多个方法)

 

********@test---需要导包  add  Junit4  *****(下载)library to build path

 

主题内容如下                    //测试方法要求不能有 返回值,不能给 参数

Import org.junit.Assert;

Import org.junit.test;

Public class Testcalc{

@TEST                               //其实也是一个类

Public void test1(){                     //选中test 右键 run as

      新建另一个class中的对象 c

      C.add(3,5);

      Assert.assertEquals(8,c.add)        //期望值是8,测试是否相符合             

}

 

 

 

 JDBC最终成型样式

//加载驱动

Class.forname(“com.heima.jdbc.Driver”);

***//DriverManager.registerDriver(new com.mysql.jdbc.Driver());

//获取连接connection

Connection conn=Driver.getconnection(“jdbc:mysql:localhost:3306/day06”,”root”,”root”);

//得到操作数据库sqlstatement

Statement stmt=Conn.createStatement()

//执行sql语句

***//String sql=”select id,name,password,email,birthday from users”;

***//Result rs=stmt.executeQuery(sql);

Result rs=stmt.executeQuery(”select id,name,password,email,birthday from users”)

List<User>list=new Arraylist<User>();

//结果返回处理数据

***//While(rs.next()){

***//System.out.println(rs.getObject(“id”));

***//System.out.println(rs.getObject(2));

***//System.out.println(rs.getObject(3));

***//System.out.println(rs.getObject(4));

***//System.out.println(rs.getObject(5));

User u=new User();

U.setId(rs.getInt(“id”));

U.setName(rs.getString(“name”));

U.setPassword(rs.getString(“password”));

List add(u);

}

 

总结:

//加载驱动,               class.forName(com.mysql.jdbc.driver());

                      //反射机制//靠类的全路径来加载//放到配置文件里

                      //数据库改变换配置文件

获取连接,                

Connection conn=Drivermanager.getConnection(“jdbc:mysql//localhost:3306/day06”,”user”,”abc”)

得到执行sql的对象Statement

preparedStatement ps =Conn.prepareStatement(“select *from WHERE name=”);

ps.setInt(1,1);

执行sql语句并返回结果    //不用放入参数了,因为参数已经预编译好了

ResultSet =Ps.executeQuery();

处理结果

取值,if(rs.next()){}

关闭资源

 

总结

一Java语言操作数据库的一种规范

4个核心对象

DriverManger    java.sql.DriverManger

Connection接口 java.sql.Connection

Statement接口  java.sql.PreparedStatement

ResultSet接口  java.sql.ResulrSet

DriverManger    java.sql.DriverManger

RegisterDriver(new com.mysql.jdbc Driver())本质是new Driver() 

//需要注册2//依赖性强

Class.forname()   new com.mysql.jdbc Driver()

getConnection(url,user,password)

Connection接口 java.sql.Connection

createStatement()

Ps=prepareStatement(“select* from users WHERE id=?”);  //没有d

Ps.SetInt(1,3)

Statement接口  java.sql.PreparedStatement(会先编译,过滤关键词,效率高)

ResultSet   executeQuery(sql)  select语句

Int         executeUpdate()   insert/update/delete

Boolean   execute         执行select,并且有结果集

ResultSet接口  java.sql.ResulrSet

处理结果

Boolean next() 游标向下移动一行

get int(int columnIndex)根据索引, 索引从1开始

get int(String columnIndex)列名查找

GetDouble() 

GetFloat( )

 

GetDouble()

 

 

 

 

登录功能 ----看图

注入问题preparedStatement

**会把sql语句预先编译

*性能高

*过滤用户输入的关键字

CRUD   create read update delete

太多重复的,抽取成工具类

DBbutils

 

Sql注入

比如用户名     密码

asdf      asdf’ or ‘1’=’1

 

相关内容:

Select语句-----------------------------------------

‘固定值’      我想用一个量可以随时改变

‘ ’’+password+’’ ’

 

 

preparedStatement:预编译对象, 是Statement对象的子类。

特点:

性能要高

会把sql语句先编译

sql语句中的参数会发生变化,过滤掉用户输入的关键字

 

**数据库里面所有的数据是从1开始的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值