MySql
一、关系型数据库
mysql 开源(open source)Microsoft sqlserver
Oracle oracle IBM db2
二、安装
如果没有装过mysql从第五步开始
第一步:先检查电脑中是否有MySQL
使用services.msc 指令打开服务项,记得在运行窗口(Window标徽键+ R)中执行
第二步:停止MySQL服务
从上图可以看到MySQL的服务正在执行,我们想要卸载MySQL服务,需要先停止服务。停止服务有两种方式 右键服务名,快捷菜单停止服务
以管理员身份打开cmd(命令行)
第三步:卸载MySQL服务
理论上能够看到成功标识时,就标识卸载成功了,不放心可以回到服务列表中再次查找MySQL
Tips:一台机器上,装多个MySQL不可以吗?可以只要端口号和实例名不一致就OK
第四步:清除本地文件
把Data文件夹删除就可以清除之前的数据,如果不放心可以把整个MySQL文件给删除了。
第五步:解压缩MySQL到磁盘目录
第六步:提供配置文件
在MySQL文件夹的根路径下,创建文件my.ini,用于作为MySQL的配置文件
编辑该文件并提供如下内容
需要修改的地方有三点 端口号:port
要保证[mysqld]和[client]中的端口一致!!
MySQL的安装路径:basedir
MySQL数据库文件的存储路径:datadir
Tips:切记:根据自己的实际路径进行修改,还要保证路径的末尾不要有空格!
第七步:在bin目录下打开CMD窗口
一定要在MySQL的bin目录下打开CMD窗口,如果是Window要用管理员打开CMD然后切换路径到bin目录
第八步:使用指令完成数据库初始化操作
初始化数据库在指定的目录下生成Data文件夹。初始化的指令是mysqld --initialize --console . –console的作用是把初始化的信息显示在控制台(命令行终端),因为初始化会给root@localhost 用户生成临时密 码,我们需要使用这个密码进行登录MySQL。
如果电脑缺少DLL文件,在这里会报错的,有弹框提示缺少XXX.dll文件。安装运行时库就OK了!安装完成后重新执行指令就OK了!
第九步:安装MySQL服务
安装MySQL服务使用指令:mysqld --install 服务名。如果电脑中已经有安装过MySQL切记,服务名不可以重复。!
Tips: mysqld空格--install空格实例名。记得有空格!!!
第十步:启动MySQL服务
启动使用指令:net start 数据库实例名。所谓的数据库实例名,就是服务名,上面install步骤中,intall后面所根的名称。
如果启动失败,有2个办法可以解决 手动启动
重装操作系统
(M5kqaTOUT#r
第十一步:登录MySQL
第十二步:修改密码重新登录
修改用户登录密码使用如下指令
2、数据库的操作软件
3、使用navicat链接mysql
设置远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; FLUSH PRIVILEGES;
打开链接界面
配置数据链接
操作数据库界面
三、创建数据库表(DDL)
1、库的操作
2、表的操作
四、数据的操作(DML)
1、新增数据
2、修改数据
3、删除数据
4、查询数据
列的操作
where条件
模糊查询like
关键字is
排序order by
limit分段查询
练习
INSERT 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,
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-1至1981-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
聚合函数
count() sum()
avg()
max()
min()
分组查询
select from where group by having order by limit
五、复杂查询
1、嵌套子查询
有多个查询语句进行嵌套。
内层语句执行的结果作为外层查询的条件(如果结果是一个值可以用=,否则用in)
2、连接查询
a、等值连接
b、内连接
c、外连接
六、数据库的范式
1、第一范式
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项。
2、第二范式
即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
3、第三范式
满足第三范式(3NF)[2]必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
七、约束
1、主键约束
2、唯一性约束
3、检查约束
确保是正确的
4、默认值约束
5、外键约束
练习代码
八、JDBC
1、jdbc步骤
先将jar文件拷贝到项目中,并添加到构建路劲中
2、jdbc查询操作
3、改写DAO
conn.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 {
try {
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
4、Jdbc工具类
JdbcUtils.java
DAO实现类中的使用
5、数据库连接的软编码
方便用户进行数据库连接的修改(因为class文件不能修改)
db.properties
JdbcUtils.java
6、将Statement换成PreparedStatement
放置sql注入
e.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;
}
@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、整合增删改方法
import 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
8、整合查询方法
进阶版
/**
*
- @param sql
- @param objs
- @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;
}
}
九、数据库设计
1、ER图
实体关系图
矩形=>实体 椭圆形=>属性
菱形=>关系(1对1,1对多,多对多)
2、数据字典
分层开发时,前后台对照。
3、物理模型
快速创建表及生成sql脚本
4、根据需求编写sql语句进行印证
一、逆向生成实体类
1、why
实体类重复代码太多
2、思路
自动将表中的字段生成实体类
3、步骤
a、先通过ResultSetMetaData获得查询语句返回的结果集信息(包含有多少列,列名,类型)b、通过字符串对实体类的结构进行拼接
包的声明 类的声明属性的声明
setter和getter的声明构造方法
c、使用IO流将拼接好的字符串写入对应的文件中
二、事务
1、why
在一个业务中,会执行多条sql语句,这些sql语句要么都执行,要么都不执行
2、步骤
a、设置Connection对象自动提交事务为false
b、在执行完所有代码后进行手动提交
c、如果执行过程中出现异常,则手动回滚
3、在项目中使用事务
a、修改JdbcUtils类
设置Connection不自动提交
确保每次调用getConn方法时返回的是同一个Connection对象
关闭数据库连接时,需要将Connection赋为空
b、修改JdbcOperation类
因为完成一个业务需要调用多个DAO的多个方法,获得的Connection要一致
将finally代码块去掉,不是执行每个dao方法都将Connection关闭,而是执行完一个业务再将Connection关闭
public class JdbcOperation<T> { private Connection conn; private PreparedStatement stat; private ResultSet rs;
/**
- 执行增删改功能
- 所有模块都可以使用
- @param sql
- @param objs
- @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(); - }
return false; - @paramsql
- @param objs
- @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);
c、模仿新增员工业务调用多个DAO的方法