3.  使用库

use 库名

 图片 1

4.8 完结查询操作代码

    public static Connection getConnection() throws Exception {

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

        String url = "jdbc:mysql://localhost:3306/web08";

        return DriverManager.getConnection(url, "root", "root");

    }

    @Test

    public void query() throws Exception {

        Connection con = getConnection();

        Statement stmt = con.createStatement();

        String sql = "select * from user";

        ResultSet rs = stmt.executeQuery(sql);

        while(rs.next()) {

            String username = rs.getString(1);

            String password = rs.getString(2);

            System.out.println(username + ", " + password);

        }

    }

 

PreparedStatement

4.2 条件查询

1.查询商品名称叫”左慈”的商品新闻

图片 2

2.查询价格>60元的有着商品音讯

 图片 3

3.询问商品名称含有”士”字的商品音信

 图片 4

4.查询商品id在(3,6,9)范围内的具备商品消息

 图片 5

5.询问商品名称含有”士”字并且id为6的商品音讯

 图片 6

6.查询id为2要么6的商品音讯

 图片 7

 

5 ResultSet之滚动结果集(理解)

ResultSet表示结果集,它是多少个二维的表格!ResultSet内部维护四个行光标(游标),ResultSet提供了一二种的方法来移动游标:

l  void beforeFirst():把光标放到第一行的前方,那也是光标暗中认可的地方;

l  void afterLast():把光标放到最终一行的后面;

l  boolean
first():把光标放到第一行的职位上,重回值表示调控光标是不是中标;

l  boolean last():把光标放到最后一行的职位上;

l  boolean isBeforeFirst():当前光标位置是或不是在第一行前边;

l  boolean isAfterLast():当前光标地方是否在最终一行的前面;

l  boolean isFirst():当前光标地点是还是不是在首先行上;

l  boolean isLast():当前光标地点是或不是在最后一行上;

l  boolean previous():把光标向上挪一行;

l  boolean next():把光标向下挪一行;

l  boolean relative(int
row):相对位移,当row为正数时,表示向下移动row行,为负数时表示发展移动row行;

l  boolean absolute(int row):相对位移,把光标移动到钦命的行上;

l  int getRow():重返当前光标全数行。

 

下面方法分为两类,一类用来判断游标地方的,另一类是用来移动游标的。假使结果集是不可滚动的,那么只好利用next()方法来运动游标,而beforeFirst()、afterLast()、first()、last()、previous()、relative()方法都不能够应用!!!

结果集是不是支持滚动,要从Connection类的createStatement()方法谈起。也正是说创立的Statement决定了使用Statement创设的ResultSet是还是不是扶助滚动。

Statement createStatement(int resultSetType, int resultSetConcurrency)

resultSetType的可选值:

l  ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;


ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再尾随数据库而生成;


ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再尾随数据库而生成;

 

可以看出,尽管想行使滚动的结果集,大家理应选取TYPE_SCROLL_INSENSITIVE!其实十分少有数据库驱动会辅助TYPE_SCROLL_SENSITIVE的天性!平日大家也不要求查询到的结果集再受到数据库变化的熏陶。

 

resultSetConcurrency的可选值:


CONCUR_READ_ONLY:结果集是只读的,不可能通过修改结果集而反向影响数据库;


CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新能够反向影响数据库。

 

平凡可更新结果集这一“高档特性”大家也是不需求的!

 

收获滚动结果集的代码如下:

Connection con = …

Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
CONCUR_READ_ONLY);

String sql = …//查询语句

ResultSet rs = stmt.executeQuery(sql);//这一个结果集是可滚动的

 

2 JDBC原理

开始的一段时期SUN企业的天资们想编写一套能够连接天下全数数据库的API,可是当他俩刚刚开始时就发现那是不足完成的职责,因为种种厂家的数据库服务器差别太大了。后来SUN开班与数据库厂家们钻探,最后得出的下结论是,由SUN提供一套访问数据库的正式(正是一组接口),并提供连接数据库的磋商正式,然后逐条数据库香港中华厂商联合会遵从SUN的正统提供一套访问本人公司的数据库服务器的API出现。SUN提供的规范命名叫JDBC,而一一商家提供的,遵从了JDBC标准的,可以访问本人数据库的API被称呼驱动!

图片 8

JDBC是接口,而JDBC驱动才是接口的落实,没有驱动不可能做到数据库连接!每种数据库厂家都有温馨的驱动,用来再三再四本人公司的数据库。

本来还应该有第三方公司特意为某一数据库提供驱动,那样的驱动往往不是开源无需付费的!

 

4.6 读取结果聚集的数码

ResultSet正是一张二维的表格,它在那之中有贰个“行光标”,光标暗许的职责在“第一行上方”,我们能够调用rs对象的next()方法把“行光标”向下活动一行,当第一遍调用next()方法时,“行光标”就到了第一行记录的职分,那时就足以运用ResultSet提供的getXXX(int
col)方法来获得钦命列的数目了:

rs.next();//光标移动到第一行

rs.getInt(1);//获取第一行第一列的数码

当您使用rs.getInt(1)方法时,你必须能够一定第1列的数据类型正是int类型,借使您无法一定,那么最佳使用rs.getObject(1)。在ResultSet类中提供了一多种的getXXX()方法,比较常用的法子有:

Object getObject(int col)

String getString(int col)

int getInt(int col)

double getDouble(int col)

4.3 排序

1.询问全部的商品,按价格实行排序(升序、降序)

 图片 9

图片 10

 

2.查询名称有”士”的商品音信并且依照价格降序排序

 图片 11

 

6 ResultSet之获取列数据

能够因而next()方法使ResultSet的游标向下移动,当游标移动到你须要的行时,就须求来博取该行的多寡了,ResultSet提供了一名目大多的取得列数据的艺术:

l  String getString(int columnIndex):获取钦命列的String类型数据;

l  int getInt(int columnIndex):获取钦点列的int类型数据;

l  double getDouble(int columnIndex):获取钦命列的double类型数据;

l  boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;

l  Object getObject(int columnIndex):获取钦定列的Object类型的数目。

 

上面方法中,参数columnIndex表示列的目录,列索引从1上马,而不是0,那第一点与数组区别。假让你懂妥帖前列的数据类型,那么能够利用getInt()之类的方法来获得,固然你不明了列的品类,那么您应该利用getObject()方法来获取。

ResultSet还提供了一套通过列名称来获得列数据的艺术:

l  String getString(String
columnName):获取名字为columnName的列的String数据;

l  int getInt(String columnName):获取名称叫columnName的列的int数据;

l  double getDouble(String
columnName):获取名称叫columnName的列的double数据;

l  boolean getBoolean(String
columnName):获取名叫columnName的列的boolean数据;

l  Object getObject(String
columnName):获取名称叫columnName的列的Object数据;

 

3 JDBC核心类(接口)介绍

JDBC中的宗旨类有:DriverManager、Connection、Statement,和ResultSet!

DriverManger(驱动管理器)的效应有七个:

l  注册驱动:那能够让JDBC知道要使用的是哪位驱动;


获取Connection:若是得以得到到Connection,那么声明已经与数据库连接上了。

Connection对象表示连接,与数据库的简报都是透过这些指标开始展览的:

l  Connection最为重大的一个方法就是用来收获Statement对象;


Statement是用来向数据库发送SQL语句的,那样数据库就能够施行发送过来的SQL语句

l  void executeUpdate(String
sql):推行更新操作(insert、update、delete等);

l  ResultSet executeQuery(String
sql):推行查询操作,数据库在进行查询后会把询问结果,查询结果便是ResultSet;

ResultSet对象表示查询结果集,只有在举行查询操作后才会有结果集的发生。结果集是七个二维的表格,有行有列。操作结果集要学习活动ResultSet内部的“行光标”,以及取稳妥前行上的每一列上的数量:

l  boolean next():使“行光标”移动到下一行,并赶回移动后的行是否存在;

l  XXX getXXX(int
col):获取当前行钦定列上的值,参数正是列数,列数从1起初,而不是0。

 

1.插入记录

insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)

 图片 12

insert into 表名 values(值1,值2,值3……)

 图片 13

4.4 聚合函数

1.获得全体商品的价钱的总的数量

 图片 14

2.赢得全部商品的平均价格

 图片 15

3.收获全数商品的个数

图片 16

4.翻看当前正值操作的库

 图片 17

4.7 关闭

与IO流一样,使用后的东西都亟待关闭!关闭的相继是先获得的后关闭,后获得的先关闭。

rs.close();

stmt.close();

con.close();

4.2 修改列的品类(长度、约束)

alter table 表名 modify 要修改的字段名 类型(长度) [约束]

 图片 18

4.1 导入mysql数据库的驱动jar包:

mysql-connector-java-5.1.39-bin.jar;

4.5 发送SQL查询语句

String sql = “select * from user”;

ResultSet rs = stmt.executeQuery(sql);

请留意,实践查询利用的不是executeUpdate()方法,而是executeQuery()方法。executeQuery()方法再次回到的是ResultSet,ResultSet封装了询问结果,我们称为结果集。

1 什么是JDBC

  JDBC(Java DataBase
Connectivity)就是Java数据库连接,说白了正是用Java语言来操作数据库。原本大家操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

1 什么是SQL攻击

在必要用户输入的地方,用户输入的是SQL语句的局地,最后用户输入的SQL片段与大家DAO中写的SQL语句合成二个一体化的SQL语句!比方用户在签到时输入的用户名和密码都以为SQL语句的一些!

 

JDBC对象介绍

 

4.6 修改表的字符集

alter table 表名 character set 编码

 图片 19

查看当前表的编码

 图片 20

4.6 查询总括

select  一般在的背后的内容都是要查询的字段

from  要查询到表

where

group by

having  分组后含有条件只好选择having

翻看编码。order by 它必须置于最前边

 

4.3 获取连接

收获连接须求两步,一是利用DriverManager来注册驱动,二是利用DriverManager来获取Connection对象。

 

赢得连接的也唯有一句代码:

DriverManager.getConnection(url,username,password),

其间username和password是登陆数据库的用户名和密码,如若自身没说错的话,你的mysql数据库的用户名和密码分别是:root、123。

url查对复杂一点,它是用来找到要连接数据库“网站”,就好比你要浏览器中检索百度时,也须求提供三个url。上边是mysql的url:

jdbc:mysql://localhost:3306/mydb1

JDBC规定url的格式由三片段构成,每一种部分中档使用冒号分隔。

l  第一有的是jdbc,那是原则性的;

l  第二部分是数据库名称,那么连接mysql数据库,第二有些当然是mysql了;


第三某个是由数据库商家规定的,大家必要领悟各种数据库厂家的渴求,mysql的第三局地各自由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb1)组成。

 

上边是得到连接的口舌:

Connection con =
DriverManager.getConnection(“jdbc:mysql://localhost:3306/web08”,”root”,”root”);

 

还能在url中提供参数:

jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=UTF8

useUnicode参数钦赐那一个延续数据库的历程中,使用的字节集是Unicode字节集;

characherEncoding参数钦赐穿上一而再数据库的经过中,使用的字节集编码为UTF-8编码。请小心,mysql中钦点UTF-8编码是交由的是UTF8,而不是UTF-8。要小心了!

 

4.4 获取Statement

在获得Connectoin之后,表明已经与数据库连接上了,下边是经过Connection获取Statement对象的代码:

Statement stmt = con.createStatement();

Statement是用来向数据库发送要实施的SQL语句的!

1.创建一张表

create table 表名(

    字段名 类型(长度) [约束],

    字段名 类型(长度) [约束],

    字段名 类型(长度) [约束]

);

 图片 21

4.询问操作

语法:

    select [distinct] *翻看编码。| 列名,列名 from 表名 [where条件]

DDL
创造 create  修改 alter  删除 dorp
DML
插入 insert  删除 delete 更新 update
DQL
select from where

2.1 不带条件的

update 表名 set 字段名=值, 字段名=值, 字段名=值……

 图片 22

它会将该列的保有记录都转移

 

4.1 轻巧询问

1.查询全数商品

select * from product;

 图片 23

 

  1. 查询商品名和商品价位

select pname,price from product;

 图片 24

 

3.询问全部商品音信使用表外号

select *翻看编码。 from product as  p;

 图片 25

 

4.询问商品名,使用列别称

select pname as  p from product

 图片 26

 

5.去掉重复值(遵照价钱)

select distinct(price) from product;

先企图数据:

insert into product values (null,’李士雪’,38,null);

 图片 27

翻看编码。6.将有所的商品的价钱+10张开始展览示

select pname,price+10 from product;

 图片 28

 

3 Connection

翻看编码。Connection最为首要的方式正是获得Statement:

l  Statement stmt = con.createStatement();

 

末尾在学习ResultSet方法时,还要学习一下下边包车型大巴点子:

l  Statement stmt = con.createStatement(int,int);

 

4.3 修改列的列名

alter table 表名 change 旧列名 新列名 类型(长度) [约束]

 图片 29

4 Hello JDBC

 上边开端编写制定第一个JDBC程序

介绍eclipse的相关知识

单元测量试验junit

MySQL与JDBC

4 Statement

Statement最为根本的办法是:

l  int executeUpdate(String
sql):实践更新操作,即实行insert、update、delete语句,其实这些情势也能够实行create
table、alter table,以及drop
table等话语,但大家异常少会利用JDBC来执行那个话语;

l  ResultSet executeQuery(String
sql):实践查询操作,试行查询操作会重返ResultSet,即结果集。

 

l   boolean execute()

Statement还会有一个boolean
execute()方法,这么些办法能够用来实践增、删、改、查全部SQL语句。该形式再次回到的是boolean类型,表示SQL语句是不是实施成功。

如果使用execute()方法推行的是翻新语句,那么还要调用int
getUpdateCount()来收获insert、update、delete语句所影响的行数。

倘若使用execute()方法实施的是查询语句,那么还要调用ResultSet
getResultSet()来博取select语句的询问结果。

 

3.1 带条件的

delete from 表名 where 条件

 图片 30

 

留心,删除后,uid不会复位!

 

2.  刨除三个库

drop database 库名

 图片 31

4.1 增加一列

alter table 表名 add 字段名 类型(长度) [约束]

 图片 32

4.5 修改表名

rename table 表名 to 新表名

 图片 33

4.2 注册驱动

看精晓了,注册驱动就唯有一句话:Class.forName(“com.mysql.jdbc.Driver”),上边的原委都以对那句代码的解说。现在大家的代码中,与登记驱动相关的代码唯有这一句。

DriverManager类的registerDriver()方法的参数是java.sql.Driver,但java.sql.Driver是一个接口,达成类由mysql驱动来提供,mysql驱动中的java.sql.Driver接口的兑现类为com.mysql.jdbc.Driver!那么注册驱动的代码如下:

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

上边代码即使可以挂号驱动,可是出现硬编码(代码注重mysql驱动jar包),借使现在想连接Oracle数据库,那么必必要修改代码的。并且实际这种注册驱动的方法是挂号了一遍驱动!

JDBC中规定,驱动类在被加载时,需求团结“主动”把本身注册到DriverManger中,上面大家来探望com.mysql.jdbc.Driver类的源代码:

com.mysql.jdbc.Driver.java

public class Driver extends NonRegisteringDriver implements java.sql.Driver {

    static {

        try {

            java.sql.DriverManager.registerDriver(new Driver());

        } catch (SQLException E) {

            throw new RuntimeException("Can’t register driver!");

        }

    }

……

}

 

com.mysql.jdbc.Driver类中的static块会成立本类对象,并注册到DriverManager中。那注解只要去加载com.mysql.jdbc.Driver类,那么就可以试行这几个static块,从而也就能把com.mysql.jdbc.Driver注册到DriverManager中,所以能够把登记驱动类的代码修改为加载驱动类

Class.forName(“com.mysql.jdbc.Driver”);

2 DriverManager

事实上我们现在只须求会用DriverManager的getConnection()方法就能够:

  1. Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
  2. String url = “jdbc:mysql://localhost:3306/web08”;
  3. String username = “root”;
  4. String password = “root”;
  5. Connection con = DriverManager.getConnection(url, username,
    password);

 

瞩目,上边代码也许出现的三种非常:

  1. ClassNotFoundException:这几个可怜是在第1句上出现的,出现这些特别有三个大概:

l  你未曾给出mysql的jar包;

l  你把类名称打错了,查看类名是还是不是com.mysql.jdbc.Driver。

 

  1. SQLException:那么些可怜出现在第5句,出现这一个特别正是多个参数的主题材料,往往username和password一般不是失误,所以须要认真查阅url是还是不是打错。

 

对于DriverManager.registerDriver()方法理解就可以,因为我们随后注册驱动只会Class.forName(),而不会动用这些主意。

2.查看数据库表

创办完毕后,大家得以查看数据库表

show tables;

 图片 34

查看表的布局

desc 表名

 图片 35

二、回想JDBC,完毕查询

4.5 分组操作

1.加多分类id (alter table product add cid varchar(32);)

2.开首化数据

update product set cid=’1′;

update product set cid=’2′ where  pid in (5,6,7);

1.依据cid字段分组,分组后总计商品的个数。

 图片 36

2.基于cid分组,分组计算每组商品的平均价格,并且平均价格大于贰仟0元。

 图片 37

二、对数据库表的操作

4 PreparedStatement是什么?

PreparedStatement叫预编写翻译申明!

PreparedStatement是Statement的子接口,你能够使用PreparedStatement来替换Statement。

PreparedStatement的好处:

l  防止SQL攻击;

l  提升代码的可读性,以可维护性;

l  提升成效。

2 演示SQL攻击

第一大家供给创立一张用户表,用来存款和储蓄用户的音讯。

CREATE TABLE user(

    uid CHAR(32) PRIMARY KEY,

    username   VARCHAR(30) UNIQUE KEY NOT NULL,

    PASSWORD   VARCHAR(30)

);

 

INSERT INTO user VALUES(‘U_1001’, ‘zs’, ‘zs’);

SELECT * FROM user;

到现在用户表中只有一行记录,正是zs。

上面大家写贰个login()方法!

    public void login(String username, String password) {

        Connection con = null;

        Statement stmt = null;

        ResultSet rs = null;

        try {

            con = JdbcUtils.getConnection();

            stmt = con.createStatement();

            String sql = "SELECT * FROM user WHERE " +

                    "username=’" + username +

                    "’ and password=’" + password + "’";

            rs = stmt.executeQuery(sql);

            if(rs.next()) {

                System.out.println("欢迎" + rs.getString("username"));

            } else {

                System.out.println("用户名或密码错误!");

            }

        } catch (Exception e) {

            throw new RuntimeException(e);

        } finally {

            JdbcUtils.close(con, stmt, rs);

        }      

    }

 

下边是调用那些方法的代码:

login("a’ or ‘a’=’a", "a’ or ‘a’=’a");

 

那行当前会使我们登入成功!因为是输入的用户名和密码是SQL语句片段,最后与大家的login()方法中的SQL语句组合在联合签名!大家来看看组合在联合签名的SQL语句:

SELECT * FROM tab_user WHERE username=’a’ or ‘a’=’a‘ and password=’a’ or ‘a’=’a

 

1.1 插入数据中文乱码难点化解办法

方式一:【不建议!】

一贯退换数据库安装目录里面包车型客车my.ini文件的第57行

 图片 38

方式二:

    set names gbk;

 图片 39

1.  成立三个库

create database 库名

create database 库名 character set 编码

 图片 40

 建带有编码的

图片 41

翻看编码:

 图片 42

4.9 标准化代码

所谓标准化代码正是无论是还是不是出现非凡,都要关闭ResultSet、Statement,以及Connection,尽管您还记得IO流的规范化代码,那么上边的代码你就知道哪些看头了。

 

    @Test

    public void query() {

        Connection con = null;

        Statement stmt = null;

        ResultSet rs = null;

        try {

            con = getConnection();

            stmt = con.createStatement();

            String sql = "select * from user";

            rs = stmt.executeQuery(sql);

            while(rs.next()) {

                String username = rs.getString(1);

                String password = rs.getString(2);

                System.out.println(username + ", " + password);

            }

        } catch(Exception e) {

            throw new RuntimeException(e);

        } finally {

            try {

                if(rs != null) rs.close();

                if(stmt != null) stmt.close();

                if(con != null) con.close();

            } catch(SQLException e) {}

        }

    }

 

2.修改表记录

3 防止SQL攻击

l  过滤用户输入的多寡中是还是不是含有违法字符;

l  分步校验!先选拔用户名来查询用户,如若查找到了,再相比密码;

l  使用PreparedStatement。

一、用命令行对数据库的操作

三、对数据库表记录实行操作(修改)

3.删除表记录

5 PreparedStatement的使用

l  使用Connection的prepareStatement(String
sql):即成立它时就让它与一条SQL模板绑定;

l  调用PreparedStatement的setXXX()连串措施为问号设置值


调用executeUpdate()或executeQuery()方法,但要注意,调用未有参数的主意;

 

String sql = “select * from tab_student where s_number=?”;

PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, “S_1001”);

ResultSet rs = pstmt.executeQuery();

rs.close();

pstmt.clearParameters();

pstmt.setString(1, “S_1002”);

rs = pstmt.executeQuery();

 

在使用Connection创立PreparedStatement对象时索要提交五个SQL模板,所谓SQL模板正是有“?”的SQL语句,个中“?”正是参数。

在赢得PreparedStatement对象后,调用它的setXXX()方法为“?”赋值,那样就能够获得把模版形成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery()方法得到ResultSet对象。

注意PreparedStatement对象独有的executeQuery()方法是未有参数的,而Statement的executeQuery()是需求参数(SQL语句)的。因为在开创PreparedStatement对象时早就让它与一条SQL模板绑定在同步了,所以在调用它的executeQuery()和executeUpdate()方法时就不再要求参数了。

PreparedStatement最大的平价正是在于重复使用同一模板,给予其分化的参数来重新的选用它。那才是真的升高功能的原故。

 

从而,提出大家在事后的费用中,无论如何意况,都去必要PreparedStatement,而不是选择Statement。

 

3.删减一张表

drop table 表名

 图片 43

1 JDBC中的首要类(接口)

在JDBC中常用的类有:

l  DriverManager;

l  Connection;

l  Statement;

l  ResultSet。

 

3.2.不带条件的

先妄图数据

insert into tbl_user values(null,’老王’,’666’);

 

去除操作

    delete from 表名;

 图片 44

 

 

3.3 面试题

说说delete与truncate的区别?

delete删除的时候是一条一条的删减记录,它格外职业,能够将去除的数目找回。

truncate删除,它是将整个表摧毁,然后再成立一张千篇一律的表。它删除的数据不也许找回。

 

Delete操作演示:

 图片 45

Truncate操作演示

 图片 46

 

留心:delete删除,uid不会重新恢复设置!而利用truncate操作,uid会重新载入参数

 

 

2.2 带条件的

update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件

 图片 47

 

4.修改表

4.4 删除表的列

alter table 表名 drop 列名

 图片 48

相关文章