时间:2021-07-01 10:21:17 帮助过:13人阅读
也可以根据MySQL数据库配置文件my.ini设定
创建外键
constraint 外键名 foreign key (外键列名) references 从表名称 (从表列名)
在删除外键时,要先删除从表和索引
将一组SQL语句放在同一批次执行,如果一个SQL语句出错,则该批次内的所有SQL都会被取消执行
MySQL事务处理只支持InnoDB和BDB数据表类型
作用:唯一标识一条记录,只能有一个
作用:避免某一数据列中的值重复,可以有多个
作用:快速定位特定数据,index和key都可以设置常规索引
作用:快速定位特定数据,只能用于char,varchar和text数据列类型 ,MySQL5.6前只有MyISAM支持全文索引,MySQL5.6之后,MyISAM和InnoDB均支持全文索引,全文索引通过match()函数完成
SELECT *FROM student WHERE MATCH(studentname) AGAINST(‘love‘);
MySQL数据库备份保证数据不丢失,数据转移
备份方法:
-- 导出 1. 导出一张表 -- mysqldump -uroot -p123456 school student >D:/a.sql mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql) 2. 导出多张表 -- mysqldump -uroot -p123456 school student result >D:/a.sql mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql) 3. 导出所有表 -- mysqldump -uroot -p123456 school >D:/a.sql mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql) 4. 导出一个库 -- mysqldump -uroot -p123456 -B school >D:/a.sql mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql) -- 导入 1. 在登录mysql的情况下: -- source D:/a.sql source 备份文件 2. 在不登录的情况下 mysql -u用户名 -p密码 库名 < 备份文件
数据库设计3大范式
第一范式(1st NF):确保每一列的原子性(不可再分的最小数据单元)
第二范式(2nd NF):每一个表只描述一件事,必须先满足第一范式
第三范式(3rd NF):数据表中的每一列数据都和主键直接相关,不能间接相关,必须先满足满足第二范式
开发JDBC前要导入JDBC数据库驱动
public class Jdbcdemo { public static void main(String[] args) throws Exception { String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&SSL=true&serverTimezone=UTC"; String username="root"; String password="123456"; //1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 Connection connection= DriverManager.getConnection(url,username,password); //3.创建statement Statement statement=connection.createStatement(); String sql="select * from users"; //4.执行sql ResultSet resultSet=statement.executeQuery(sql); //5.打印结果集 while(resultSet.next()){ System.out.println(resultSet.getObject("id")); System.out.println(resultSet.getObject("name")); } //6.关闭连接 resultSet.close(); statement.close(); connection.close(); } }
JDBC程序中的DriverManager用于加载驱动和创建数据库的连接,常用的两个方法
//加载驱动 DriverManager.registerDriver(new Driver());//不推荐使用,会使驱动程序注册两次,内存中会有两个Driver对象,且这样程序会依赖mysql的api //创建于数据库的连接 DriverManager.getConnnection(url,user,password);
使用Class.forName(com.mysql.jdbc.Driver)来加载驱动。这样只有一个驱动对象,且不依赖具体驱动
它用于代表数据库的连接,客户端与数据库的所有交互都是通过Connection对象完成的,常用方法有
它用于向数据库发送sql语句,常用方法有:
它代表sql语句执行的结果,其封装结果时采用类似于表格的方式,ResultSet维护了一个指向表数据行的游标,初始时,游标在第一行之前,调用next()方法是游标指向具体行。
使用get方法获取数据:
其还提供了对结果集滚动的方法:
JDBC中的statement对象用于向数据库发送SQL语句
public class Jdbcdemo { public static void main(String[] args) throws Exception { String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&SSL=true&serverTimezone=UTC"; String username="root"; String password="123456"; //加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //创建链接 Connection connection=DriverManager.getConnection(url,username,password); //创建statement Statement statement=connection.createStatement(); //插入,executeUpdate()返回一个整数,代表数据表中几行数据发生了变化 //String sql="insert into users(id,name,password,email,birthday)values(4,‘zzy‘,2020,‘1780@qq.com‘,‘2020-11-09‘)"; //int num=statement.executeUpdate(sql); //System.out.println(num); //删除 //String sql1="delete from users where id=4"; //int num1=statement.executeUpdate(sql1); //System.out.println(num1); //更新 //String sql2="update users set name=‘dwx‘ where id=1"; //int num3=statement.executeUpdate(sql2); //System.out.println(num3); //查询 String sql3="select * from users where id=1"; ResultSet resultSet=statement.executeQuery(sql3); while(resultSet.next()){ System.out.println(resultSet.getObject("name")); } } }
PrepareStatement是Statement的子类,实例对象可以通过调用Connection.preparedStatement()获得,preparedStatement可以避免SQL注入问题,Statement会使数据库频繁编译sql,可能造成数据库缓冲区溢出。PreparedStatement可对SQL进行预编译,从而提高数据库执行效率。并且PreperedStatement对于sql中的参数,允许使用占位符进行替换。
public class Jdbcdemo { public static void main(String[] args) throws Exception { String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&SSL=true&serverTimezone=UTC"; String username="root"; String password="123456"; //加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //创建链接 Connection connection=DriverManager.getConnection(url,username,password); //插入SQL命令,SQL中参数使用?作为占位符 //String sql="insert into users(id,name,password,email,birthday) values(?,?,?,?,?)"; //PreparedStatement preparedStatement=connection.prepareStatement(sql); //为sql语句中的参数赋值 //preparedStatement.setInt(1,5); //preparedStatement.setString(2,"dddy"); //preparedStatement.setString(3,"53653"); //preparedStatement.setString(4,"9090@qq.com"); //preparedStatement.setDate(5,new java.sql.Date(new Date().getTime())); //int num=preparedStatement.executeUpdate(); //System.out.println(num); //删除 String sql2="delete from users where id=?"; PreparedStatement preparedStatement1=connection.prepareStatement(sql2); preparedStatement1.setInt(1,2); int num2=preparedStatement1.executeUpdate(); System.out.println(num2); } }
PreparedStatement可以防止SQL注入,原理是在执行时,参数会用引号包起来,并把参数中的引号当作转义字符,从而避免了参数直接作为条件
隔离性问题
Connection对象会自动提交sql语句,如要让多条sql在一个事务中执行,执行如下操作
数据库连接池负责分配管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接,而不是重新创建一个。
编写连接池需要实现java.sql.DataSource接口
常见的连接池技术有DBCP和C3P0,创建数据源后直接从数据源获取连接
Tomcat的连接池就是采用DBCP连接池来实现的
Spring使用它,其与DBCP的区别是
Mysql和JDBC
标签:love 描述 lock 完整性 bcp 允许 tin 连接数量 load