String username = sc.next();
System.out.println(“请输入密码:”);
String password = sc.next();
//1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2.获得连接
String url = “jdbc:mysql://localhost:3306/companydb?useUnicode = true&characterEncoding = utf8”;
Connection connection = DriverManager.getConnection(url,“root”,“root”);
//3.获取执行的对象
String sql =“select * from user where username = ? and password = ?”;
//预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//为SQL语句赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//4.执行SQL语句
ResultSet resultSet = preparedStatement.executeQuery();
//5.处理结果
if(resultSet.next()){
System.out.println(“登录成功”);
}else{
System.out.println(“登录失败”);
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
============================================================================
- 在src目录下新建jdbc.properties文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/db0707?useUnicode=true&characterEncoding=utf8
user = root
password = root
- 工具类的实现
public class JDBCUtils {
//定义成员
private static String url;
private static String user;
private static String password;
private static String driver;
static{
try {
Properties prop = new Properties();
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL urlPath = classLoader.getResource(“jdbc.properties”);
String path = urlPath.getPath();
prop.load(new FileReader(path));
url = prop.getProperty(“url”);
user = prop.getProperty(“user”);
password = prop.getProperty(“password”);
//加载驱动
Class.forName(prop.getProperty(“driver”));
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据库连接对象
public static Connection getConnection(){
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//释放资源(DDL、DML)
public static void close(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//针对DQL语句的关闭
public static void close(ResultSet rs,Statement stmt,Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
9. ORM(Object Relational Mapping)
=====================================================================================================
ORM(Object Relational Mapping)
从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理;
CREATE TABLE user
(
id INT PRIMARY KEY,#主键
username VARCHAR(20) NOT NULL,
password
VARCHAR(20) NOT NULL,#非空
sex CHAR(2),
email VARCHAR(50) NOT NULL,
address VARCHAR(20) NOT NULL
)CHARSET = utf8;
INSERT INTO user
(id,username,password
,sex,email,address)
VALUES (1001,‘kaka’,‘123’,‘男’,‘123456789@qq.com’,‘陕西省’);
/**
-
数据库工具类
-
1.获取连接 connection
-
2.释放资源
-
可跨平台方案
*/
import java.io.*;
import java.sql.*;
import java.util.Properties;
public class DBUtils{
//配置文件集合 永远不变
private static final Properties properties = new Properties();
static {
try {
//使用类自带的流
//首次使用工具类,触发类加载
InputStream is = DBUtils.class.getResourceAsStream(“/db.properties”);
//通过流将配置信息的内容分割成键值对
//将is流中的配置文件信息,加载到集合中
properties.load(is);
Class.forName(properties.getProperty(“driver”));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获得连接
public static Connection getConnection(){
Connection connection = null;
try {
connection = DriverManager.getConnection(properties.getProperty(“url”),properties.getProperty(“username”),properties.getProperty(“password”));
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//释放资源
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class User {
private int id;
private String username;
private String password;
private String sex;
private String email;
private String address;
public User(){}
@Override
public String toString() {
return “User{” +
“id=” + id +
“, username='” + username + ‘’’ +
“, password='” + password + ‘’’ +
“, sex='” + sex + ‘’’ +
“, email='” + email + ‘’’ +
“, address='” + address + ‘’’ +
‘}’;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User(int id, String username, String password, String sex, String email, String address) {
this.id = id;
this.username = username;
this.password = password;
this.sex = sex;
this.email = email;
this.address = address;
}
}
/**
- ORM查询
*/
import java.sql.*;
public class OrmSelect {
public static void main(String[] args) {
Connection connection = DBUtils.getConnection();
String sql = “select id,username,PASSWORD,sex,email,address from user
;”;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
//拿到每一行数据
while (resultSet.next()) {
//拿到每一列的数据
User user = new User();
int id = resultSet.getInt(“id”);
String username = resultSet.getString(“username”);
String password = resultSet.getString(“password”);
String sex = resultSet.getString(“sex”);
String email = resultSet.getString(“email”);
String address = resultSet.getString(“address”);
//将零散的数据,封装在User对象里
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setSex(sex);
user.setEmail(email);
user.setAddress(address);
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(connection, preparedStatement, resultSet);
}
}
}
===============================================================================================
DAO(Data Access Object)数据访问对象:将所有对同一张表的操作都封装在一个XXXDaoImpl对象中、根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll);
- 对于任何一张表中的数据进行操作时(增、删、改、查);应将对于一张表的所有操作统一封装在一个数据访问对象中为了实现重用;
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
sex VARCHAR(2),
salary DOUBLE
) CHARSET = utf8;
public class Employee {
private int id;//工号
private String name;//名字
private String sex;//性别
private double salary ;//工资
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return “employee [id=” + id + “, name=” + name + “, sex=” + sex + “, salary=”
- salary + “]”;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(int id, String name, String sex, double salary) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.salary = salary;
}
}
见第7个板块
/*
*对数据库中emp;oyee表的一系列操作(增删改查)
*实现增删改查
*/
public class UserDaoImpl {
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
//增加
public int insert(Employee emp){
try {
//数据库连接对象
conn = JDBCUtils.getConnection();
//编写SQL语句
String sql = “insert into employee (id,name,sex,salary) values(?,?,?,?);”;
//预编译对象
stmt = conn.prepareStatement(sql);
//执行更新
stmt.setInt(1, emp.getId());
stmt.setString(2, emp.getName());
stmt.setString(3, emp.getSex());
stmt.setDouble(4, emp.getSalary());
int i = stmt.executeUpdate();
return i;
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCUtils.close(stmt, conn);
}
return 0;
}
//删除
public int delete (int id){
conn = JDBCUtils.getConnection();
String sql = “delete from employee where id = ?”;
try {
stmt = conn.prepareStatement(sql);
//获取id
stmt.setInt(1, id);
return stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.close(stmt, conn);
}
return 0;
}
//修改
public int update(Employee emp){
conn = JDBCUtils.getConnection();
String sql = “update employee set name = ?,sex = ?,salary = ? where id = ?”;
try {
stmt = conn.prepareStatement(sql);
//执行更新
stmt.setString(1, emp.getName());
stmt.setString(2, emp.getSex());
stmt.setDouble(3, emp.getSalary());
stmt.setInt(4, emp.getId());
return stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.close(stmt, conn);
}
return 0;
}
//查询
public List selectAll(){
conn = JDBCUtils.getConnection();
String sql = “select id,name,sex,salary from employee”;
List empList = new ArrayList();
try {
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
while(rs.next()){
int id = rs.getInt(“id”);
String name = rs.getString(“name”);
String sex = rs.getString(“sex”);
double salary = rs.getDouble(“salary”);
Employee emp = new Employee(id, name, sex, salary);
//每封装完一个对象,添加到集合当中
empList.add(emp);
}
return empList;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(stmt, conn);
}
return null;
}
}
public class JDBCTest {
public static void main(String[] args) {
//新增
UserDaoImpl udi = new UserDaoImpl();
Employee emp = new Employee(3,“wangwu”,“nv”,4555);
int result = udi.insert(emp);
if(result > 0){
System.out.println(“success”);
}else{
System.out.println(“defeat”);
}
//删除
int result = udi.delete(3);
System.out.println(result);
//修改
Employee emp = new Employee(1,“kaka”,“m”,12345);
int result = udi.update(emp);
System.out.println(result);
//查询
List empList = udi.selectAll();
empList.forEach(System.out::println);
}
}
============================================================================
- java.util.Date
java语言常规应用层面的日期类型;可以通过字符串创建对应的时间对象;**无法直接通过JDBC插入数据库**
- java.sql.Date
不可以通过字符串创建对应的时间对象;只能通过毫秒值创建对象;**可以直接通过JDBC插入数据库**
sql赋util可以,util赋sql不行,因为sql是util的子类;
- SimpleDateFormat 日期格式化
//自定义一个时间
String str = “2020-02-02”;
//日期转换将字符串转为 java.util.Date
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
//将日期字符串转换成 util.Date类型
java.util.Date utilDate = sdf.parse(str);
System.out.println(utilDate);
/**
-
日期转换
-
字符串转UtilDate
-
字符串转SqlDate
-
utilDate转成SqlDate
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class DateUtils {
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd”);
//字符串转Util
public static java.util.Date strToUtilDate(String str) {
try {
return simpleDateFormat.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
//字符串转sql(不常用)
public static java.sql.Date strToSqlDate(String str){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd”);
try {
java.util.Date date = simpleDateFormat.parse(str);
return new java.sql.Date(date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
//util转sql
public static java.sql.Date utilToSql(java.util.Date date){
return new java.sql.Date(date.getTime());
}
}
public static void main(String[] args) throws ParseException{
//1.java.util.Date
// 当前系统时间
System.out.println(new java.util.Date());
//自定义一个时间
String str = “2020-02-02”;
//日期转换将字符串转为 java.util.Date
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
//将日期字符串转换成 util.Date类型
java.util.Date utilDate = sdf.parse(str);
System.out.println(utilDate);
//sql.Date 需要毫秒值,来构建一个日期
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println(sqlDate);
java.util.Date date = DateUtils.strToUtilDate(“2020-03-28”);
System.out.println(date);
java.sql.Date date2 = DateUtils.utilToSql(date);
System.out.println(date2);
}
}
==============================================================================
使用JDBC操作事务,在对业务进行操作的时候,将业务操作使用事务进行管理,操作结果要么同时成功,要么同时失败;
- void setAutoCommit(boolean autoCommit):
参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务
- void commit():提交事务
- void rollback():回滚事务
- 获取连接
- 开启事务
- 获取到 PreparedStatement
- 使用 PreparedStatement 执行两次更新操作
- 正常情况下提交事务
- 出现异常回滚事务
- 关闭资源
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
– 插入账户
INSERT INTO account (NAME , balance) VALUE (‘zhangsan’,1000);
INSERT INTO account (NAME , balance) VALUE (‘lisi’,1000);
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null ;
PreparedStatement ps1 = null ;
PreparedStatement ps2 = null ;
try {
//获取数据库的连接对象
conn = JDBCUtils.getConnection() ;
//开启事务 //Mysql:中开启 start transaction ;
conn.setAutoCommit(false); //false开启收到提交 ,true自动提交
//准备sql语句
String sqlStr1 = “update account set balance = balance - ? where id = ?” ;
String sqlStr2 = “update account set balance = balance + ? where id = ?” ;
//使用连接对象获取预编译对象,给数据库发送sql进行预编译操作
ps1 = conn.prepareStatement(sqlStr1) ;
ps2 = conn.prepareStatement(sqlStr2) ;
//分别设置参数
ps1.setDouble(1, 500);
ps1.setInt(2, 1);
ps2.setDouble(1, 500);
ps2.setInt(2, 2);
//进行更新
int count1 = ps1.executeUpdate() ;
System.out.println(count1);
System.out.println(sqlStr1);
//模拟中间有问题
int x = 3 / 0 ; //程序问题了,程序结束
int count2 = ps2.executeUpdate() ;
System.out.println(count2);
System.out.println(sqlStr2);
//提交事务
conn.commit();
} catch (SQLException e) {
//回滚 //如果程序问题了,执行catch语句
if(conn!=null) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}finally {
JDBCUtils.close(ps1, conn);
JDBCUtils.close(ps2, null);
}
}
}
//开启事务
public static void begin(){
Connection connection = getConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
//提交事务
public static void commit(){
Connection connection = getConnection();
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtils.closeAll(connection,null,null);
}
}
//回滚事务
public static void rollback(){
Connection connection = getConnection();
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtils.closeAll(connection,null,null);
}
}
=========================================================================
JDBC每次连接数据库,都要获得一个连接对象。每次创建一个连接对象,都是一个较大的资源,如果在连接量较大的场景下,会极大的浪费资源,容易内存溢出。
连接池就是一个容器,创建好数据库连接对象之后,将这些连接对象存储到容器(初始化)中,每次使用连接对象之后,而是将连接对象归还到连接池中,等待下一次利用;
Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池
使用连接池:c3p0: 需要提供的对应的mysql的c3p0相关的jar包
导入:c3p0-0.9.5.2.jar核心jar包以及它相关的依赖jar包 mchange-commons-java-0.2.12.jar
Druid 是目前比较流行高性能的,分布式列存储
一、亚秒级查询
二、实时数据注入
三、可扩展的PB级存储
四、多环境部署
五、丰富的社区
13.2.1 Druid配置
- 创建druid.properties 配置文件
- 引入druid-1.0.9.jar包
- 需要借助工厂类DruidDataSourceFactory 创建具体的连接池
- 获取DataSouce:连接池对象(接口) 通过连接池获取数据库的连接
- Connection getConnection() throws SQLException;
13.2.2 database.properties 文件配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db0708?useUnicode=true&characterEncoding=utf8
username=root
password=root
#初始化连接
initialSize=10
#最大连接数量
maxActive=30
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位
maxWait=5000
13.2.3 连接池工具类
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/*
*将Druid连接池的获取通过工具类进行封装使用连接池创建连接对象(每次close()都会归还到连接池中),
*操作DDL,DML,DQL都一样
*/
public class JDBCUtils {
//获取数据库连接池
private static DataSource ds;
//提供静态代码块
//加载配置文件
static{
try{
//创建Properties集合类对象
Properties prop = new Properties();
//加载配置文件
InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream(“druid.properties”);
//加载
prop.load(inputStream);
inputStream.close();
//创建连接池对象
ds = DruidDataSourceFactory.createDataSource(prop);
} catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/*
*将Druid连接池的获取通过工具类进行封装使用连接池创建连接对象(每次close()都会归还到连接池中),
*操作DDL,DML,DQL都一样
*/
public class JDBCUtils {
//获取数据库连接池
private static DataSource ds;
//提供静态代码块
//加载配置文件
static{
try{
//创建Properties集合类对象
Properties prop = new Properties();
//加载配置文件
InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream(“druid.properties”);
//加载
prop.load(inputStream);
inputStream.close();
//创建连接池对象
ds = DruidDataSourceFactory.createDataSource(prop);
} catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-RxjbThEE-1712036165117)]
[外链图片转存中…(img-7Gg9pqBK-1712036165118)]
[外链图片转存中…(img-GBwKQGDk-1712036165118)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-vzlVMUs8-1712036165118)]
[外链图片转存中…(img-gE41oLo2-1712036165119)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!