1.1Java使用JDBC原生方式连接MySql数据库
前言:今天有朋友问我原生的java连接数据库,因为框架的使用,如果基础不牢固的人,是很容易遗忘原生的连接方式。今天正好趁此做一下回顾:
这里只考虑原生方式,框架就不在这里细说。
一、先大体搞清楚连接时,常用元素都是什么作用:
在MySQL的官方文档中,这样解释说到:
-
java.sql.Driver 它在MySQL Connector / J 中实现的类的名称 是 com.mysql.jdbc.Driver,也就是驱动程序。你可以把它理解为发动机,没了它,其他都没扯。
-
URL 有了发动机之后,你要开始利用它的力量,也就是为它指明前进的方向,而URL就是它的方向。
值得一提的是,目前连接URL的通用格式是这样的:
protocol//[hosts][/database][?properties]
protocol:一种连接协议,约定的规则。
hosts:主机名,通常后跟端口号,例如当前主机默认就是localhost:3306,当然也可以多主机连接,这里暂时不表。
database:数据库嘛
其实应用测试时也就是这样的:
jdbc:mysql://localhost:3306/test
- username 数据库连接的用户名
passowrd 连接密码 - Connection 与数据库建立连接关系,通常为 DriverManager.getConnection(url, username, password)。这里可以很明显的感觉出来,每个元素所产生的作用。
- Statement / PreparedStatement ,需要特别注意的是,我们提倡使用后者,也就是预编译语句。
PreparedStatement好处:
简化Statement中的操作
提高执行语句的性能
可读性和可维护性更好
在代码示例中,语法会详细体现。 - 有了PreparedStatement语句之后,我们可以采用以下语句进行执行:
executeQuery(String) 查询
executeUpdate(String SQL) 更新数据
execute(String SQL) 如果你不知道是查询还是修改,可以使用这个语句
二、示例代码及注释
准备:
首先要导入mysql-connector-java 的jar包
其次,在数据库中准备如下格式的表:
之后写基本的连接代码
为了实现代码的重用,我对两个基本方法添加和查询进行封装:
这是接口:(User类可自行写入)
public interface UserDao {
public void add(User user);
public User findByUsername(String username);
}
下面是实现类:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.bang.user.domain.User;
public class JdbcUserDao implements UserDao {
@Override
public void add(User form) {
String driverClassName = "com.mysql.jdbc.Driver"; //启动驱动
String url = "jdbc:mysql://localhost:3306/test"; //设置连接路径
String username = "root"; //数据库用户名
String password = "123"; //数据库连接密码
Connection con = null; //连接
PreparedStatement pstmt = null; //使用预编译语句
ResultSet rs = null; //获取的结果集
try {
Class.forName(driverClassName); //执行驱动
con = DriverManager.getConnection(url, username, password); //获取连接
String sql = "INSERT INTO USER VALUES(?,?,?,?)"; //设置的预编译语句格式
pstmt = con.prepareStatement(sql);
pstmt.setString(1, form.getUsername());
pstmt.setString(2, form.getPassword());
pstmt.setInt(3, form.getAge());
pstmt.setString(4, form.getGender());
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
//关闭资源,倒关
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close(); //必须要关
} catch (Exception e) {
}
}
}
@Override
public User findByUsername(String username) {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String mysqlusername = "root";
String password = "123";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName(driverClassName);
con = DriverManager.getConnection(url, mysqlusername, password);
String sql = "SELECT * FROM USER WHERE username=?";
pstmt = con.prepareStatement(sql);
pstmt.setNString(1, username);
rs = pstmt.executeQuery();
if(rs == null) {
return null;
}
if(rs.next()) {
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setAge(rs.getInt("age"));
user.setGender(rs.getString("gender"));
return user;
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
//关闭资源,倒关
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close(); //必须要关
} catch (Exception e) {
}
}
}
}
开始进行测试
这时候我们去数据库中查看:
其中验证码我简单使用的一个类引入的。
资料引导:
MySQL官方文档