Mysql jdbc 连接数据库
- statement方式
- 1.注册驱动
2.建立连接
3.获取执行者平台
4.准备sql语句
5.执行sql语句,返回结果集
6.处理结果集
7.释放资源
@Test
public void run(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from student;";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("name")+" -- "+rs.getString("age"));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Oracle
@Test
public void run(){
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from emp";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("ename")+" -- "+rs.getInt("deptno"));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
- prepareStatements方式
- 1.注册驱动
2.建立连接
3.准备sql语句
4.获取预处理执行者平台
5.将需要操作的信息设置到ptmt
6.执行sql语句
*7.释放资源
@Test
public void run1(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from student where id = ?;";
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setString(1, "4");
ResultSet rs = ptmt.executeQuery();
/*int i = ptmt.executeUpdate();
if(i == 1){
System.out.println("查询成功");
System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
}else{
System.out.println("查询失败");
}*/
while(rs.next()){
System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
}
rs.close();
ptmt.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Oracle
@Test
public void run1() throws Exception{
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from emp";
PreparedStatement ptmt = conn.prepareStatement(sql);
ResultSet rs = ptmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("empno")+"+"+rs.getString("ename")+"+"+rs.getString("job"));
}
rs.close();
ptmt.close();
conn.close();
}
QueryRunner操作对象
插入数据
public void insert() throws SQLException {
// 1. 获取 Connection 连接对象
// Connection conn = DataBaseUtils.getDataBaseConnection();
// 2. 创建 QueryRunner 操作对象
// 在调用 QueryRunner() 方法的时候,需要传入一个 dataSource 数据源
// dataSource 数据源 到底是一个什么东西?
// 简单理解,就是需要操作的数据库中的数据 DataSource
// 在 DataBaseUtils 工具类中,通过 getDataBaseConnection() 已经将数据库资源获取了
QueryRunner qr = new QueryRunner();
// 3. 准备 SQL
String sql = "insert into tb_student(username, password) values (?, ?)";
// 4. 给占位符进行赋值
Object[] params = { "hello", 123 };
// 5. 执行操作
int i = qr.execute(conn, sql, params);
// 也可以使用 update() 方法进行操作,update() 方法可以同时操作 insert、update、delete
// int i = qr.update(conn, sql, params);
System.out.println(i);
// 5. 释放资源
DbUtils.close(conn);
}
更新数据
public void update() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "update tb_student set username = ?, password = ? where id = ?";
Object[] params = { "温老板", 250, 3};
int i = qr.execute(conn, sql, params);
System.out.println(i);
// 5. 释放资源
DbUtils.close(conn);
}
删除数据
public void delete() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "delete from tb_student where id = ?";
int i = qr.execute(conn, sql, 5);
DbUtils.close(conn);
}
DateBaseUtils工具类
public class DataBaseUtils {
public DataBaseUtils(){
super();
}
private static Connection conn;
// 如果将注册和获取连接对象放到一个方法中的话,其实不好,因为想要用到它们的时候必须要先调用方法才行。
// 而每次调用方法,都要重新注册一次,获取一次新的连接对象,对性能消耗太大
// 疑问:能不能只要去注册一次,只要有一个连接对象就可以?
static {
try {
// 1. 注册驱动(老司机)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接对象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true ",
"root", "root");
} catch (Exception e) {
e.printStackTrace();
}
}
// 1. 获取数据库连接
public static Connection getDataBaseConnection(){
return conn;
}
// 2. 关闭资源
public static void closeResource(Connection conn , Statement stmt, ResultSet rs){
// 注意,在关闭之前,要判断所操作的资源不能是 null,否则报 NullPointerException 异常
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeResource(Connection conn , Statement stmt){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeResource(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
commons.dbutils.QueryRunner query方法中RequestSetHandler 参数对应的返回类型:
AbstractListHandler -- 返回多行List的抽象类
ArrayHandler -- 返回一行的Object[]
ArrayListHandler -- 返回List,每行是Object[]
BeanHandler -- 返回第一个Bean对象
BeanListHandler -- 返回List,每行是Bean
ColumnListHandler -- 返回一列的List
KeyedHandler -- 返回Map,具体见代码
MapHandler -- 返回单个Map
MapListHandler -- 返回List,每行是Map
ScalarHandler -- 返回列的头一个值
apache.commons.dbutils.QueryRunner.query方法的handler参数
第一次用apache.commons.dbutils.QueryRunner访问数据库的人会有一个疑问..
String url = "jdbc:mysql://localhost:3306/test";
Connection con = DriverManager.getConnection(url, "root", "pwd");
String sql = "select * from myTable";
QueryRunner qr = new QueryRunner();
qr.query(con, sql, handler); //con是数据库连接, sql是查询语句, handler是什么?
QueryRunner.query方法的返回值是一个Object对象,该Object对象保存着从数据库获取的数据,
它的类型(可显式转换的类型)是由调用query方法时的handler参数决定的.
ResultSetHandler handler = new ArrayHandler();
Object obj = qr.query(con, sql, handler);
Object[] arr = (Object[])obj;
ResultSetHandler handler = new ArrayListHandler();
Object obj = qr.query(con, sql, handler);
List list = (List)obj;
也就是说,保存数据的Object对象的显式转换类型是由handler参数决定的.