java连接数据库(Driver、url、user、password、Connection、Statement、sql(String)、RusultSet)
文章目录
以往数据库插入为例,下面是一种比较直接的方式
/**
* 插入一"学生"。
*
* @param student
* @return
* @throws Exception
*/
public int insertStudent1(Student student) throws Exception {
int ret = 0;
// 连接数据库的配置。
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "123456";
// 引入mysql的驱动类
Class.forName(driver);
// 拿到数据库的连接。
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
// 插入学生
String sql = "INSERT INTO student(`name`, age, telephone) VALUES (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置参数
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getAge());
pstmt.setString(3, student.getTelephone());
// 执行插入
ret = pstmt.executeUpdate();
// 关闭资源
pstmt.close();
conn.close();
return ret;
}
public static void main(String[] args) throws Exception {
StudentDao dao = new StudentDao();
Student s1 = new Student("yelistening", 18, "123456789012");
dao.insertStudent1(s1);
}
简单介绍一下各个属性
一、driver(驱动)—数据库的连接工具(包装数据给数据库,解析数据给使用者)
//MySql
"com.mysql.jdbc.Driver"//固定格式
//sql
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdk没有直接访问数据库的能力,但它提供了一些接口,比如connection接口,功能具体的实现由各个数据库的驱动jar包来完成,
另外数据库的驱动jar包是通过,Class.forDriver(driver),和jdk相关的数据库访问类,接口勾搭的。
1)数据库驱动的三种连接方式
//数据库驱动的加载-方式1
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
//数据库的驱动加载-方式2 可以加载多个驱动
System.setProperty("jdbc.drivers","com.mysql.cj.jdbc.Driver");// 加载数据库驱动
//数据库的驱动加载-方式3
new com.mysql.cj.jdbc.Driver();
加载完驱动后就是连接数据库了
二、connection conn 有两种方式来连接
//方法1
Connection conn = DriverManager.getconnection(url)
//方法2
// 获取数据源
DataSource datesource = new MysqlDataSource();
//设置url
((MysqlDataSource) datesource ).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) datesource ).setUser("root");
((MysqlDataSource) datesource ).setPassword("123456");
//建立连接
Connection connection = datesource .getConnection();
这里面有 url
三、String url
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
jdbc:mysql://[host:port]/[database][?参数名1][=参数值1][&参数名2][=参数值2]...
==常用的两种==
useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk。
characterEncoding 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk
连接完成后就要开始sql语句的编译和执行了
当然sql语句也要写啦
String sql = "INSERT INTO student(`name`, age, telephone) VALUES (?, ?, ?)"
四、PrepareStatement 、Statement
关于两者的区别 PrepareStatement 的对象有预编译能力。
而Statement的对象没有。
预编译是指:PrepareStatement对set/get[String][int][…]先预处理 再一次性执行(效率高)
而Statement则是编译 一条,执行一条。
两者都是通过Connection对象的createStatement方法创建Statement或PrepareStatement对象,executeQuery() 执行。
//PrepareStatement方法
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置参数
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getAge());
pstmt.setString(3, student.getTelephone());
// 执行插入
ret = pstmt.executeUpdate();
//Stetement 方法
Statement stmt;
ResultSet rs;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT* FROM goods");//SQL查询语句
while (rs.next()) {
String number = rs.getString(1);
String name = rs.getString(2);
Date date = rs.getDate(3);
float price = rs.getFloat(4);
}
conn.close();
stmt.close();
rs.close();
} catch (SQLException e) {
System.out.println(e);
}
再就是关闭资源了
五、close();//关闭资源
pstmt.close();
conn.close();
rs.close();
事实上我们最开始的代码还是存在问题,有一部分是每次插入一个学生对象都要初始化的,我们的String driver、String url、String user、 String password以及关闭资源close() 咋办嘛? JDBCUilts是个不错的东西
六、JDBCUilts
public class JdbcUtils {
/**
* 驱动
*/
private static String driver = "com.mysql.jdbc.Driver";
/**
* 数据库的URL
*/
private static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
/**
* 数据库的用户名
*/
private static String user = "root";
/**
* 数据库的密码。
*/
private static String password = "";
/**
* 静态代码块:它只执行一次。
*/
static {
// 只加载一次,用于节省时间。
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库的连接。
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 我们按照顺序关闭各种资源:ResultSet -> Statement -> Connection
* @param re
* @param stmt
* @param conn
*/
public static void closeReource(ResultSet rs, Statement stmt, Connection conn) {
try {
if(rs != null) {
// close ResultSet
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
事实上我们插入学生也不会是”一个一个“插入 也许直接来一串呢!!! 并且connection
连接数据库连接一次就够了不需要每次都连接 那么它就可以被放到静态代码块里面
public int[] insertStudentBatch(List<Student> students) {
int rets[] = null;
PreparedStatement pstmt = null;
try {
// 获取数据库的连接。
// conn = JdbcUtils.getConnection(); // 不需要数据库连接。
String sql = "INSERT INTO student(name, age, telephone) VALUES (?, ?, ?)";
pstmt = conn.prepareStatement(sql);
for(Student student : students) {
// 设置参数
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getAge());
pstmt.setString(3, student.getTelephone());
// 添加批处理
pstmt.addBatch();
}
// 执行批处理
rets = pstmt.executeBatch();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.closeReource(null, pstmt, null);
}
return rets;
}
七、总结
参考的博客和csdn如下 -> Thank You!!!
https://blog.youkuaiyun.com/weixin_45062761/article/details/104510644
https://www.cnblogs.com/andong2015/p/4305756.html
https://www.cnblogs.com/thaipine/p/11634772.html
https://blog.youkuaiyun.com/yuiop123455/article/details/107206171