给宝宝们一个建议, JSP别学啦, 我给你们分享一下我学习的路程吧!! (重点)指的是需要彻底理解,不仅仅是会用
Java基础(都是重点, 但反射和IO最重要),前端基础(HCJ三者) Socket, Servlet(重点)+Tomcat, Mysql数据库 【到这里,基本方面已经OK,开始学习web框架】
Spring(重点), SpringMVC(JDBC看你学不学咯), MyBatis, SpringBoot, 前端的: Jquery, Vue(一定要学) 【到这里你已经可以做出自己的网站了,可以学习其它框架】
Linux(重点,命令熟能生巧), Docker, Es7, FastDFS, Git, MQ(推荐学习RabbitMQ和Kafka), Nginx, Redis,Zookeeper, SpringCloud
也不能忘记了基础以及进阶JVM, JUC, WebSocket, Netty 【到这里已经可以自信一点面试了,前提是你理解了并且能表达出来,然后学习大数据方面】
Hadoop全家桶, Kafka, Flink, Spark, K8S
我现在正在学习Flink, 发现感觉自己是弱鸡, 兴趣最重要, 是学完的必要条件. 目标也最重要, 是提升个人高度天花板的必要条件, 表达和展示能力很重要, 要不没人知道你会
一、概念
JDBC(Java DataBase Connectivity),Java数据库连接,Java语言操作数据库
本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。然后各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们学者可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
二、快速入门
步骤:
1. 导入驱动jar包 mysql-connector-java-8.0.19
2. 注册驱动
3. 获取数据库连接对象Connection
4. 定义sql语句
5. 获取执行sql语句的对象Statement,因为connection不能直接执行
6. 执行sql,接收返回结果
7. 处理结果
8. 释放资源(以免造成内存泄漏)
9. 代码如下:
package com.jdbc;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象 //localhost:3306为ip地址 /db3为选中的数据库名
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?serverTimezone=GMT","root","root");
//4.定义SQL语句
String sql= "update account set balance=500 where id=1";
//5.获取执行sql的对象 Statement
Statement statement = conn.createStatement();
//6.执行SQL语句
int count = statement.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
statement.close();
conn.close();
}
}
三、详解各个对象
1. DriverManager:驱动管理对象
* 功能为:
1、注册驱动
static void registerDriver(Driver driver):注册给定的驱动程序DriverManager
然后代码使用只有这一句话:Class.forName(“com.mysql.jc.jdbc.Driver”);(注意mysql5之后的驱动jar包可以省略不写)
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
static{
try{
java.sql.DriverManage.registerDriver(new Driver());
}catch{
throw new RuntimeException("Can't register driver!");
}
}
2、获取数据库连接
方法:static Connection getConnection(String url, String user, String password)
url(参数):指定连接的路径,其语法为jdbc:mysql://ip地址(域名):端口号/数据库名称?serverTimezone=GMT
2. Connection:数据库连接对象
* 功能为:
1、获取执行sql的对象
Statement createStatement() / preparedStatement prepareStatement(String sql)
2.管理事务:
开启事务:setAutoCommit(boolean autocommit) 该方法的参数设置为false即开启事务
提交事务:commit()
回滚事务:rollback()
3. Statement:执行sql的对象(执行静态的SQL语句,就是sql里面参数值是已知给出的)
* 功能为:
1、执行sql
boolean execute(String sql) 可以执行任意的sql语句
int executeUpdate(String sql) 执行DML语句(操作表里的数据insert、update、delete)、DDL语句(操作数 据库和表 create、alter、drop)
ResultSet executeQuery(String sql) 执行DQL语句(对表中的数据进行select)
4. ResultSet:结果集对象
1、boolean next():游标向下移动一行,判断当前航是否是最后一行末尾,如果是,则返回false;不是返回true
2、getString(1) / getInt(1) / getDouble(“id”):参数“1”表示第一列,参数“id”表示列名id
5. PreparedStatement:执行sql的对象(执行动态的SQL语句)
1、SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。造成安全问题
1.输入用户名(随便写的),输入密码:a’ or ‘a’ = ‘a
2.sql: select *from user where username=‘wyb’ and password =’ a’ or ‘a’ = 'a ’
2、解决sql注入问题:使用preparestatement对象来解决
3、预编译的sql:参数使用?作为占位符
四、抽取JDBC工具类:JdbcUtils(简化书写)
就是新建一个util文件夹,工程的结构如下所示:
JDBCUtils.java的代码如下:
package com.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/*
* 配置文件的读取,只需要读取一次即可拿到这些值,利用静态代码块
* */
static {
//读取资源文件,获取值
try {
//1. 创建properties集合类
Properties pro = new Properties();
//获取src路径下的文件的方式
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties"); //参数是以src为根目录的
String path = res.getPath();
//2.加载文件
pro.load(new FileReader(path));
//3.获取数据,赋值
url =pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取连接对象*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/*
* 释放资源
* */
public static void close(Statement st, Connection conn) {
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
* 释放资源(针对的是查询sql语句)
* */
public static void close(ResultSet rs, Statement st, Connection conn) {
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();
}
}
}
}
JDBCDemo2的代码如下:
package com.jdbc;
import com.domain.Emp;
import com.util.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
//使用了JDBCUtil工具类
//定义一个方法,查询emp表的数据将其封装为对象,然后转载集合,返回
public class JdbcDemo2 {
public static void main(String[] args) {
List<Emp> list = new JdbcDemo2().findAll();
System.out.println(list);
}
/*
*演示Jdbc工具类*/
public List<Emp> findAll(){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
List<Emp> list = null;
try {
conn = JDBCUtils.getConnection();
//3.定义SQL语句
String sql = "select * from emp";
//4.获取执行sql对象
st = conn.createStatement();
//5.执行SQL语句
rs = st.executeQuery(sql);
Emp emp = new Emp();
list = new ArrayList<Emp>();
while (rs.next()){
int id = rs.getInt("id");
String ename = rs.getString("ename");
int job_id = rs.getInt("job_id");
double salary = rs.getDouble("salary");
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setSalary(salary);
list.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
// JDBCUtils.close(rs,st,conn);
}
return list;
}
}