jdbc是一个规范:所有数据库开发厂商对这个规范进行编程,这样Java程序员就不用考虑众多数据库语法问题等等,
jdbc也是一组API,它提供了连接数据库的Connection接口,声明连接的Statement,以及增强的preparedStatment接口(继承Statment);
以上两点让对jdbc编程更加简单,跨数据库
1. 加载驱动(提前要引入数据库驱动的jar包,本文以MySQL为例):
Class.forName("com.mysql.jdbc.Driver")
注:JDBC4以上此句话可以省略,会自动加载;
主要功能
Class.forName(xxx.xx.xx)返回的是一个类
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类
记不住这句话的童鞋可以这样记com.mysql.jdbc是MySQL公司的包名,Driver是具体的驱动类
2. 获取连接
Connection conn = DriverManger.getConnection("jdbc:mysql://localhost:3306/DatabaseName?useSSL=false","root","123456")
DriverManger管理一组 JDBC 驱动程序的基本服务。
jdbc连接数据库底层使用的是TCP协议;所以url格式为getConnection第一个参数;
名词解释 : (jdbc(协议):mysql(子协议)://localhost(本地数据库地址):3306(MySQL默认端口号)/DatabaseName(数据库名称,以自己的为例));
root数据库连接名;123456:数据库密码;这个是自己看自己的配置,和本文不一样哦;
3. 获得声明
Statment stmt=conn.createStatment();
4. 执行
stmt.execute(sql);可执行DDL,DML,如果有返回记录,则返回值为true,否则返回为false
stmt.executeUpdate(sql);可执行update,delete,insert.返回值为int,更新或者删除的条数,
stmt.executeQuery(sql):查询方法:返回值为ResultSet
5. 返回结果
如果是查询:返回ResultSet;
6. 关闭连接
数据库连接数量有限,所以用完要关闭
stmt.close();
conn.close();
首先写一下我的思路:对JDBC程序的步骤进行分析:
1.封装connection
package com.tangbaobao.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午5:00:17
* 封装连接数据库
*/
public class DaoConnection {
//获取连接
public static Connection getConnection() {
String url="jdbc:mysql://localhost:3306/jdbc_test";
String DatabaseName="root";
String DatabasePassword="123456";
Connection conn=null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection(url,DatabaseName,DatabasePassword);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
2.封装查询以及更新方法(preparedStatement)
package com.tangbaobao.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午8:09:30
*
*/
public class QueryList {
Connection conn = null;
// 初始化连接
public QueryList(Connection conn) {
if (conn != null) {
this.conn = conn;
} else {
new Exception("请先获取连接");
}
}
// 声明连接
public boolean updateQuery(String sql, Object... params) throws Exception {
boolean isUpdate = false;
int index = 0;
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
if (regexInput(sql, params)) {
// 传递参数
for (Object o : params) {
index++;
pstmt.setObject(index, o);
}
// 执行
int execute = pstmt.executeUpdate();
if (execute != 0) {
isUpdate = true;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
pstmt.close();
conn.close();
}
return isUpdate;
}
/**
* 返回查询的条数
*
* @param sql
* @param params
* @return
*/
// 查询方法
public int selectQuery(String sql, Object... params) {
int query = 0;
int index = 0;
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
if (regexInput(sql, params)) {
for (Object o : params) {
index++;
pstmt.setObject(index, o);
}
// 执行
ResultSet execute = pstmt.executeQuery();
// 返回结果
while (execute.next()) {
query++;
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return query;
}
// 匹配sql中的占位符
/**
* 匹配字符串中目标字符的个数
*
* @param str传入的字符串
* @param regexChar匹配的字符
* @return
*/
public int regexChar(String str, char regexChar) {
String partten = "\\" + regexChar + "";
Pattern compile = Pattern.compile(partten);
Matcher matcher = compile.matcher(str);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
// 占位符和输入项是否匹配
private boolean regexInput(String sql, Object[] params) throws Exception {
boolean flag = false;
// 解析sql中的占位符
int regexChar = regexChar(sql, '?');
// 判断输入参数长度和占位符个数是否相等
if (params.length != regexChar) {
throw new Exception("输入参数和sql语句中参数不匹配,输入为" + params.length + "sql占位符为:" + regexChar);
} else {
flag = true;
}
return flag;
}
}
3.测试package com.tangbaobao.Contraller;
import java.util.Scanner;
import com.tangbaobao.service.LoginService;
/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:41:38
* 登录校验模块
*/
public class Login {
String username;
String password;
//初始化用户名,密码
public Login(String username,String password) {
this.username=username;
this.password=password;
boolean success = isSuccess(username, password);
if(success) {
System.out.println("登录成功");
}else {
System.out.println("用户名或密码错误");
}
}
//校验用户民密码是否正确方法
public boolean isSuccess(String username,String password) {
boolean flag=false;
LoginService service = new LoginService();
flag=service.checkLogin(username,password);
return flag;
}
//测试
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.next();
System.out.println("请输入用密码");
String password = sc.next();
Login login=new Login(username, password);
}
}
package com.tangbaobao.service;
import com.tangbaobao.dao.LoginDao;
/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:52:26
* 业务逻辑处理
*/
public class LoginService {
public boolean checkLogin(String username, String password) {
//没有业务处理,将请求传递到dao层
LoginDao dao = new LoginDao();
boolean isExist=false;
try {
isExist = dao.checkLogin(username,password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return isExist;
}
}
package com.tangbaobao.dao;
import com.tangbaobao.utils.DaoConnection;
import com.tangbaobao.utils.QueryList;
/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:55:22
* 数据业务处理
*/
public class LoginDao {
//校验用户名密码是否存在方法
public boolean checkLogin(String username, String password) throws Exception {
//1.加载驱动,获取连接
QueryList query =new QueryList(DaoConnection.getConnection());
//2.书写sql语句
String sql="select * from user where username=? and password=?";
//返回结果
int updateQuery = query.selectQuery(sql,username,password);
return updateQuery>0?true:false;
}
}