JDBC基础
?serverTimezone=UTC//设置时区<The server time zone value 'ä¸å½æ åæ¶é´' is unrecognized or represents more than one time zone>
net stop mysql//mysql关闭指令
net start mysql//mysql开启数据库指令
java连接数据库使用JDBC
java.sql.,javax.sql.这两个包只是接口类
1. java连接数据库:
1.1. 构建连接
-
注册驱动
-
确定对岸目标
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("注册驱动成功!");
} catch (ClassNotFoundException e1) {
System.out.println("注册驱动失败!");
e1.printStackTrace();
}
String url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
Connection conn = null;
//构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url, "root", "1234567");
1.2. 执行操作
- 使用Statement语句:
- executeQuery()执行select语句,返回结果放在ResultSet
- 使用executeUpdate()执行insert/update/delete,返回修改的行数
- 一个statement对象一次只能执行一个命令
- 返回结果集
Statement stmt = conn.createStatement();
System.out.println("创建Statement成功!");
ResultSet rs = stmt.executeQuery("select bookname from t_book order by bookid");
Statement stmt = conn.createStatement();
System.out.println("创建Statement成功!");
//执行SQL语句
int result = stmt.executeUpdate(sql);
1.3. 释放连接
Connection.close();//关闭
rs.close();//关闭结果集
stmt.close();//关闭语句
import java.sql.*;
public class SelectTest {
public static void main(String[] args){
//构建Java和数据库之间的桥梁介质
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("注册驱动成功!");
}catch(ClassNotFoundException e1){
System.out.println("注册驱动失败!");
e1.printStackTrace();
return;
}
String url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
Connection conn = null;
try {
//构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url, "root", "1234567");
//构建数据库执行者
Statement stmt = conn.createStatement();
System.out.println("创建Statement成功!");
//执行SQL语句并返回结果到ResultSet
ResultSet rs = stmt.executeQuery("select bookid, bookname, price from t_book order by bookid");
//开始遍历ResultSet数据
while(rs.next())
{
System.out.println(rs.getInt(1) + "," + rs.getString(2) + "," + rs.getInt("price"));
}
rs.close();
stmt.close();
} catch (SQLException e){
e.printStackTrace();
}
finally
{
try
{
if(null != conn)
{
conn.close();
}
}
catch (SQLException e){
e.printStackTrace();
}
}
}
}
2. JDBC事务处理
关闭自动提交,实现多语句同一事务
- connection.setAutoCommit(false);关闭自动提交
- connection.commit();提交事务
- connection.rollback();回滚事务,如果被提交就不可以回滚。
- 保存点机制
- connection.setSavepoint();
- connection.roolback(Savepoint);
// 构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url, "root", "1234567");
conn.setAutoCommit(false);
insertBook(conn, "insert into t_book values(101, 'aaaa', 10)");
insertBook(conn, "insert into t_book values(102, 'bbbb', 10)");
insertBook(conn, "insert into t_book values(103, 'cccc', 10)");
Savepoint phase1 = conn.setSavepoint(); //设置一个保存点
insertBook(conn, "insert into t_book values(104, 'cccc', 10)");
insertBook(conn, "insert into t_book values(105, 'cccc', 10)");
conn.rollback(phase1); //回滚到phase1保存点,即上面2行无效
conn.commit();
3. PreparedStatement(预编译)
PreparedStatement是Statement接口的子接口,其实现在JDBC驱动类中, 属于预处理操作,与直接使用Statement不同,PreparedStatement在操作时,是预先在数据表中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后在进行设置。
- 可以更为安全的执行SQL,防止注入攻击
- 防止繁琐的字符串拼接和
- 直接设置对象而不需要转换为字符串
- PreparedStatement使用预编译速度相对Statement快的多
3.1 常用方法
1:executeQuery():在此PreparedStatement对象中执行SQL语句,并返回该查询生成的ResultSet对象。
2:executeUpdate():在此PreparedStatement对象中执行SQL语句,该语句必须是一个SQL数据操作语言(Date Manipulation Language,DML)语句,比如insert、update、delete语句;或者是无返内容的SQL语句,比如DDL语句。
3:execute():在此PreparedStatement对象中执行SQL语句,该语句可以是任何种类的SQL语句。
4:getMetaData():获取包含有关ResultSet对象列信息的ResultSetMetaData对象,ResultSet对象将在此执行PreparedStatement对象时返回。
5:getParameterMetaData():获取此PreparedStatement对象的参数的编号、类型和属性。
注意:
- 注意sql语句的空格,SQL语句换行加空格
- 使用?时应注意设置参数
//使用setstring()时字符串不用加单引号
/////////////////////////////////////数据库插入语句/////////////////////////////////
String sql = "insert into t_book(bookid,bookname,price) values(?,?,?)";
//构建数据库执行者
PreparedStatement pstmt = conn.prepareStatement(sql);
//执行SQL语句
int bookid = 10;
String bookName = "Effective Java";
int price = 50;
pstmt.setInt(1, bookid);
pstmt.setString(2, bookName);
pstmt.setInt(3, price);
int result = pstmt.executeUpdate();
////////////////////////////////////数据库模糊查询语句//////////////////////////////////////
String sql = " select * from mall where name like ? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"%"+s+"%");
ResultSet resultSet = preparedStatement.executeQuery();
/////////////////////////////////////数据库查询语句//////////////////////////////////////////
String sql = " select * from mall where name =? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,s);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
Shopping shopping = new Shopping();
shopping.setId(resultSet.getInt(1));
shopping.setName(resultSet.getString(2));
shopping.setTime(resultSet.getString(3));
stringArrayList.add(shopping);
}
////////////////////////////////////数据库删除语句///////////////////////////////////////////
String sql = "" +
" delete from mall " +
" where id=? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,i);
preparedStatement.execute();
////////////////////////////////////数据库插入语句////////////////////////////////////////////
String sql = "" +
"insert into mall" +
"(id,name,time)" +
"values(?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,shop.getId());
preparedStatement.setString(2,shop.getName());
preparedStatement.setString(3,shop.getTime());
preparedStatement.execute();
/////////////////////////////////////数据库更新语句///////////////////////////////////////////
String sql = "" +
" update mall " +
" set name=?,time=? " +
" where id=? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,shop.getName());
preparedStatement.setString(2,shop.getTime());
preparedStatement.setInt(3,shop.getId());
preparedStatement.executeUpdate();
批量提交数据
//构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url, "root", "123456");
String sql = "insert into t_book(bookid,bookname,price) values(?,?,?)";
//构建数据库执行者
PreparedStatement pstmt = conn.prepareStatement(sql);
//执行SQL语句
String bookName = "aaaaaaaaaaaaaaaa";
int price = 50;
//values(1, 'Effective Java', 50)
for(int i=200;i<210;i++)
{
pstmt.setInt(1, i);
pstmt.setString(2, bookName);
pstmt.setInt(3, price);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
4. ResultSet(语句返回结果集)
查询数据库时,返回的是一个二维的结果集,需要用到ResultSet来遍历结果集,获取每一行的数据。
-
ResultSet.next():ResultSet游标最初位于第一行之前,也就是第0行;第一个对方法的调用接下来使第1行成为当前行。
-
使用这个方法进行时,判断这一位是否有值如果有值返回true,没有值返回false,如果为true将游标向下移一位。
-
ResultSet.getString(columnlabel),或者getString(columnindex),可以传入返回结果集的序号顺序或者数据库列名
5. ResultSetMetaData
可以获取resultset返回的属性(如,每一行的名字类型),使用ResultSetMetaData解析ResultSet:
- getColumnCount(),返回结果的列数
- getColumnClassName(i),返回第i列的数据的java类名
- getColumnTypeName(i),返回第i列的数据库类型名称
- getColumnType(i),返回第I列的SQL类型
//构建Java和数据库之间的桥梁:URL,用户名,密码
conn = DriverManager.getConnection(url, "root", "123456");
//构建数据库执行者
Statement stmt = conn.createStatement();
System.out.println("创建Statement成功!");
//执行SQL语句并返回结果到ResultSet
ResultSet rs = stmt.executeQuery("select bookid, bookname, price from t_book order by bookid");
//获取结果集的元数据
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
for(int i=1;i<=cols;i++)
{
System.out.println(meta.getColumnName(i) + "," + meta.getColumnTypeName(i));
}
rs.close();
stmt.close();