MySql


数据库和JDBC_bc


一、关系型数据库

mysql 开源(open sourceMicrosoft sqlserver

Oracle oracle IBM db2


二、安装

如果没有装过mysql从第五步开始

第一步:先检查电脑中是否有MySQL

数据库和JDBC_MySQL_02

使用services.msc 指令打开服务项,记得在运行窗口(Window标徽键+ R中执行


数据库和JDBC_MySQL_03


数据库和JDBC_sql_04


第二步:停止MySQL服务


数据库和JDBC_sql_05

从上图可以看到MySQL的服务正在执行,我们想要卸载MySQL服务,需要先停止服务。停止服务有两种方式 数据库和JDBC_MySQL_06 右键服务名,快捷菜单停止服务


以管理员身份打开cmd(命令行


第三步:卸载MySQL服务


数据库和JDBC_bc_07


理论上能够看到成功标识时,就标识卸载成功了,不放心可以回到服务列表中再次查找MySQL


数据库和JDBC_bc_08


Tips:一台机器上,装多个MySQL不可以吗?可以只要端口号和实例名不一致就OK

第四步:清除本地文件


数据库和JDBC_MySQL_09


Data文件夹删除就可以清除之前的数据,如果不放心可以把整个MySQL文件给删除了。


第五步:解压缩MySQL到磁盘目录


数据库和JDBC_sql_10



数据库和JDBC_MySQL_11


第六步:提供配置文件

MySQL文件夹的根路径下,创建文件my.ini,用于作为MySQL的配置文件


数据库和JDBC_MySQL_12


编辑该文件并提供如下内容


数据库和JDBC_MySQL_13


数据库和JDBC_MySQL_14


需要修改的地方有三点数据库和JDBC_MySQL_15 端口号:port

数据库和JDBC_MySQL_16 要保证[mysqld][client]中的端口一致!!

数据库和JDBC_MySQL_17 MySQL的安装路径:basedir

数据库和JDBC_bc_18 MySQL数据库文件的存储路径:datadir

Tips:切记:根据自己的实际路径进行修改,还要保证路径的末尾不要有空格!

第七步:在bin目录下打开CMD窗口

一定要在MySQLbin目录下打开CMD窗口,如果是Window要用管理员打开CMD然后切换路径到bin目录


数据库和JDBC_sql_19



数据库和JDBC_bc_20


第八步:使用指令完成数据库初始化操作

数据库和JDBC_sql_21

数据库和JDBC_MySQL_22

初始化数据库在指定的目录下生成Data文件夹。初始化的指令是mysqld --initialize --console . –console的作用是把初始化的信息显示在控制台(命令行终端),因为初始化会给root@localhost 用户生成临时密 码,我们需要使用这个密码进行登录MySQL


数据库和JDBC_bc_23


数据库和JDBC_bc_24


如果电脑缺少DLL文件,在这里会报错的,有弹框提示缺少XXX.dll文件。安装运行时库就OK了!安装完成后重新执行指令就OK了!

第九步:安装MySQL服务

数据库和JDBC_bc_25

安装MySQL服务使用指令:mysqld --install 服务名。如果电脑中已经有安装过MySQL切记,服务名不可以重复。!


数据库和JDBC_MySQL_26


Tips: mysqld空格--install空格实例名。记得有空格!!!

数据库和JDBC_bc_27

第十步:启动MySQL服务

数据库和JDBC_sql_28

启动使用指令:net start 数据库实例名。所谓的数据库实例名,就是服务名,上面install步骤中,intall后面所根的名称。


数据库和JDBC_bc_29


如果启动失败,有2个办法可以解决数据库和JDBC_MySQL_30 手动启动

数据库和JDBC_bc_31 重装操作系统

(M5kqaTOUT#r

第十一步:登录MySQL


数据库和JDBC_bc_32


第十二步:修改密码重新登录

修改用户登录密码使用如下指令


数据库和JDBC_sql_33


2、数据库的操作软件

3、使用navicat链接mysql

数据库和JDBC_MySQL_34设置远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; FLUSH PRIVILEGES;

打开链接界面


数据库和JDBC_sql_35


配置数据链接


数据库和JDBC_sql_36


操作数据库界面


数据库和JDBC_MySQL_37


三、创建数据库表DDL

1、库的操作


数据库和JDBC_sql_38



2、表的操作


数据库和JDBC_bc_39



四、数据的操作DML

1、新增数据


数据库和JDBC_bc_40


2、修改数据


数据库和JDBC_MySQL_41


3、删除数据


数据库和JDBC_MySQL_42


4、查询数据

列的操作


数据库和JDBC_bc_43


where条件


数据库和JDBC_bc_44


数据库和JDBC_MySQL_45


模糊查询like


数据库和JDBC_MySQL_46


关键字is


数据库和JDBC_sql_47


排序order by


数据库和JDBC_sql_48


limit分段查询


数据库和JDBC_MySQL_49


练习


数据库和JDBC_MySQL_50


数据库和JDBC_bc_51

数据库和JDBC_bc_52数据库和JDBC_MySQL_53INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00,

NULL, 20);

INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00,

数据库和JDBC_bc_54

1400.00, 30); INSERT

NULL, 30);

INSERT NULL, 10);

INSERT NULL, 20);

INSERT NULL, 10);

INSERT 0.00, 30);

INSERT NULL, 20);

INSERT

30);

INSERT

NULL, 20);

INSERT NULL, 10);

INSERT 500.00, 20);




查询练习

1、所有员工的信息 select * from emp;

2、查询所有员工的姓名和工龄。

select ename,year(now())-year(hiredate) '工龄'

from emp;

3、薪资大于1000并且小于2000的员工的信息 select *

from emp

where sal>1000 and sal<2000;

4、查询职位为SALESMAN,雇佣日期在1981-1-11981-12-1的员工信息 select *

from emp

where job='SALESMAN' and hiredate BETWEEN '1981-1-1' AND '1981-12-1'; 5、查询出员工姓名以A开头的员工的信息

select * from emp

where ename like 'A%';

6、查询出第二个字母是L的员工的信息 select *

from emp

where ename like '_L%'; 7、查询没有奖金的员工 select *

from emp

where comm is null;

8、按照工资升序奖金降序排序 select *

from emp

order by sal,comm desc; 9、查询前10行数据。

select * from emp


数据库和JDBC_bc_55


聚合函数

count() sum()

avg()


max()


min()


数据库和JDBC_bc_56


分组查询


数据库和JDBC_bc_57


数据库和JDBC_bc_58


数据库和JDBC_bc_59select from where group by having order by limit


五、复杂查询

1、嵌套子查询

有多个查询语句进行嵌套。

内层语句执行的结果作为外层查询的条件(如果结果是一个值可以用=,否则用in


数据库和JDBC_sql_60


数据库和JDBC_bc_61



2、连接查询

a、等值连接


数据库和JDBC_sql_62


b、内连接


数据库和JDBC_sql_63


c、外连接


数据库和JDBC_bc_64


数据库和JDBC_MySQL_65



六、数据库的范式

1、第一范式

所谓第一范式(1NF)是指数据库的每一列都是不可分割的基本数据项。

2、第二范式

即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF要求数据库表中的每个实例或行必须可以被唯一地区分。

3、第三范式

满足第三范式(3NF[2]必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。


七、约束

1、主键约束


数据库和JDBC_bc_66


数据库和JDBC_sql_67



2、唯一性约束


数据库和JDBC_bc_68



3、检查约束

确保是正确的


数据库和JDBC_MySQL_69



4、默认值约束


数据库和JDBC_MySQL_70


5、外键约束


数据库和JDBC_sql_71



数据库和JDBC_sql_72

练习代码


数据库和JDBC_MySQL_73


数据库和JDBC_bc_74



八、JDBC

1jdbc步骤

先将jar文件拷贝到项目中,并添加到构建路劲中


数据库和JDBC_bc_75


数据库和JDBC_sql_76


2jdbc查询操作


数据库和JDBC_bc_77


数据库和JDBC_MySQL_78


数据库和JDBC_MySQL_79

3、改写DAO


数据库和JDBC_bc_80


数据库和JDBC_MySQL_81

数据库和JDBC_sql_82数据库和JDBC_sql_83conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

return false;

}


@Override

public boolean update(Emp obj) {

//13 jack 1988-08-08 10000.0

Emp emp = this.findOne(obj.getId()); if(obj.getName()!=null) {

emp.setName(obj.getName());

}

if(obj.getBirth()!=null) { emp.setBirth(obj.getBirth());

}

if(obj.getSalary()!=null) { emp.setSalary(obj.getSalary());

}

String sql = "UPDATE emp set name='"+emp.getName()+"',birth='"+Attribute.DATE_FORMAT.format(emp.getBirth())+"',salar y="+emp.getSalary()+" where id="+emp.getId();

try {

conn = DriverManager.getConnection(url, user, password); stat = conn.createStatement();

int row = stat.executeUpdate(sql); if(row>0) {

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally { try {

stat.close();

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

return false;

}


@Override

public boolean delete(Integer id) {

String sql = "delete from emp where id="+id+""; try {

conn = DriverManager.getConnection(url, user, password); stat = conn.createStatement();

int row = stat.executeUpdate(sql); if(row>0) {

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {


数据库和JDBC_bc_84

数据库和JDBC_sql_85数据库和JDBC_bc_86try {

stat.close();

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

return false;

}


@Override

public Emp findOne(Integer id) {

String sql = "select * from emp where id="+id; Emp emp = null;

try {

conn = DriverManager.getConnection(url, user, password); stat = conn.createStatement();

rs = stat.executeQuery(sql); if(rs.next()) {

emp = new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setBirth(rs.getDate(3)); emp.setSalary(rs.getDouble(4));

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally { try {

rs.close();

stat.close();

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

}


}

return emp;

}


@Override

public List<Emp> findAll() {

String sql = "select * from emp"; List<Emp> list = new ArrayList<Emp>(); try {

conn = DriverManager.getConnection(url, user, password); stat = conn.createStatement();

rs = stat.executeQuery(sql); while(rs.next()) {

Emp emp = new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setBirth(rs.getDate(3)); emp.setSalary(rs.getDouble(4)); list.add(emp);

}

} catch (SQLException e) {

// TODO Auto-generated catch block


数据库和JDBC_MySQL_87


4Jdbc工具类

JdbcUtils.java


数据库和JDBC_sql_88


数据库和JDBC_MySQL_89


DAO实现类中的使用


数据库和JDBC_MySQL_90


数据库和JDBC_bc_91


5、数据库连接的软编码

方便用户进行数据库连接的修改(因为class文件不能修改)


数据库和JDBC_MySQL_92


db.properties


数据库和JDBC_sql_93



JdbcUtils.java


数据库和JDBC_bc_94


数据库和JDBC_bc_95



6、将Statement换成PreparedStatement

放置sql注入


数据库和JDBC_bc_96


数据库和JDBC_sql_97



数据库和JDBC_MySQL_98


数据库和JDBC_MySQL_99

数据库和JDBC_MySQL_100数据库和JDBC_MySQL_101e.printStackTrace();

} finally {

JdbcUtils.closeConn(null, stat, conn);

}

return false;

}


@Override

public boolean update(Emp obj) {

//13 jack 1988-08-08 10000.0

Emp emp = this.findOne(obj.getId()); if(obj.getName()!=null) {

emp.setName(obj.getName());

}

if(obj.getBirth()!=null) { emp.setBirth(obj.getBirth());

}

if(obj.getSalary()!=null) { emp.setSalary(obj.getSalary());

}

String sql = "UPDATE emp set name=?,birth=?,salary=? where id=?"; try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql); stat.setObject(1, emp.getName()); stat.setObject(2, emp.getBirth()); stat.setObject(3, emp.getSalary()); stat.setObject(4, emp.getId());

int row = stat.executeUpdate(); if(row>0) {

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(null, stat, conn);

}

return false;

}


@Override

public boolean delete(Integer id) {

String sql = "delete from emp where id=?"; try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql); stat.setObject(1, id);

int row = stat.executeUpdate(); if(row>0) {

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(null, stat, conn);

}

return false;

}


数据库和JDBC_sql_102

@Override

public Emp findOne(Integer id) {

String sql = "select * from emp where id=?"; Emp emp = null;

try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql); stat.setObject(1, id);

rs = stat.executeQuery(); if(rs.next()) {

emp = new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setBirth(rs.getDate(3)); emp.setSalary(rs.getDouble(4));

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(rs, stat, conn);


}

return emp;

}


@Override

public List<Emp> findAll() {

String sql = "select * from emp"; List<Emp> list = new ArrayList<Emp>(); try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql); rs = stat.executeQuery(); while(rs.next()) {

Emp emp = new Emp(); emp.setId(rs.getInt(1)); emp.setName(rs.getString(2)); emp.setBirth(rs.getDate(3)); emp.setSalary(rs.getDouble(4)); list.add(emp);

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(rs, stat, conn);


}

return list;

}


}



7、整合增删改方法


数据库和JDBC_bc_103


数据库和JDBC_sql_104

数据库和JDBC_sql_105数据库和JDBC_bc_106import java.sql.PreparedStatement; import java.sql.ResultSet;

import java.sql.SQLException; import java.util.ArrayList; import java.util.List;


import com.woniuxy.entity.Emp; import com.woniuxy.util.JdbcUtils;


public class EmpDAOJdbcImpl implements EmpDAO {


private Connection conn; private PreparedStatement stat; private ResultSet rs;


public boolean updateSql(String sql,Object[] objs) { try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql);

for (int i = 0; i < objs.length; i++) { stat.setObject(i+1, objs[i]);

}

int row = stat.executeUpdate(); if(row>0) {

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(null, stat, conn);

}

return false;

}


@Override

public boolean save(Emp emp) {

String sql = "insert into emp values(null,?,?,?)";

Object[] objs = {emp.getName(),emp.getBirth(),emp.getSalary()}; return updateSql(sql,objs);

}


@Override

public boolean update(Emp obj) {

//13 jack 1988-08-08 10000.0

Emp emp = this.findOne(obj.getId()); if(obj.getName()!=null) {

emp.setName(obj.getName());

}

if(obj.getBirth()!=null) { emp.setBirth(obj.getBirth());

}

if(obj.getSalary()!=null) { emp.setSalary(obj.getSalary());

}

String sql = "UPDATE emp set name=?,birth=?,salary=? where id=?";

Object[] objs = {emp.getName(),emp.getBirth(),emp.getSalary(),emp.getId()}; return updateSql(sql, objs);

}


@Override


数据库和JDBC_MySQL_107


数据库和JDBC_sql_108

8、整合查询方法


数据库和JDBC_bc_109


数据库和JDBC_bc_110


进阶版


数据库和JDBC_sql_111


数据库和JDBC_MySQL_112

/**

*

  1. @param sql
  2. @param objs
  3. @return

*/

public List<T> select(String sql,Object[] objs,Class c){ List<T> list = new ArrayList<T>();

try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql);

for (int i = 0; i < objs.length; i++) { stat.setObject(i+1, objs[i]);

}

rs = stat.executeQuery();

Field[] fields = c.getDeclaredFields(); while(rs.next()) {

Object object = c.newInstance();

// Emp emp = new Emp();

for (int i = 0; i < fields.length; i++) { Field f = fields[i];

if("serialVersionUID".equals(f.getName())) { continue;

}

f.setAccessible(true);

f.set(object, rs.getObject(f.getName()));

}

// emp.setId(rs.getInt(1));

// emp.setName(rs.getString(2));

// emp.setBirth(rs.getDate(3));

// emp.setSalary(rs.getDouble(4));

// list.add(emp); list.add((T) object);

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block e.printStackTrace();

} finally {

JdbcUtils.closeConn(rs, stat, conn);


}


return list;

}

}




九、数据库设计

1ER

实体关系图


矩形=>实体 椭圆形=>属性

菱形=>关系(111对多,多对多


数据库和JDBC_MySQL_113



2、数据字典

分层开发时,前后台对照。


数据库和JDBC_bc_114


3、物理模型

快速创建表及生成sql脚本


数据库和JDBC_sql_115


4、根据需求编写sql语句进行印证


一、逆向生成实体类

数据库和JDBC_bc_116


1、why

实体类重复代码太多

2、思路

自动将表中的字段生成实体类

3、步骤

a、先通过ResultSetMetaData获得查询语句返回的结果集信息(包含有多少列,列名,类型)b、通过字符串对实体类的结构进行拼接

包的声明 类的声明属性的声明

settergetter的声明构造方法

c、使用IO流将拼接好的字符串写入对应的文件中


二、事务

1why

在一个业务中,会执行多条sql语句,这些sql语句要么都执行,要么都不执行

2、步骤


数据库和JDBC_MySQL_117


数据库和JDBC_MySQL_118



a、设置Connection对象自动提交事务为false


数据库和JDBC_sql_119


b、在执行完所有代码后进行手动提交


数据库和JDBC_sql_120


c、如果执行过程中出现异常,则手动回滚


数据库和JDBC_bc_121



3、在项目中使用事务

a、修改JdbcUtils

设置Connection不自动提交


数据库和JDBC_bc_122


确保每次调用getConn方法时返回的是同一个Connection对象


数据库和JDBC_bc_123


关闭数据库连接时,需要将Connection赋为空


数据库和JDBC_sql_124


数据库和JDBC_MySQL_125



数据库和JDBC_sql_126


数据库和JDBC_bc_127


b、修改JdbcOperation

因为完成一个业务需要调用多个DAO的多个方法,获得的Connection要一致

finally代码块去掉,不是执行每个dao方法都将Connection关闭,而是执行完一个业务再将Connection关闭


数据库和JDBC_MySQL_128



public class JdbcOperation<T> { private Connection conn; private PreparedStatement stat; private ResultSet rs;

/**

  1. 执行增删改功能
  2. 所有模块都可以使用
  3. @param sql
  4. @param objs
  5. @return*/
    public boolean updateSql(String sql,Object[] objs) { try {
    conn = JdbcUtils.getCon();
    stat = conn.prepareStatement(sql);
    for (int i = 0; i < objs.length; i++) { stat.setObject(i+1, objs[i]);
    }
    int row = stat.executeUpdate(); if(row>0) {
    return true;
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block e.printStackTrace();
  6. }
    return false;
  7. @paramsql
  8. @param objs
  9. @return




}

/**


*/

public List<T> select(String sql,Object[] objs,Class c){ List<T> list = new ArrayList<T>();

try {

conn = JdbcUtils.getCon();

stat = conn.prepareStatement(sql);

for (int i = 0; i < objs.length; i++) { stat.setObject(i+1, objs[i]);

}

rs = stat.executeQuery();

Field[] fields = c.getDeclaredFields(); while(rs.next()) {

Object object = c.newInstance();

// Emp emp = new Emp();

for (int i = 0; i < fields.length; i++) { Field f = fields[i];

if("serialVersionUID".equals(f.getName())) { continue;

}

f.setAccessible(true);

f.set(object, rs.getObject(f.getName()));

}

// emp.setId(rs.getInt(1));

// emp.setName(rs.getString(2));

// emp.setBirth(rs.getDate(3));

// emp.setSalary(rs.getDouble(4));

// list.add(emp);


数据库和JDBC_MySQL_129


c、模仿新增员工业务调用多个DAO的方法


数据库和JDBC_bc_130


数据库和JDBC_bc_131