1、环境
- mysql 驱动:8.0.18
- scala版本:2.11
- jdk 版本:1.8
2、项目列表
主要封装了一个查询的方法。
2.1 MysqlUtil.scala
import java.sql.{Connection, DriverManager}
/**
* Created by Feng on 2020/1/14 15:18
* CurrentProject's name is scala
*/
class MysqlUtil(arg: Arguments) {
// 接收构造参数对象
val arguments:Arguments = arg
// 拼接 url
val url:String = new StringBuilder()
.append("jdbc:mysql://")
.append(arguments.ip)
.append(":")
.append(arguments.port)
.append("/")
.append(arguments.dataBaseName)
.append("?serverTimezone=UTC")
.toString()
// 加载驱动
new com.mysql.cj.jdbc.Driver
/**
* 获取连接对象
* @return Connection
*/
def getConnection:Connection = {
DriverManager.getConnection(url, arguments.username, arguments.password)
}
/**
* 关闭连接
* @param connection 连接对象
*/
def close(connection: Connection): Unit = {
if(connection != null || !connection.isClosed){
try {
connection.close()
} catch {
case e:Exception => e.printStackTrace()
}
}
}
}
/**
* 参数封装
* @param ipArgument ip地址
* @param portArgument 端口
* @param dataBaseNameArgument 数据库名
* @param usernameArgument 用户名
* @param passwordArgument 密码
*/
case class Arguments(ipArgument:String,
portArgument:String,
dataBaseNameArgument:String,
usernameArgument:String,
passwordArgument:String)
{
def ip:String = if(ipArgument == null) "localhost" else ipArgument
def port:String = if(portArgument == null) "3306" else portArgument
def dataBaseName:String = if(dataBaseNameArgument == null) "demo2019" else dataBaseNameArgument
def username:String = if(usernameArgument == null) "root" else usernameArgument
def password:String = if(passwordArgument == null) "root" else passwordArgument
}
2.2 DefaultDao.scala
import scala.collection.immutable.HashMap
/**
* Created by Feng on 2020/1/14 16:04
* CurrentProject's name is scala
*/
abstract class DefaultDao {
val util = new MysqlUtil(Arguments(null,null,"demo2019","root","root"))
/**
* 基本查询
* @param sql sql 语句;使用占位符
* @param array 参数列表;注意顺序
* @return 查询结果
*/
protected def baseQuery(sql:String, array: Array[String]): List[Map[String, Any]] ={
val connection = util.getConnection
val ps = connection.prepareStatement(sql)
if(array != null){
for(index <- array.indices){
ps.setObject(index + 1, array(index))
}
}
val result = ps.executeQuery()
var list:List[Map[String, Any]] = List()
while(result.next()){
val meta = result.getMetaData
val count:Int = meta.getColumnCount
var map:Map[String, Any] = new HashMap
for(index <- 1 to count){
val label:String = meta.getColumnLabel(index)
val typeString = meta.getColumnTypeName(index)
if("INT".equals(typeString)){
map = map.+(label -> result.getInt(label))
} else if("BIGINT".equals(typeString)){
map = map.+(label -> result.getLong(label))
} else {
map = map.+(label -> result.getString(label))
}
}
// 将 map 存储在 list
list = list.::(map)
}
// 关闭连接
util.close(connection)
// 返回
list
}
}
2.3 Dao.scala
/**
* Created by Feng on 2020/1/14 15:56
* 特征:访问 mysql 数据库的方法
*/
trait Dao[T] {
/**
* 查询所有信息
* @return List 集合
*/
def query:List[T]
/**
* 查询单个元素
* @return
*/
def queryOne(data:T):T
}
2.4 UserDao.scala
/**
* Created by Feng on 2020/1/14 17:23
* CurrentProject's name is scala
*/
class UserDao extends DefaultDao with Dao [User]{
/**
* 查询所有信息
*
* @return List 集合
*/
override def query: List[User] = {
val sql = "SELECT id, name, password, create_date FROM user"
baseQuery(sql, Array()).map(map => {
User(map.get("name").toString,
map.get("password").toString,
map.get("id"),
map.get("create_date").toString)
})
}
/**
* 查询单个元素
* 通过用户的名字和密码(不能为空)
* @return 目标用户
*/
override def queryOne(user: User): User = {
val sql = "SELECT id, name, password, create_date FROM user WHERE name=? and password=?"
baseQuery(sql, Array(user.name, user.password)).toStream.map(map => {
User(map.get("name").toString,
map.get("password").toString,
map.get("id"),
map.get("create_date"))
}).head
}
}
case class User(name:String, password:String, id:Any, createDate:Any)
2.5 DaoApp.scala 测试
/**
* Created by Feng on 2020/1/14 16:34
* CurrentProject's name is scala
* 测试:
* 从 mysql 查找一条数据,并封装为 User 对象,打印输出
*/
object DaoApp extends DefaultDao with App {
val userDao = new UserDao()
println(userDao.queryOne(User("feng", "12345", 0, 0)))
println("----------")
userDao.query.foreach(println)
}
3、测试结果
User(Some(feng),Some(12345),Some(1),Some(1575853408359))
----------
User(Some(liqian),Some(123456),Some(2),Some(1575853408359))
User(Some(feng),Some(12345),Some(1),Some(1575853408359))
4、数据库表
/*
Navicat Premium Data Transfer
Source Server : MySql
Source Server Type : MySQL
Source Server Version : 80018
Source Host : localhost:3306
Source Schema : demo2019
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 14/01/2020 18:23:20
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`create_date` bigint(13) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'feng', '12345', 1575853408359);
INSERT INTO `user` VALUES (2, 'liqian', '123456', 1575853408359);
SET FOREIGN_KEY_CHECKS = 1;