scala 操作mysql


依賴庫

scala 和 Java 操作mysql一樣,依賴mysql-connector-java

添加依賴庫

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

連接數據庫

//連接mysql
val host="localhost"
val port=3306
val database="test"
val jdbcUrl=s"jdbc:mysql://$host:$port/$database?useUnicode=true&characterEncoding=utf-8"
val mysqlConn: Connection = DriverManager.getConnection(jdbcUrl, "root", "123")

Statement和PreparedStatement

在操作mysql數據庫的時候,有兩個接口,一個是Statement,另一個是PreparedStatement

StatementPreparedStatement都是用於執行SQL語句的句柄,但是PreparedStatement代表的是一個預編譯的SQL。這兩種對象的主要區別體現在以下三個方面

  1. 使用方面的區別:Statement執行的sql語句必須是完整的SQL語句,而對於PreparedStatement來說,可以使用?進行占位。然后使用PreparedStatementsetxxx()方法來給占位符賦值,最后再執行。

  2. 在使用Statement時,如果SQL語句中出現'或者-時,需要使用轉義字符來進行轉義,而在PreparedStatement中,如果使用占位符來進行賦值,當賦值中出現這些符號,PreparedStatement會自動進行轉義。

  3. PreparedStatement會將SQL語句進行預編譯,每次執行的時候只需要將參數設置給相應的占位符就可以運行。而使用Statement時,SQL語句每次都需要編譯一次,所以相對來說PreparedStatment的效率會高一點。

Statement

Statement在執行SQL語句的時候有三個方法:executeQuery,executeUpdate,execute

  • executeQuery:用於產生單個結果集的語句,例如select語句
  • executeUpdate:用於執行insertupdatedeleteSQLDDL(數據定義語言),例如showaltercreatedrop等。executeUpdate 的返回值是一個整數,指示受影響的行數(即更新計數)。對於CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
  • execute:用於執行返回多個結果集、多個更新計數或二者組合的語句

查詢數據

val statement: Statement = mysqlConn.createStatement()
val result: ResultSet =statement.executeQuery("select * from article")
while (result.next()){
  println(result.getInt("title"),result.getString("content"))
}

result.close()
statement.close()

/**
 * 輸出
 * (1,aaa)
 * (2,bbb)
 * (3,ccc)
 * (4,ddd)
 */

在執行完查詢語句的時候返回的是一個ResultSetResultSet返回的實際就是一張數據表,有一個指針指向數據表的第一行的前面,可以調用next()方法檢測下一行是否有效。

若有效該方法返回true,且指針下移,相當於Iterator對象的hasNext()next()方法的結合體,當指針定位到一行時,可以調用getXXX(index)或者getXXX(columName)獲取每一列的值。在使用``getXXX(index)`獲取數據時,索引從1開始。

Statement對象將由 Java 垃圾收集程序自動關閉,ResultSet當然也需要關閉,。而作為一種好的編程風格,應在不需要 Statement對象時顯式地關閉它們。這將立即釋放 DBMS 資源,有助於避免潛在的內存問題。

PreparedStatement

PreparedStatementStatement一樣,擁有executeQuery,executeUpdate,execute三個方法。

PreparedStatement在執行executeQuery等方法的時候不需要傳入sql語句,如果傳入了SQL語句,會隱式調用Statement接口的方法。

查詢數據

val sql="select * from article"

val ps: PreparedStatement = mysqlConn.prepareStatement(sql)
val result: ResultSet =ps.executeQuery()
while (result.next()){
  println(result.getString("title"),result.getString("content"))
}

/**
 * 輸出:
 * (1,aaa)
 * (2,bbb)
 * (3,ccc)
 * (4,ddd)
 */

插入數據

在插入數據的時候,我們可以使用?占位符對sql語句進行預編譯,然后使用setxxx()進行賦值。

在對sql語句中的占位符進行賦值的時候,索引是從1開始的。

val sql="insert into article(title,content) values(?,?)"
val instertPreparedStatement: PreparedStatement =mysqlConn.prepareStatement(sql)
instertPreparedStatement.setString(1,"newtitle")
instertPreparedStatement.setString(2,"newContent")
instertPreparedStatement.executeUpdate()

PrdparedStatement示例完整代碼:

  def main(args: Array[String]): Unit = {

    //連接mysql
    val host="localhost"
    val port=3306
    val database="test"
    val jdbcUrl=s"jdbc:mysql://$host:$port/$database?useUnicode=true&characterEncoding=utf-8"
    val mysqlConn: Connection = DriverManager.getConnection(jdbcUrl, "root", "123")

    //插入數據
    val sql="insert into article(title,content) values(?,?)"
    val instertPreparedStatement: PreparedStatement =mysqlConn.prepareStatement(sql)
    instertPreparedStatement.setString(1,"newtitle")
    instertPreparedStatement.setString(2,"newContent")
    instertPreparedStatement.executeUpdate()

    //查詢數據
    val selectSql="select * from article"
    val selectPreparedStatement: PreparedStatement = mysqlConn.prepareStatement(selectSql)
    val result: ResultSet =selectPreparedStatement.executeQuery()
    while (result.next()){
      println(result.getString("title"),result.getString("content"))
    }
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM