一.连接数据库mysql大致需要这六步:
1.导入驱动包:这里我使用的是mysql-connector-java-8.0.17.jar。
2.url和账户名密码:jdbc:mysql://<地址>:<端口>/<数据库>
3.获取连接:DriverManager.getConnection(url,user,pwd);
4.执行sql的Statement对象:connection.createSatement();
5.执行sql语句
6.释放连接
package com.ZhuanZhuan.DAL.Mysql;
import com.ZhuanZhuan.DAL.Dao.jiaoYiDao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class MySql_jiaoYi_Dao implements jiaoYiDao{
private static String url;
private static String user;
private static String pwd;
private static String driver;
static {
initProperties();
}
//配置连接数据库的属性
private static void initProperties(){
//读取properties 文件的对象
Properties properties = new Properties();
//创建一个输入流,=当前类获取类加载后获取指定文件的输入流
//当前类名.class => 获取当前对象所属的class对象
//getClassLoader() => 获取该class对象的装载器,返回 ClassLoader类
//类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,所以通过它可以得到一个文件的输入流。
InputStream is = MySql_jiaoYi_Dao.class.getClassLoader().getResourceAsStream("db.properties");
try{
//加载properties文件里的信息,使用properties加载输入流的信息,
properties.load(is);
}catch (Exception e){
System.out.println(e.getMessage());
}
url=properties.getProperty("url");
user=properties.getProperty("user");
pwd=properties.getProperty("pwd");
driver=properties.getProperty("driver");
}
//打开连接
public Connection openCon(){
//数据库连接对象,这个对象封装了连接整个数据库信息的用户的各种信息
Connection con = null;
try{
//加载驱动程序
Class.forName(driver);
//连接到具体的数据库的方法
con = DriverManager.getConnection(url,user,pwd);
}catch (Exception e){
System.out.println(e.getMessage());
}
return con;
}
//关闭连接
public void colseCon(Connection con, PreparedStatement pst,ResultSet rs){
try{
if (rs!=null)rs.close();
if (pst!=null)pst.close();
if (con!=null)con.close();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
//增删改
@Override
public int upDate(String sql,Object[] canSHu) {
int jg =0;
Connection con = openCon();
try{
//prepareStatement()会预先提交带占位符的sql到数据库进行预处理,提前生成执行计划。
//当给定占位符参数真正执行sql时,执行引擎可以直接执行,效率更高一点。
PreparedStatement pst = con.prepareStatement(sql);
if (canSHu != null){
for(int i=0;i<canSHu.length;i++){
//给sql语句传入参数
pst.setObject(i+1,canSHu[i]);
}
}
//该方法用于执行sql语句,返回影响行数。
jg = pst.executeUpdate();
colseCon(con,pst,null);
}catch (Exception e){
System.out.println(e.getMessage());
}
return jg;
}
//查询
@Override
public ResultSet query(String sql,Object[] canShu) {
//结果集对象
ResultSet rs = null;
Connection con = openCon();
try{
PreparedStatement pst = con.prepareStatement(sql);
if (canShu != null){
for (int i=0;i<canShu.length;i++){
pst.setObject(i+1,canShu[i]);
}
}
rs = pst.executeQuery();
//在这里关闭rs后,不能执行在逻辑层不能获取数据
//colseCon(con,pst,rs);
}catch (Exception e){
System.out.println(e.getMessage());
}
return rs;
}
}
在上面代码中执行sql语句的是PreparedStatement对象,也可以使用Statement对象该区别:
- preparedStatement在使用时只需编译一次,就可以运行多次,Statement每运行一次就编译一次,所以preparedStatement的效率更高
- preparedStatement需要的sql语句为用?(占位符)来替换,Statement所需要的sql语句为字符串拼接
- preparedStatement解决了sql注入的问题,Statement没有解决,因为preparedStatement有一个预编译的过程
下面这个是properties文件。储存连接数据库的配置信息。
properties文件是一种属性文件,这种文件以key=value格式存储内容。Java中可以使用Properties类来读取这个文件,
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jiaoYi_u?serverTimezone=GMT-8
user=root
pwd=2004
这里的pwd是自己的密码,除了user外其他的都要改,根据自己电脑文件存放的路劲或数据库名。