学习心得
学习JDBC,先把jbr包引进去,8.0之后的用8.0的,之前的可以用5.7或者更早的,8和之前的有区别,Driver 的class地方不一样。
掌握情况
还行
聚合函数
count:计数。 count(*) 约等于 count(1)> count(主键)【普通情况下】
- count(*):MySQL对 count(*)底层优化,count(0)。
- count(1)
- count(主键)
- count(字段)
min:最小值
max:最大值
sum:求和
avg:平均值
数值型函数
主要是对数值型进行处理
ceiling:向上取整
floor:向下取整
round:四舍五入
truncate(x,y):返回数字值x截断为y位小数的结果
Pl:圆周率,Π pai
rand:返回0-1之间的随机数
abs:绝对值
-- 绝对值 select ABS(-4) 4的绝对值,ABS(-1.1); -- 向下取整,向上取整,四舍五入 select CEILING(4.1),FLOOR(1.1),ROUND(-4.4) -- 取余 select MOD(60,11); -- 随机数 select RAND(),RAND(),RAND() -- 截断 select TRUNCATE(2.33999999,2);
字符串型函数
对字符串进行处理
length(s):字符串的长度
concat(s1,s2,s3......sn):合并字符串
lower(str):将字母转成小写
upper(str):将字母转成大写
left(str,x):返回字符串str从左开始要x个字符
right(str,x):返回字符串str从右开始要x个字符
trim:去掉左右两边的空格
replace:替换
substring:截取
reverse:反转
select LEFT('abcdefg',2); select RIGHT('abcdefg',2); select REVERSE('hijklmn'); select REPLACE('abcdefg','abc','x');
日期和时间函数
date, time, datetime, timestamp, year
获取时间和日期
- 【curdate】和【current_date】,返回当前的系统日期。
- 【curtime】和【current_time】,返回当前的系统时间。
- 【now】和【sysdate】,返回当前的系统时间和日期。
select CURRENT_DATE(); select CURTIME(); select now();
时间戳和日期转换函数
【UNIX_TIMESTAMP()】获取unix时间戳函数
【FROM_UNIXTIME()】将时间戳转换为时间格式
select UNIX_TIMESTAMP(); select FROM_UNIXTIME(1660785720);
根据日期获取年月日的数值
select MONTH(SYSDATE()); select MONTHNAME(SYSDATE()); select DAYNAME(SYSDATE()); select DAYOFWEEK(SYSDATE()); select WEEK(SYSDATE()); select DAYOFMONTH(SYSDATE()); select YEAR(SYSDATE());
时间日期的计算
-- 日期加法 select DATE_ADD(SYSDATE(),INTERVAL 70 DAY); -- 日期减法 select DATE_SUB(SYSDATE(),INTERVAL 10 DAY); -- 时间间隔 select DATEDIFF('2023-01-01',SYSDATE()); -- 日期格式化 select DATE_FORMAT(SYSDATE(),'%W %M %D %Y');
加密函数
-- 把传入的参数的字符串按照md5算法进行加密,得到一个32位的16进制的字符串 select MD5('123456');
md5算法是不可逆的。
流程控制函数
可以进行条件判断,用来实现SQL语句的逻辑。
- if(test,t,f):如果test是真,则返回t,否则返回f
- ifnull(arg1,arg2):如果arg1不是空,返回arg1,否则返回arg2
- nullif(arg1,arg2):如果arg1=arg2返回null,否则返回arg1
select IF(2 > 1,'a','b'); select IFNULL(sal,0); select NULLIF(age,0);
对一系列的值进行判断:
-- 输出学生的各科的成绩,以及评级,60以下D,60-70是C,71-80是B,80以上是A SELECT *, CASE WHEN score < 60 THEN 'D' WHEN score >= 60 AND score < 70 THEN 'C' WHEN score >= 70 AND score < 80 THEN 'B' WHEN score >= 80 THEN 'A' END AS '评级' FROM mystudent;
-- 行转列 SELECT user_name, max( CASE course WHEN '数学' THEN score ELSE 0 END ) '数学', max( CASE course WHEN '语文' THEN score ELSE 0 END ) '语文', max( CASE course WHEN '英语' THEN score ELSE 0 END ) '英语' FROM mystudent GROUP BY user_name
JDBC:
1.数据库的驱动:java.sql.Driver接口,所有驱动程序需要实现的接口
2.URL地址:
jdbc协议
jdbc:mysql://主机名称 : 端口号/数据库名
jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding =utf8
8.0版本还需要传参useSSL=false&serverTimezone = UTC
3.用户名:root
4.密码:root
这个是8.0版本的,之前的就直接把&后面的东西删掉,上面类的包里的cj去掉就可以
显示数据库连接成功,就是可以在Java里面操作MySQL库的东西,
自己在NaviCat里面建个表,在Java里面插入删除修改都可以
连接:
import org.junit.Test; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Objects; import com.mysql.cj.jdbc.Driver ; public class Ch01 { @Test public void test02() throws ClassNotFoundException, SQLException { // 数据库的url String url = "jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone = UTC"; String username = "root"; String password = "root"; // 驱动的全类名 String driverName = "com.mysql.cj.jdbc.Driver"; // 1.加载驱动类 Class.forName(driverName); // 4.获取连接 Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); System.out.println(Objects.nonNull(connection) ? "数据库连接成功" : "数据库连接失败");
执行数据库的DML语句--增删改
java中三个接口分别定义了对数据库的调用的不同的方式:
1.Statement:用来执行静态sql语句并返回它所生成的结果对象
2.PrepareStatement:预编译,可以使用此对象多次高效的执行该语句
3.CallableStatement:用来执行sql存储过程
先建一个jdbc.properties 里面写:
mysql.url = jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone = UTC mysql.username = root mysql.password = root mysql.driverName = com.mysql.cj.jdbc.Driver
属性文件的好处
public class Ch01 { @Test public void test02() throws ClassNotFoundException, SQLException, IOException { /* 使用属性文件的好处: 1、实现了代码和数据的分离,如果需要修改配置信息,直接在属性文件中修改即可,不需要深入代码 2、如果修改了配置信息,省去了编译的过程 */ Properties properties = new Properties(); // 读取外部的properties属性文件 // 记住就好,复制粘贴就好 properties.load(Ch01.class.getClassLoader().getResourceAsStream("jdbc.properties")); String url = properties.getProperty("mysql.url"); String driverName = properties.getProperty("mysql.driverName"); String username = properties.getProperty("mysql.username"); String password = properties.getProperty("mysql.password"); // // 1.加载驱动类 Class.forName(driverName); // // 4.获取连接 Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); System.out.println(Objects.nonNull(connection) ? "数据库连接成功" : "数据库连接失败"); } @Test public void test01() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, SQLException { // 数据库的url
String url = "jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone = UTC";
String username = "root"; String password = "root"; // 驱动的全类名 String driverName = "com.mysql.jdbc.Driver"; // 1.加载驱动类 Class clazz = Class.forName(driverName); // 2.实例化Driver对象 Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance(); // 3.注册驱动 DriverManager.registerDriver(driver); // 4.获取连接 Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); System.out.println(Objects.nonNull(connection) ? "数据库连接成功" : "数据库连接失败");
String sql = "INSERT INTO teacher (name) VALUES ('Jay')";这个是添加操作
public class Ch02 { @Test public void test01(){ // 1.获取连接 Connection conn = null; Statement stmt = null; try { conn = JDBCUtil.getConnection(); stmt = conn.createStatement(); // 2.执行sql语句 String sql = "INSERT INTO teacher (name) VALUES ('Jay')"; // 修改 sql = "UPDATE teacher SET name = 'JJ' where id = 7"; sql = "select * from teacher"; // 返回值是执行sql语句影响的行数 int i = stmt.executeUpdate(sql); // 3.处理执行sql的返回值 System.out.println(i); System.out.println("操作成功..."); } catch (SQLException e) { throw new RuntimeException(e); } finally { JDBCUtil.close(conn,stmt); } } }
也可以查询,在Java中打印出来
import org.junit.Test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Ch03 { @Test public void test01() { // 1.获取连接 Connection conn = JDBCUtil.getConnection(); Statement stmt = null; ResultSet rs = null; try { // 2.获取可以执行sql语句的stmt对象 stmt = conn.createStatement(); // 3.定义sql String sql = "select id tid,name tname from teacher "; // 4.执行查询的sql,会得到一个ResultSet // ResultSet就是封装了查询结果的一个对象 rs = stmt.executeQuery(sql); // 5.遍历结果集ResultSet while(rs.next()) { int id = rs.getInt("tid"); String name = rs.getString("tname"); System.out.println("id:" + id + ",name:" + name); } } catch (SQLException e) { throw new RuntimeException(e); } finally { // 6.关闭资源 JDBCUtil.close(conn,stmt,rs); }
当然,首先需要在自己的navicat中建一个有数据的表,