依賴庫
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
Statement
和PreparedStatement
都是用於執行SQL語句
的句柄,但是PreparedStatement
代表的是一個預編譯的SQL。這兩種對象的主要區別體現在以下三個方面:
-
使用方面的區別:
Statement
執行的sql語句必須是完整的SQL語句,而對於PreparedStatement
來說,可以使用?
進行占位。然后使用PreparedStatement
的setxxx()
方法來給占位符賦值,最后再執行。 -
在使用
Statement
時,如果SQL語句中出現'
或者-
時,需要使用轉義字符來進行轉義,而在PreparedStatement
中,如果使用占位符來進行賦值,當賦值中出現這些符號,PreparedStatement會自動進行轉義。 -
PreparedStatemen
t會將SQL語句進行預編譯,每次執行的時候只需要將參數設置給相應的占位符就可以運行。而使用Statement
時,SQL語句每次都需要編譯一次,所以相對來說PreparedStatment
的效率會高一點。
Statement
Statement在執行SQL語句的時候有三個方法:executeQuery
,executeUpdate
,execute
- executeQuery:用於產生單個結果集的語句,例如select語句
- executeUpdate:用於執行
insert
、update
、delete
以SQLDDL
(數據定義語言),例如show
,alter
,create
,drop
等。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)
*/
在執行完查詢語句的時候返回的是一個ResultSet
,ResultSet
返回的實際就是一張數據表,有一個指針指向數據表的第一行的前面,可以調用next()
方法檢測下一行是否有效。
若有效該方法返回true,且指針下移,相當於Iterator對象的hasNext()
和next()
方法的結合體,當指針定位到一行時,可以調用getXXX(index)
或者getXXX(columName)
獲取每一列的值。在使用``getXXX(index)`獲取數據時,索引從1開始。
Statement
對象將由 Java 垃圾收集程序自動關閉,ResultSet當然也需要關閉,。而作為一種好的編程風格,應在不需要 Statement對象時顯式地關閉它們。這將立即釋放 DBMS 資源,有助於避免潛在的內存問題。
PreparedStatement
PreparedStatement
和Statement
一樣,擁有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"))
}
}