学习scala:操作 mysql查询数据

1、环境

  1. mysql 驱动:8.0.18
  2. scala版本:2.11
  3. 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;


发布了108 篇原创文章 · 获赞 117 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/FBB360JAVA/article/details/103977733