首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,085 阅读
2
类的加载
741 阅读
3
Spring Cloud OAuth2.0
726 阅读
4
SpringBoot自动装配原理
691 阅读
5
集合不安全问题
586 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
389
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
页面
统计
关于
搜索到
46
篇与
的结果
2020-11-08
statement对象
statement对象jdbc中的statement对象用于向数据库发送SQL语句,例如:想完成对数据库的增删查改,只需通过这个对象向数据库发送增删查改语句即可。Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的resultSet对象。CRUD操作 --create使用executeUpdate(String sql)方法完成数据添加操作Statement st = conn.createStatement(); String sql = "insert into user(...) values(...)"; int num = st.executeUpdate(sql); if(num>0){ System.out.println("数据插入成功!"); }CRUD操作 --delete使用executeUpdate(String sql)方法完成数据删除操作Statement st = conn.createStatement(); String sql = "delete from user where id=1"; int num = st.executeUpdate(sql); if(num>0){ System.out.println("删除成功!"); }CRUD操作 --update使用executeUpdate(String sql)方法完成数据修改操作Statement st = conn.createStatement(); String sql = "update user set name='孙笑川' where id =1; int num = st.executeUpdate(sql); if(num>0){ System.out.println("修改成功!"); }CRUD操作 --read使用executeQuery(String sql)方法完成数据查询操作Statement st = conn.createStatement(); String sql = "select * from user; ResultSet rs = st.executeQuery(sql); while(re.next*()){ //根据获取列的数据类型,分别调用rs相应的方法映射到java对象中 }代码实现1、提取工具类package com.sw.kuangshen.utils; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * @Author suaxi * @Date 2020/11/8 21:06 */ public class JdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static{ try{ InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); //1、驱动只用加载一次 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } //释放资源 public static void release(Connection conn, Statement st, ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 2、编写增删改的方法,都是用executeUpdate新增package com.sw.kuangshen; import com.sw.kuangshen.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @Author suaxi * @Date 2020/11/8 21:16 */ public class TestInsert { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql ="INSERT INTO users(id,`name`,`passwd`,`email`,`birthday`)" + "VALUES(4,'dd','12345','dd@qq.com','1994-01-01')"; int i = st.executeUpdate(sql); if(i>0){ System.out.println("插入成功!"); } } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils.release(conn,st,rs); } } } 删除package com.sw.kuangshen; import com.sw.kuangshen.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @Author suaxi * @Date 2020/11/8 21:16 */ public class TestDelete { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql ="DELETE FROM users WHERE id=1"; int i = st.executeUpdate(sql); if(i>0){ System.out.println("删除成功!"); } } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils.release(conn,st,rs); } } } 修改package com.sw.kuangshen; import com.sw.kuangshen.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @Author suaxi * @Date 2020/11/8 21:16 */ public class TestUpdate { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //获取数据库连接 st = conn.createStatement(); //获得SQL的执行对象 String sql ="UPDATE users SET `name`='sunxiaochuan' WHERE id=2"; int i = st.executeUpdate(sql); if(i>0){ System.out.println("更新成功!"); } } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils.release(conn,st,rs); } } } 3、查询 executeQuerypackage com.sw.kuangshen; import com.sw.kuangshen.utils.JdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @Author suaxi * @Date 2020/11/8 21:45 */ public class TestSelect { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs =null; try { conn = JdbcUtils.getConnection(); st = conn.createStatement(); String sql = "select * from users where id=2"; rs = st.executeQuery(sql); //查询完毕会返回一个结果集 while (rs.next()){ System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils.release(conn,st,rs); } } }
2020年11月08日
81 阅读
0 评论
0 点赞
2020-11-07
第一个JDBC程序
创建测试数据库CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStudy; CREATE TABLE users( id INT PRIMARY KEY, name VARCHAR(40), passwd VARCHAR(40), email VARCHAR(40), birthday DATE ); INSERT INTO users(id,name,passwd,email,birthday) VALUES(1,'aa','12345','aa@qq.com','1991-01-01'), (2,'bb','12345','bb@qq.com','1992-01-01'), (3,'cc','12345','cc@qq.com','1993-01-01');1、创建一个普通项目2、导入数据库驱动3、编写测试代码package com.sw.kuangshen; import java.sql.*; /** * @Author suaxi * @Date 2020/11/7 10:58 */ public class jdbcStudyDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.用户信息和url //useUnicode=true&characterEncoding=utf8&useSSL=true //支持中文编码 设置字符集为utf-8 使用安全的连接 String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; String username = "root"; String password = "123456"; //3.连接成功,数据库对象 Connection connection = DriverManager.getConnection(url, username, password); //4.执行SQL的对象 Statement Statement statement = connection.createStatement(); //5.执行SQL的对象去执行SQL语句 String sql = "select * from users"; ResultSet resultSet = statement.executeQuery(sql); //返回的结果集,结果集里封装了查询出来的所有结果、 while (resultSet.next()){ System.out.println("id="+resultSet.getObject("id")); System.out.println("name="+resultSet.getObject("name")); System.out.println("pwd="+resultSet.getObject("passwd")); System.out.println("email="+resultSet.getObject("email")); System.out.println("birth="+resultSet.getObject("birthday")); System.out.println("========================="); } //6.释放连接(先开放的资源后释放) resultSet.close(); statement.close(); connection.close(); } } 步骤总结:1、加载驱动2、连接数据库DriverManager3、获取执行SQL的对象 Statement4、获得返回的结果集5、释放连接DriverManager//DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动 Connection connection = DriverManager.getConnection(url, username, password); //connection 代表数据库 //数据库设置自动提交 //事务提交 //事务回滚 connection.rollback(); connection.commit(); connection.setAutoCommit();URLString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; //mysql默认3306 //协议://主机地址:端口号/数据库名?参数1&参数2&参数3 //oracle默认1521 //jdbc:oracle:thin:@localhost:1521:sidStatement 执行SQL的对象 PrepareStatement执行SQL的对象String sql = "select * from users"; //编写SQL statement.executeQuery(); //查询操作返回resultSet statement.execute(); //执行任何SQL(其中包含一个判断是什么类型SQL的过程) statement.executeUpdate(); //更新、插入、删除都是用用这个,返回一个受影响的行数ResultSet 查询结果集:封装了所有的查询结果获得指定的数据类型resultSet.getObject(); //在不知道类型的情况下使用 //如果知道列的类型就使用指定的类型 resultSet.getString(); resultSet.getInt(); resultSet.getFloat(); resultSet.getDate(); ...遍历,指针resultSet.beforeFirst(); //移动到最前面 resultSet.afterLast(); //移动到最后面 resultSet.next(); //移动到下一个数据 resultSet.previous(); //移动到前一行 resultSet.absolute(row); //移动到指定行释放资源//释放连接(先开放的资源后释放) resultSet.close(); statement.close(); connection.close();
2020年11月07日
114 阅读
0 评论
0 点赞
2020-11-05
三大范式
三大范式为什么需要数据规范化?信息重复更新异常插入异常无法显示正常信息删除异常丢失有效的信息三大范式第一范式(1NF)原子性:保证每一列不可再分学号姓名学历信息1孙笑川本科,大一2刘波硕士,硕二3Giao哥博士,博三根据第一范式规范后为学号姓名学籍信息1孙笑川本科2刘波硕士3Giao哥博士姓名年级信息孙笑川大一刘波硕二Giao哥博三第二范式(2NF)前提:满足第一范式每张表只做一件事订单编号商品名单价数量订单金额时间001铅笔1.001010.0020201101002橡皮擦2.002040.0020201102003胶带3.003090.0020201103根据第二范式规范后为订单编号商品名单价数量001铅笔1.0010002橡皮擦2.0020003胶带3.0030订单编号订单金额时间00110.002020110100240.002020110200390.0020201103第三范式(3NF)前提:满足第一范式和第二范式第三范式需要确保数据表中的每一列数据都和主键直接关联,而不能间接相关学号学生姓名性别班主任班主任年龄001孙笑川男李明30002刘波男陈华31003Giao哥男刘丽32根据第三范式规范后为学号学生姓名性别班主任001孙笑川男李明002刘波男陈华003Giao哥男刘丽班主任班主任年龄李明30陈华31刘丽32规范性 与 性能的问题简要分析关联查询的表不得超过三张考虑商业化的需求和目标(成本,用户体验等),数据库的性能更加重要在规范性能问题的时候,需要适当的考虑一下规范性故意给某些表增加一些冗余字段(从多表查询变为单表查询)故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
2020年11月05日
151 阅读
0 评论
0 点赞
2020-11-05
数据库设计规范
软件开发中,关于数据库的设计分析需求:分析业务和需要处理的数据库的需求概要设计:设计关系图 ,即E-R图设计数据库的步骤:(个人博客)收集信息,分析需求用户表(用户登录退出,个人信息,写博客,创建分类)分类表(文章分类,谁创建的)文章表(文章的信息)评论表友链表自定义表(系统信息,某个关键字,或者一些主字段) key:value*说说表(发表心情 id content create_time)标识实体(把需求具体到每个字段)标识实体之间的关系写博客:user-->blog创建分类:user-->category关注:user-->user友链:links评论:user-user-blog
2020年11月05日
106 阅读
0 评论
0 点赞
2020-11-04
MySQL权限管理
1、用户管理SQL命令操作用户表:mysql.user本质:对这张表进行增删改查-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码' CREATE USER ceshi IDENTIFIED BY '123456'; -- 修改密码(修改当前用户密码) SET PASSWORD = PASSWORD('1234567'); -- 修改指定用户密码 SET PASSWORD FOR ceshi = PASSWORD('1234567'); -- 重命名 RENAME USER 原用户名 TO 新用户名; RENAME USER ceshi TO ceshi01; -- 用户授权 GRANT ALL PRIVILEGES 全部的权限 库.表 -- ALL PRIVILEGES 此处的授权与root用户有区别(除了给别人授权,其他的都能干) GRANT ALL PRIVILEGES ON *.* TO ceshi; -- 查询权限 SHOW GRANTS FOR ceshi; -- 查看指定用户的权限 SHOW GRANTS FOR root@localhost; -- root用户的权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION -- 撤销权限 REVOKE 哪些权限,在哪个库撤销,给谁撤销 REVOKE ALL PRIVILEGES ON *.* FROM ceshi; -- 删除用户 DROP USER ceshi;
2020年11月04日
96 阅读
0 评论
0 点赞
2020-11-04
MySQL备份
为什么要备份:保证重要的数据不丢失数据转移MySQL数据备份的方式:直接拷贝物理文件在可视化工具中手动导出使用命令行导出 mysqldump# 导出 # mysqldump -h 主机 -u用户名 -p密码 数据库 表名 >物理磁盘位置/文件名 mysqldump -hlocalhost -uroot -p123456 school student >D:/a.sql # mysqldump -h 主机 -u用户名 -p密码 数据库 表名1 表名2 表名3 >物理磁盘位置/文件名 mysqldump -hlocalhost -uroot -p123456 school student student01 student02 >D:/b.sql # mysqldump -h 主机 -u用户名 -p密码 数据库 >物理磁盘位置/文件名 mysqldump -hlocalhost -uroot -p123456 school >D:/c.sql #导入 #登录的情况下,切换到指定数据库 # source 备份文件 source D:/a.sql
2020年11月04日
147 阅读
0 评论
0 点赞
2020-11-04
索引
MySQl官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干:就可以得到索引的本质:索引是数据结构。1、索引的分类在一个表中,主键索引只能有一个,唯一索引可以有多个主键索引 (PRIMARY KEY)唯一的标识,主键不可重复,只能有一个列作为主键唯一索引 (UNIQUE KEY)避免重复的列出现,唯一索引可以重复,多个列都可以标识为 唯一索引常规索引(KEY/INDEX)-默认的,通过index,key关键字来设置全文索引(FullText)在特定的数据库引擎下才有,MyISAM快速定位数据基础语法-- 索引的使用 -- 1、在创建表的时候给字段增加索引 -- 2、创建完毕后,增加索引 -- 显示所有的索引信息 SHOW INDEX FROM account; -- 增加一个全文索引 (索引名) 列名 ALTER TABLE shop.account ADD FULLTEXT INDEX `name`(`name`); -- EXPLAIN 分析sql执行的状况 EXPLAIN SELECT * FROM account; -- 非全文索引 EXPLAIN SELECT * FROM account WHERE MATCH(name) AGAINST('a');2、测试索引CREATE TABLE `test_user`( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) DEFAULT '' COMMENT '用户名', email VARCHAR(50) NOT NULL COMMENT '邮箱', phone VARCHAR(50) DEFAULT '' COMMENT '手机号', gender TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男,1:女)', passwd VARCHAR(100) NOT NULL COMMENT '密码', age TINYINT(4) DEFAULT '0' COMMENT '年龄', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id) )ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '用户表'; -- 插入100万数据 DELIMITER $$ -- 写函数之前必须要写,用作标志 CREATE FUNCTION mock_data() RETURNS INT BEGIN DECLARE num INT DEFAULT 1000000; DECLARE i INT DEFAULT 0; WHILE i<num DO -- 插入语句 INSERT INTO test_user(`name`,`email`,`phone`,`gender`,`passwd`,`age`) VALUES(CONCAT('用户',i),'281463547@qq.com', CONCAT('13',FLOOR(RAND()*((999999999-1000000)+1000000))), FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100)); SET i=i+1; END WHILE; RETURN i; END; SELECT mock_data(); SELECT * FROM test_user WHERE `name` = '用户19998'; -- 查询时间3.622s SELECT * FROM test_user WHERE `name` = '用户19998'; -- 查询时间2.349s EXPLAIN SELECT * FROM test_user WHERE `name` = '用户19998'; -- rows 992262 -- id_表名_字段名 -- 语法: CREATE INDEX 索引名 ON 表(字段名) CREATE INDEX id_test_user_name ON test_user(`name`); -- 创建用时18.442s SELECT * FROM test_user WHERE `name` = '用户19998'; -- 创建索引后查询用时0.028s SELECT * FROM test_user WHERE `name` = '用户19998'; -- 0.026s EXPLAIN SELECT * FROM test_user WHERE `name` = '用户19998'; -- rows 1注:索引在小数据量的时候用处不大,但在大数据的时候,区别十分明显3、索引原则索引不是越多越好不要对经常变动的数据加索引小数据量的表不需要加索引索引一般加在经常查询的字段上索引的数据结构Hash类型的索引BTree:InnoDB的默认数据结构
2020年11月04日
171 阅读
0 评论
0 点赞
2020-11-04
数据表的类型
-- 关于数据库引擎 /*INNODB 默认使用 MYISAM 早年使用 */ MYISAMINNODB事务支持NoYes数据行锁定NoYes外键约束NoYes全文索引YesNo表空间的大小较小较大,约为2倍常规使用操作:MYISAM 节约空间,速度较快INNODN 安全性高,事务的处理,多表多用户操作
2020年11月04日
76 阅读
0 评论
0 点赞
1
...
3
4
5
6