框架前连接数据库的准备:通过JDBC连接MySQL
在java中连接数据库有多种方法,但是基本都需要对应的驱动jar包。其实万法不离其宗,学会一种,其他也就基本会了
今天主要讲通过JDBC连接MySQL,其余的后续有机会会详细讲
开发环境: eclipse+MySQL
JDBC简介:
JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。有了JDBC,可以方便的在Java语言中使用SQL语言,从而使Java应用程序或Java Applet可以实现对分布在网络上的各种关系数据库的访问。
1. 导入jdbc驱动
①下载jdbc驱动 官网和网上或者学长都有,可以自己去找,一定要找对应的版本,因为在后续开发中,jar包的版本很重要 ②驱动导入工程直接把下载的jar包拖动到工程src文件夹里面 然后再把jar包添加到库里面
然后就可以在这里看到导入的jar包
2. 数据库管理
连接数据库的方法单独封装成类,这里提供了三种连接方法 先看一下目录结构
DBConfig.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/jdbc_test
username=root
pwd=1234
DBUtil.java
package connect;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
//直连数据库
public Connection getConnection(){
try{
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","1234");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
//通过参数连接数据库
public Connection getConnection(String url,String username,String pwd){
try{
Class.forName("com.mysql.jdc.Driver");
return DriverManager.getConnection(url,username,pwd);
} catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
//通过配置文件DBConfig.properties连接数据库
public Connection openConnection(){
Properties prop=new Properties();
String driver=null;
String username=null;
String url=null;
String pwd=null;
try{
prop.load(this.getClass().getClassLoader().getResourceAsStream("DBConfig.properties"));
driver=prop.getProperty("driver");
url=prop.getProperty("url");
username=prop.getProperty("username");
pwd=prop.getProperty("pwd");
Class.forName(driver);
return DriverManager.getConnection(url,username,pwd);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
//关闭数据库
public void closeConn(Connection conn){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("数据库关闭异常");
e.printStackTrace();
}
}
}
3. 增删改查
Mysql数据库表
create table Users(
id int primary key AUTO_INCREMENT,
name varchar(100),
age int,
birthday date default '1994-5-6',
money int
)AUTO_INCREMENT = 1 ;
UserBean.java
package connect;
//封装userbean,并且定义接口
public class UserBean {
private int id ;
private String name ;
private int age;
private String birthday;
private int money;
public int get_id(){
return id;
}
public void set_id(int id){
this.id=id;
}
public String get_name(){
return name;
}
public void set_name(String name){
this.name=name;
}
public int get_age(){
return age;
}
public void set_age(int age){
this.age=age;
}
public String get_birthday(){
return birthday;
}
public void set_birthday(String birthday){
this.birthday=birthday;
}
public int get_money(){
return money;
}
public void set_money(int money){
this.money=money;
}
}
UserDAO.java
package connect;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDAO {
//创建insert方法
public int insert(UserBean users)
{
int i=0;
DBUtil util = new DBUtil();
Connection conn=util.openConnection();//创建数据库连接
String sql = "insert into Users (id , name, age, birthday, money) values(?,?,?,?,?)";//定义sql语句
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setInt(1, users.get_id());
pstmt.setString(2, users.get_name());
pstmt.setInt(3, users.get_age());
pstmt.setString(4, users.get_birthday());
pstmt.setInt(5, users.get_money());
i = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
try{
conn.rollback();
}catch(SQLException el){
el.printStackTrace();
}
}finally{
util.closeConn(conn);
}
return i;
}
//创建delete方法通过name删除记录
public int delete(String name) {
DBUtil util = new DBUtil();
Connection conn = util.openConnection();
int i = 0;
String sql = "delete from Users where Name='" + name + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
//创建update方法
public int update(UserBean users) {
DBUtil util = new DBUtil();
Connection conn = util.openConnection();
int i = 0;
String sql = "update Users set age='" + users.get_age() + "' where name='" + users.get_name() + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
//创建list方法
public Integer list() {
DBUtil util = new DBUtil();
Connection conn = util.openConnection();
String sql = "select * from Users";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();//列数
System.out.println("============================");
System.out.println("id\tname\tage\tbirthday\t\tmoney");
while (rs.next()) {//一行一行输出
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");//输出
if ((i == 2) && (rs.getString(i).length() < 8)) {//输出制表符
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("============================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
4. 测试
DBUtilTest.java
package connect;
public class DBUtilTest{
public static void main(String args []){
UserBean u = new UserBean();
UserDAO op= new UserDAO();
u.set_id(3);
u.set_name("asdf");
u.set_age(66);
u.set_birthday("2018-10-1");
u.set_money(100);
//增加
op.insert(u);
op.list();
//修改
u.set_age(99);
op.update(u);
op.list();
//删除
op.delete("asdf");
op.list();
}
}
5.IDEA使用JDBC连接数据库(MySQL)
下面再来看下导入jar的步骤(对应版本同上获取),网上此类资料很多,不详细赘述了
写代码
//导入包
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* 数据库连接
*/
public class Conn {
public static void main(String[] args) {
Connection con;
//jdbc驱动
String driver="com.mysql.cj.jdbc.Driver";
//这里我的数据库是cxxt
String url="jdbc:mysql://localhost:3306/demo?&useSSL=false&serverTimezone=UTC";
String user="root";
String password="1234";
try {
//注册JDBC驱动程序
Class.forName(driver);
//建立连接
con = DriverManager.getConnection(url, user, password);
if (!con.isClosed()) {
System.out.println("数据库连接成功");
}
con.close();
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有安装");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
6.总结
JDBC的结构和特点
简单地说,JDBC能完成下列三件事:与一个数据库建立连接;向数据库发送SQL语句;处理数据库返回的结果。
JDBC是一种底层API,这意味着它将直接调用SQL命令。JDBC完全胜任这个任务,而且比其他数据库互联更加容易实现。同时它也是构造高层API和数据库开发工具的基础。高层API和数据库开发工具应该是用户界面更加友好,使用更加方便,更易与理解的。但所有这样的API将最终被翻译为底层API,如JDBC。目前两种基于JDBC的高层API正处在开发阶段。一个是SQL语言嵌入Java的预处理器;另一个是实现从关系数据库到Java类的直接映射。
JDBC包含两部分与数据库独立的API:面向程序开发人员的JDBC API和面向底层的JDBC Driver API。
- java.sql.DriverManager:处理驱动的调入并且对产生新的数据库连接提供支持;
- java.sql.Connection:代表对特定数据库的连接;
- java.sql.Statement:代表一个特定的容器,来对一个特定的数据库执行SQL语句;
- java.sql.ResultSet:控制对一个特定语句的行数据的存取。
其中java.sql.Statement又有两个子类型:java.sql.PreparedStatement用于执行预编译的SQL语句;java.sql.CallableStatement用于执行对一个数据库内嵌过程的调用。
面向地层的JDBC Driver API主要是针对数据库厂商开发数据库底层驱动程序使用的,一般情况下用于开发应用程序用不到这些类库。Java通过SQL包中定义的一系列抽象类对数据库进行操作,而实现这些抽象类并完成实际操作,则是由数据库驱动器Driver运行的。JDBC的Driver可分为以下4中类型:
- JDBC-ODBCBridge和ODBC Driver
- Native-API partly-Java Driver
- JDBC-Net All-Java Driver
- Native-protocol All-Java Driver
JDBC优缺点
- 可以对所以主流数据库进行统一访问(ACCESS,MySQL,Sql Server,Oracle);
- 极大地减少了程序操作数据库的复杂性;
- jdbc使用面向对象的方式操作数据,能更好的和Java语言衔接;
- jdbc可以直接调用数据库存储过程;
- jdbc操作数据库的效率很高;
- 缺点就是不安全,因为你会把数据库的用户名和密码写入代码里,别人可以反编译便可以获取你的数据库信息。