JDBC的开发步骤以及连接的简单封装
来源:互联网 发布:eve捏人美女数据 编辑:程序博客网 时间:2024/06/01 10:04
jdbc的开发步骤以及封装连接
jdbc是一个规范:所有数据库开发厂商对这个规范进行编程,这样Java程序员就不用考虑众多数据库语法问题等等,
jdbc也是一组API,它提供了连接数据库的Connection接口,声明连接的Statement,以及增强的preparedStatment接口(继承Statment);
以上两点让对jdbc编程更加简单,跨数据库
下面介绍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连接的简单封装
首先写一下我的思路:对JDBC程序的步骤进行分析:
- 加载驱动:一个工程只需要加载一次:所以封装
- 获取连接:配置文件不太需要改动,无需每次写,所以封装;
- 获取声明:sql语句每次需要手动写,所以不能封装
- 返回结果集:可以从需要的封装方法获取
- 关闭连接:获取连接之后,需要关闭资源,所以封装
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;
}
}
package com.tangbaobao.utils;
2.封装查询以及更新方法(preparedStatement)
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;}
}
package com.tangbaobao.Contraller;
3.测试
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;
}
}
`
- JDBC的开发步骤以及连接的简单封装
- 一个简单的jdbc连接封装
- JDBC连接的封装
- JDBC的连接步骤
- JDBC连接数据库的步骤以及url中“?”"&"的作用
- 关于jdbc连接数据库的步骤以及注意点
- JDBC(1) 简单的连接数据库和封装
- 有关appwidget的简单开发以及步骤
- JDBC连接的封装函数
- JDBC连接数据库的步骤
- JDBC连接数据库的步骤
- jdbc连接数据库的步骤
- jdbc连接数据的步骤
- JDBC连接数据库的步骤
- JDBC连接数据库的步骤
- jdbc连接数据库的步骤
- JDBC连接数据库的步骤
- jdbc连接数据库的步骤
- SpringBoot学习笔记(三):EnableAutoConfiguration作用和机制
- JZOJ5407. 【NOIP2017提高A组集训10.21】Deep
- PHP数组函数: array_walk()与 array_map() 的区别
- Kotlin 学习资源
- 周志华机器学习读后总结 第三章
- JDBC的开发步骤以及连接的简单封装
- 数据结构——关于栈的一些认识
- 异步编程
- 【机器学习】贝叶斯分类器总结
- pat甲级1002.A+B for Polynomials
- SpringBoot学习笔记(四):SpringApplication的旅途
- 05-树8 File Transfer(25 分)
- Web开发知识点汇总(每天积累一点点)
- 主线程、子线程与进程的退出问题