一.jdbc基础
(1)Java 数据库连接(Java DataBase Connectivity)
作用:通过java语言操作数据库
本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则(接口);各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(jdbc)编程,运行时的代码其实就是驱动jar包中的实现类。
(2)案例:通过java代码向数据库user表插入一条记录。
- 准备数据库
CREATE DATABASE IF NOT EXISTS crmproject;
CREATE TABLE IF NOT EXISTS USER(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(50),
PASSWORD VARCHAR(50)
)
INSERT INTO USER(NAME,PASSWORD) VALUES('admin','123456'),('root','1234567');
SELECT * FROM USER;
- 创建java工程,导入mysql驱动jar包
- 编写代码
// 1.注册驱动
// 2.建立连接
// 3.编写sql
// 4.获取sql执行对象
// 5.执行sql并返回结果
// 6.处理结果
// 7.释放资源
public class JDBCQuick {
public static void main(String[] args) throws Exception {
// 1.注册驱动
DriverManager.registerDriver(new Driver());
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.编写sql(在java编写sql 结尾;可以省略)
String sql = "insert into user values(null,'luy','666')";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
if (i>0) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
// 7.释放资源
statement.close();
connection.close();
}
}
(3)API介绍
sun公司提供的:java.sql包下
DriverManager:驱动管理对象
1. 注册驱动
1)
static void registerDriver(Driver driver)
我们通过翻看MySQL Driver实现类的源码发现内部的静态代码已经提供了注册驱动功能
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
2)反射
Class.forName("com.mysql.jdbc.Driver");
3)SPI 服务提供接口 【Service Provider Interface】
2. 建立连接
static Connection getConnection(String url, String user, String password)
参数说明:
url:连接指定数据库地址【固定格式】
格式:jdbc:mysql://ip地址+端口/数据库名
实例:
jdbc:mysql://localhost:3306/crmproject
jdbc:mysql:///crmproject
user:用户名
password:密码
Connection:数据库连接对象
1. 获取sql执行对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2. 事务管理
1)关闭自动提交(开启事务)
void setAutoCommit(boolean autoCommit)
参数:
true:自动提交【默认值】
false:手动提交
2)提交事务
void commit()
3)回滚事务
void rollback()
Statement:执行sql的对象
1. 执行所有类型sql语句
boolean execute(String sql)
----------------------------------
2. 仅执行DML类型sql语句
int executeUpdate(String sql)
参数:dml类型sql(insert、update、delete)
返回值:影响行数
3. 仅执行DQL类型sql语句
ResultSet executeQuery(String sql)
参数:dql类型sql(select)
返回值:结果集
ResultSet:结果集对象,封装查询结果
1. 指针下移
boolean next()
返回值:
true:表示此行有数据
false:表示此行没有数据
2. 获取数据
T getXxx(int 列编号)
T getXxx(String 列名)
补充:获取所有类型
Object getObject(String 列名)
String getString(String 列名)
(4)CRUD操作
// 1.注册驱动
// 2.建立连接
// 3.编写sql
// 4.获取sql执行对象
// 5.执行sql并返回结果
// 6.处理结果
// 7.释放资源
user表修改一条记录
// 修改
@Test
public void testUpdate()throws Exception{
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.编写sql
String sql = "update user set username = '布朗' where id = 5";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
if (i>0) {
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
// 7.释放资源
statement.close();
connection.close();
}
user表删除一条记录
// 删除
@Test
public void testDelete()throws Exception{
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.编写sql
String sql = "delete from user where id = 7";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
if (i>0) {
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
// 7.释放资源
statement.close();
connection.close();
}
user表查询所有记录
// 查询
@Test
public void testFindAll() throws Exception {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.编写sql
String sql = "select * from user";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
ResultSet resultSet = statement.executeQuery(sql);
// 6.处理结果
while (resultSet.next()) {
// 获取数据
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
System.out.println("编号:" + id + " 用户名:" + username + " 密码:" + password);
}
// 7.释放资源
resultSet.close();
statement.close();
connection.close();
}
(5)工具类
每次去执行SQL语句都需要注册驱动,获取连接,得到Statement,以及释放资源。发现很多重复的劳动,我们可以将重复的代码定义到一个工具类中
分析:目标简化书写,一劳永逸
public class JdbcUtils{
// 1.注册驱动【保证一次】
static{
}
// 2.提供获取连接的静态方法
public static Connection getConnection(){
return null;
}
// 3.提供释放资源的方法
public void close(){
}
}
第一种方式:
public class JdbcUitls1 {
// 1.注册驱动【保证一次】
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加载mysql驱动失败");
}
}
// 2.提供获取连接的静态方法
public static Connection getConnection()throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
}
// 3.提供释放资源的方法
public static void close(ResultSet resultSet, Statement statement,Connection connection) {
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重载关闭方法
public static void close(Statement statement,Connection connection){
close(null, statement, connection);
}
}
第二种方式:
抽取配置文件
工具类:
public class JdbcUitls {
// 声明变量
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
// 加载jdbc.properties配置文件,初始化变量
static {
// sun公司专门提供了一从src目录下加载properties类型的工具类 ResourceBundle
ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
driver = jdbc.getString("jdbc.driver");
url = jdbc.getString("jdbc.url");
user = jdbc.getString("jdbc.user");
password = jdbc.getString("jdbc.password");
}
// 1.注册驱动【保证一次】
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加载mysql驱动失败");
}
}
// 2.提供获取连接的静态方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
// 3.提供释放资源的方法
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重载关闭方法
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
}
}
(6)事务操作
* 事务
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
* MySQL操作
1.开启事务
begin | start transaction;
2.提交事务
commit;
3.回顾事务
rollback;
* java操作(使用Connection对象)
1.关闭自动提交(开启事务)
void setAutoCommit(false);
2.提交事务
void commit();
3.回顾事务
void rollback();
案例:转账案例:
//添加数据表
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
money DOUBLE
)
//添加数据
INSERT INTO account (NAME,money) VALUES('蝴蝶结',1000),('罗志祥',1000);
SELECT * FROM account;
编写转账代码:
public class testTX{
@Test
public void testTX(){
try{
// 1.获取连接【JdbcUtils工具类】
// 2.开启事务
// 3.罗志祥扣钱
// 机器故障
// 4.蝴蝶结加钱
// 5.提交事务
}catch(Exception e){
// 6.回滚事务
}finally{
// 7.释放资源
}
}
}
public class testTX{
@Test
public void testTX() {
Connection connection = null;
Statement statement = null;
try {
// 1.获取连接【JdbcUtils工具类】
connection = JdbcUitls.getConnection();
// 2.开启事务
connection.setAutoCommit(false);
statement = connection.createStatement();
// 3.罗志祥扣钱
String xiangSql = "update account set money = money-100 where id = 2";
int xiangResult = statement.executeUpdate(xiangSql);
if (xiangResult > 0) {
System.out.println("罗志祥支付成功~~~");
}
// 机器故障
int a = 1 / 0;
// 4.蝴蝶结加钱
String dieSql = "update account set money = money + 100 where id = 1";
int dieResult = statement.executeUpdate(dieSql);
if (dieResult > 0) {
System.out.println("蝴蝶结收款成功~~~");
}
// 5.提交事务
connection.commit();
} catch (Exception e) {
e.printStackTrace();
try {
// 6.回滚事务
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
// 7.释放资源
JdbcUitls.close(statement, connection);
}
}
}
二.案例,用户登录
用户输入账号,密码,实现登录网站功能。
创建工程结构:
工具类:
package com.wsl.login.util;
import java.sql.*;
import java.util.ResourceBundle;
public class JdbcUtils {
//声明初始化变量
private static String driver = null;
private static String url =null;
private static String user =null;
private static String password =null;
//加载jdbc文件
static {
ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
driver = jdbc.getString("jdbc.driver");
url = jdbc.getString("jdbc.url");
user = jdbc.getString("jdbc.user");
password = jdbc.getString("jdbc.password");
}
//初始化注册驱动
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加载mysql驱动失败");
}
}
//创建连接器
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url,user,password);
}
//提供释放资源的方法
public static void close(ResultSet resultSet, Statement statement,Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//方法重载
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
}
LoginServlet
package com.wsl.login.web;
import com.wsl.login.domain.User;
import com.wsl.login.service.UserService;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
try {
Map<String, String[]> parameterMap = request.getParameterMap();
User user=new User();
BeanUtils.populate(user,parameterMap);
UserService userService = new UserService();
int flag = userService.loginUser(user);
if (flag==1){//成功
request.getSession().setAttribute("loginUsername",user.getName());
response.sendRedirect(request.getContextPath()+"/list.jsp");
}else{//失败
request.setAttribute("error","用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package com.wsl.login.service;
import com.wsl.login.dao.UserDao;
import com.wsl.login.domain.User;
import java.util.List;
public class UserService {
UserDao userDao = new UserDao();
public int loginUser(User user){
return userDao.loginUser(user);
}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
public class UserDao {
public int loginUser(User user) {
try {
Connection connection = JdbcUtils.getConnection();
String sql = "select * from user where name='"+user.getName()+"' and password = '"+user.getPassword()+"'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()){
return 1;
}else{
return 0;
}
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
}
public class User {
private String id;
private String name;
private String password;
public User() {
}
public User(String id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
<form action="${pageContext.request.contextPath}/LoginServlet" method="post">
<h4>登录人是:${pageContext.session.getAttribute("loginUsername")}</h4>