mysql——JDBC
概述
JDBC:java Data Base Connectivity ,java数据库连接,它是一种用于执行sql语句的java API,为多种关系数据库提供统一访问。
其实就是一组用java编写的类和接口。
JDBC API 提供两类主要接口:
1)面向开发人员的java.sql程序包,使得Java程序员能够进行数据库连接,执行SQL查询,并得到结果集合。
2)面向底层数据库厂商的JDBC Drivers。
程序员只需要写一个程序,就可以访问所有的数据库。
提供者:sun公司
内容:
集成在java.sql和javax.sql包下,比如:
DriverManager类:管理各种驱动
Connection接口:数据库连接
Statement接口:发送命令得到结果
等等。。。
JDBC访问数据库步骤
1.加载数据库的驱动程序–
------------Class.forName(“driverName”);
2.建立数据库连接
------------Connection conn=DriverManager.getConnection(String url, String user, String password )
------------url的格式:"jdbc:<JDBC驱动程序名:端口号>:数据源"
------------例子:"jdbc:mysql://localhost:3306/myuser"
3.执行数据库操作SQL
------------Statement stmt = conn.createStatement();
------------ResultSet rs = stmt.executeQuery(sql);
4.得到ResultSet进行结果处理
•5.关闭数据库连接
PreparedStatement类
:是Statement的子接口
•用PreparedStatement类效率会更高。使用PreparedStatement有很多优势,总结如下:
–防止SQL注入攻击(使用占位符“?”)。
–提高SQL的执行性能(在执行之前有预处理)。
–避免使用SQL方言提高JDBC中有关SQL代码的可读性。
简单的写一个例子熟悉大体流程:
花卉类:
-
package pojo;
-
/**
-
* 花卉实体类
-
* @author fan
-
*
-
*/
-
public class Flower {
-
private int id;//编号
-
private String name;//名称
-
private double price;//价格
-
private String prodution;//产地
-
public int getId() {
-
return id;
-
}
-
public void setId(int id) {
-
this.id = id;
-
}
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public double getPrice() {
-
return price;
-
}
-
public void setPrice(double price) {
-
this.price = price;
-
}
-
public String getProdution() {
-
return prodution;
-
}
-
public void setProdution(String prodution) {
-
this.prodution = prodution;
-
}
-
}
对应的mysql:
-
CREATE TABLE `flower` (
-
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',
-
`name` varchar(100) NOT NULL COMMENT '名称',
-
`price` double(10,2) NOT NULL COMMENT '价格',
-
`production` varchar(100) NOT NULL COMMENT '产地',
-
PRIMARY KEY (`id`)
-
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
我们要JDBC完成对所有花卉的读取操作:
-
package dao.impl;
-
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.PreparedStatement;
-
import java.sql.ResultSet;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import com.sun.crypto.provider.RSACipher;
-
import com.sun.java.util.jar.pack.Package.Class;
-
import com.sun.org.apache.regexp.internal.recompile;
-
-
import dao.FlowerDao;
-
import pojo.Flower;
-
-
public class FlowerDaoImpl implements FlowerDao{
-
//查询所有花卉信息
-
@Override
-
public List<Flower> getFlowerInfoDao() {
-
//声明jdbc变量
-
Connection conn=null;
-
PreparedStatement ps=null;
-
ResultSet rs=null;
-
//创建集合
-
List<Flower> lf=null;
-
try {
-
//加载驱动
-
Class.forName("com.mysql.jdbc.Driver");
-
//创建连接对象
-
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ytywan1314");
-
//sql命令
-
String sql="select * from flower";
-
//创建sql命令对象
-
ps=conn.prepareStatement(sql);
-
//给占位符赋值
-
//执行
-
rs=ps.executeQuery();
-
lf=new ArrayList<>();
-
//遍历,封装到对象中
-
while(rs.next()) {
-
Flower f=new Flower();
-
f.setId(rs.getInt("id"));
-
f.setName(rs.getString("name"));
-
f.setPrice(rs.getDouble("price"));
-
f.setProdution(rs.getString("production"));
-
lf.add(f);
-
}
-
-
} catch (Exception e) {
-
e.printStackTrace();
-
}finally {
-
//关闭资源
-
rs.close();
-
ps.close();
-
conn.close();
-
}
-
//返回
-
return lf;
-
}
-
-
}
util
我们发现,增删改其实都差不多,我们写的时候都是把其中一个的代码拿来改一改,并且打开啊关闭啊这些操作也类似,所以我们要把操作们都得封装到一个类里,需要时直接传入sql语句还有参数调用即可。
-
public class BaseDao {
-
private static String driver = "com.mysql.jdbc.Driver"; //数据库驱动字符串
-
private static String url ="jdbc:mysql://localhost:3306/jeep";
-
private static String user ="sa"; //用户名
-
private static String password =""; //密码
-
-
protected Connection conn;
-
protected PreparedStatement pstmt;
-
protected java.sql.ResultSet rs;
-
/**
-
*
-
* 获取数据库连接对象
-
*/
-
public Connection getConnection(){
-
Connection conn = null; //数据库连接对象
-
//获取连接并捕捉异常
-
try {
-
Class.forName(driver);
-
conn = DriverManager.getConnection(url,user,password);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return conn; //返回连接对象
-
}
-
/**
-
*
-
* 关闭数据库连接
-
*/
-
public void closeAll(Connection conn, Statement stmt, java.sql.ResultSet rs){
-
//若结果集对象不为空,则关闭
-
if (rs !=null){
-
try {
-
rs.close();
-
} catch (Exception e){
-
e.printStackTrace();
-
}
-
}
-
//若Statement对象不为空,则关闭
-
if (stmt !=null){
-
try {
-
stmt.close();
-
} catch (Exception e){
-
e.printStackTrace();
-
}
-
}
-
//若数据库连接对象不为空,则关闭
-
if (conn !=null){
-
try {
-
conn.close();
-
} catch (Exception e){
-
e.printStackTrace();
-
}
-
}
-
}
-
/**
-
* 增删改
-
*/
-
public int exceuteUpdate(String sql,Object...prams){
-
int result = 0;
-
//获取连接
-
conn = this.getConnection();
-
try {
-
pstmt = conn.prepareStatement(sql);
-
for (int i=0;i<prams.length;i++){
-
pstmt.setObject(i+1, prams[i]);
-
}
-
result = pstmt.executeUpdate();
-
} catch (SQLException e){
-
e.printStackTrace();
-
} finally {
-
//关闭资源
-
closeAll(conn,pstmt,rs);
-
}
-
return result;
-
}
-
}
properties
对于常量信息,如果每次都修改代码无疑是痛苦的事,所以我们可以提取出相应的配置文件。
比如:dbinfo.properties文件内容:
-
db.driver=com.mysql.jdbc.Driver
-
db.connectUrl=jdbc:mysql://127.0.0.1:3306/myqq_db?useUnicode=true&characterEncoding=UTF-8
-
db.user=root
-
db.pwd=
java:
-
private static Properties dbProps = new Properties();
-
InputStream is = DBUtil.class.getResourceAsStream("/dbinfo.properties");
-
dbProps.load(is);
-
Class.forName(dbProps.getProperty("db.driver"));
之后我们连接时就可以根据文件的记录来取值了。
-
public static Connection getCon() {
-
try {
-
return DriverManager.getConnection(
-
dbProps.getProperty("db.connectUrl"),
-
dbProps.getProperty("db.user"),
-
dbProps.getProperty("db.pwd"));
-
}catch(Exception e) {
-
e.printStackTrace();
-
return null;
-
}
-
}
JDBC知识积累
1、数据连接池的工作机制?
考察点:连接池
参考回答:
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。
原文链接:fantianzuo.blog.csdn.net/article/details/91491021
- 点赞
- 收藏
- 关注作者
评论(0)