MySQL&JDBC

1.数据库

    概念:

        就是存储数据的仓库,本质上就是一个系统文件.

    作用:

        存储数据

    结构:

        DBMS(数据库管理系统)

            |------数据库

            |------|------表

            |------|------|------表数据

            

        DBMS:数据库安装文件

        

    常见数据库:

        MYSQL数据库 开源的

        ORACLE数据库 大型收费的

        DB2 大型收费的,银行系统常用

        

    停启服务:(停启服务时,CMD需要使用管理员身份运行)

        启动:

            net start mysql

        停止:

            net stop mysql

    登录:

        在CMD中使用命令:mysql -u用户名 -p密码

    

    问题:数据存储在数据库中,如何去访问呢?

    SQL:机构化查询语句

    SQL分类:

        DDL数据定义语言

            用来定义数据库对象: 数据库database ,表table ,列column

            create,alter,drop

        DML数据操作语言

            对数据库中表记录进行更新

                add,update,delete

        DQL数据查询语言

            查询数据库中中记录

                query

        DCL数据控制语言

            定义数据库访问权限和安全级别 grant

2.DDL数据定义语言data definition language

    

    数据库操作:

        创建:

            格式1:

                create database 数据库名称; ★

            格式2:

                create database 数据库名称 set character set "GBK";

        查看

            show databases; 查看所有数据库

            use 数据库名;    使用数据库

            select database(); 查看当前正在使用的数据库

            show create database 数据库名; 查看数据库结构(创建语句)

        修改:

            alter database 数据库名 character set gbk;

        删除:

            drop database 数据库名;

 

    表结构操作: ★★★

        创建

            create table 表名(

                字段名 字段类型[长度] [约束条件],

                字段名 字段类型[长度] [约束条件]

            );

            

            约束:

                1.主键约束:primary key 要求被修饰的字段非空且唯一

                2.非空约束:not null        要求被修饰的字段非空

                3.唯一约束:unique         要求被修饰的字段唯一

            数据类型:

                JAVA MYSQL

                -----------------

                INT                  INT

                FLOAT            FLOAT

                DOUBLE     DOUBLE DOUBLE(5,2) 表示一共5位,3位整数2位小数

                CHAR/STRING        CHAR/VARCHAR

                            

                DATE            DATE/TIME/DATETIME/TIMESTAMP

                                DATE:只存年月日,默认值为null

                                TIME:只存时分秒,默认值为null

                                DATETIME:存年月日 时分秒,默认值为null

                                TIMESTAMP:存年月日 时分秒,默认值为当前系统时间

        面试题:

                CHAR/VARCHAR区别?

                    CHAR:

                                    固定长度的字符串,可以不指定长度,默认1

                                    如果存储数据长度达不到指定长度,右补空格.

                                    检索效率极高,占用空间大

                                    常用:一些固定的值:性别/学历/等级

                    VARCHAR:

                                    不固定长度的字符串,必须指定长度.

                                    如果存储数据长度打不到指定长度,不进行补全

                                    占用空间较小

                                    常用:不固定的值:姓名/地址

 

 

                

        查看

            show tables; 查看所有表

            show create table 表名;    查看表创建语句

            desc 表名;    查看表结构

            

        修改

            alter table 表名 add 字段名 类型[长度] [约束]; --添加字段

                例如:alter table category add pp varchar(32) ;

            alter table 表名 modyfy 字段名 新类型[长度] [新约束]; --修改字段类型/约束

                例如:alter table category modify pp int(11) ;

            alter table 表名 change 字段名 新字段名 ; --修改列名

                例如:alter table category change pp pigu int(11);    

            alter table 表名 drop ; --删除列

                例如:alter table category drop pigu;

            alter table 表名 rename to 新表名; --修改表名

                例如:alter table rename category to cate;

                

        删除

            drop table 表名;

3.DML数据操作语言Data Manipulation Language)★★★

    

    表数据操作

        添加数据 insert

            格式1:

                insert into 表名 values(值1,值2,..) --向表中插入所有列.每个字段必须都插入值

                insert into 表名 (字段1,字段2,..)values(值1,值2,..) --向表中指定列插入数据 ★★★

                注意:

                    1.列名数和values后面的值的个数要相同

                    2.列名顺序和插入值的顺序要一致

                    3.列的类型要和插入值的类型一致

                    4.插入值的时候,不能超过最大长度

                    5.如果有字符串或者日期需要加上引号''

        修改数据

            格式:

                update 表名 SET 字段名="值", 字段名="值",... [where 条件];

                注意:

                    1.列的类型要和插入值的类型一致

                    2.修改值的时候,不能超过最大长度

                    3.如果有字符串或者日期需要加上引号''

            

        删除数据

            格式:delete from 表名 [where 条件]

        

4.CMD中文乱码(了解):

            解决方案:

                1.修改数据库配置文件,将数据库编码设置为GBK (不推荐使用)

                2.set names gbk; 设置当前窗口编码【当前窗口有效】.

                show variables like '%char%';查看系统参数.

                处理中文乱码:保证系统窗口编码和connection编码一致即可.

 

5.DQL数据查询语言:    ★★★

 

    查询数据

        简单查询

            select * from 表名;

 

        条件查询

            select * from 表名 where 条件;

        排序

            select * from 表名 order by 字段名 asc|desc;

        聚合

            count() 记录数

            sum() 求和

            avg() 平均数

            max() 最大值

            min()最小值

            注意:聚合函数统计时不计算null值

        

        分组

            select * from 表名 group by 字段名 [having 条件];

            

        SQL语句查询总结

            SELECT DISTINCT * | 字段

            FROM 表名

            WHERE 查询条件

            GROUP BY 分组字段(列名)

            HAVING 分组条件

            ORDER BY 排序字段 ASC|DESC

 

6.JDBC

    概念:

        java数据库连接

    开发步骤:

        1.注册驱动

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

        2.获得连接

            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "root");

        3.获得语句执行者

            Statement st = conn.createStatement();

        4.执行SQL语句

            String sql = "select * from product";

            ResultSet rs = st.executeQuery(sql);

        5.处理结果集

            while (rs.next()) {}

        6.释放资源(后得到的先关闭)

            rs.close();

            st.close();

            conn.close()

        

    JDBC的API

        API详解:注册驱动:

            方式1:

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

            方式2:

                DriverManager.registerDriver(com.mysql.jdbc.Driver);(了解)

                缺点:1.硬编码,扩展性低

                     2.会注册两次驱动

        

        API详解:获得连接

            格式:Connection conn = DriverManager.getConnection("url", "name", "password");

            参数url: jdbc:数据库名称://数据库地址:端口/数据库名称

                例如:jdbc:mysql://127.0.0.1:3306/demo

            参数name:数据库用户名

            参数password:数据库密码

 

        API详解:获得语句执行者

            1.Statement st = conn.createStatement(); (了解)

            2.PrepareStatement pst = conn.prepareStatement(sql) ★★★

            Statement和PrepareStatement区别:

                a.PrepareStatement的执行效果要比Statement高

                b.PrepareStatement对SQL语句进行预处理,防止SQL脚本注入

                c.编写代码更加简单

 

        API详解:预处理对象PrepareStatement

            注意事项:

                1.SQL语句中,需要的所有参数使用,分隔

                    String sql = "select * from product where price > ?";

                2.设置实际参数(给对应?赋值)

                    a.?设置从1开始

                    b.?赋值的顺序和参数类型要和SQL语句字段对应

                    st.setDouble(1, 800); 表示给第一个问号赋值

 

        API详解:结果集

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

            rs.getXxx(int); 表示获得对应第几列的数据

            rs.getXxx("字段名");表示获得对应字段的数据

            注意:

                rs.getXxx(..) Xxx的类型要和括号中()中对应字段类型一致

                例如:

                    rs.getDouble(price) 获取价格

                    rs.getString(pname) 获取商品名称

 

    代码:

     

   package cn.itcast.b_jdbc;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

 

import com.mysql.jdbc.Driver;

 

public class DemoJDBCApi4 {

 

/*

*     准备工作:

*         导入mysql的驱动包

* 1.注册驱动

    2.获取连接

    3.获取语句执行者

    4.执行语句

    5.处理结果集

    6.释放资源

*/

    

    public static void main(String[] args) {

        /*

         * 1.注册驱动

         *         方式1:使用反射 ★★★

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

         *         方式2:

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

         *             缺点:

         *                 1.硬编码,不便于扩展

         *                 2.注册两次

         */

        try {

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

            

        /*

         * 2.获取连接

         *     DriverManager.getConnection("URL", "name", "password");

         *     参数url:

         *         jdbc:数据库名称://ip地址:端口号/数据库名称

         *

         *

         */

            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ee245_day08", "root", "root");

            //System.out.println(connection);

        /*

         * 3.获取语句执行者

         *         Statement(了解)

         *         PreparedStatement(掌握)

         *     Statement和PreparedStatement区别(PreparedStatement优点):

         *     优点:

         *         1.对SQL语句进行预处理,放置SQL脚本注入

         *         2.PreparedStatement执行效率高

         *         3.编写代码更加方便

         *

         * SQL字符串中使用?替换参数

         * PreparedStatement.SetXxx Xxx类型要和数据库字段类型要匹配

         * 注意:

         *     st.setString(1,"联想"); 表示给第一个?赋值

         * .

         *         

         */

            String sql = "select * from product where pname = ? ";

            PreparedStatement st = connection.prepareStatement(sql);

            st.setString(1,"联想");

        //4.执行语句

            ResultSet rs = st.executeQuery();

        /*

         * 5.处理结果集 ResultSet

         *

         * 取值:

         *         rs.getXxx("字段"); Xxx类型要和数据库字段类型要匹配

         *         rs.getXxx(int); Xxx类型要和数据库字段类型要匹配

         *         int 对应数据库中第几个字段(列)

         *

         *     

         */

            while(rs.next()){

                int pid = rs.getInt(1);

                double pname = rs.getDouble(3);

                System.out.println(pid+"--"+pname);

            }

        //6.释放资源 后开的先关闭

            rs.close();

            st.close();

            connection.close();

            

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

 

        

    

=====================================================================

面试题:

    一.删除表数据时,使用delete from 表名 和 truncate 表名.有什么区别?

        1.删除方式:

            delete 一条一条删除,不情况 auto_increment记录数

            truncate 直接删除表,将表重建.auto_increment记录数将置为0.重新开始

        2.事物方面:

            delete删除的数据,如果在一个事物中可以找回.

            truncate 删除的数据找不回来.

        

    二.where和having的区别

        where是查询条件

        having是分组条件,必须出现在group by 的后面

    

    三.Statement和PrepareStatement区别:

        a.PrepareStatement的执行效果要比Statement高

        b.PrepareStatement对SQL语句进行预处理,防止SQL脚本注入

        c.编写代码更加简单

      

      

      

    

posted @ 2017-01-26 18:02  小彭快跑  阅读(189)  评论(1编辑  收藏  举报