Skip to content
Snippets Groups Projects
SqlSerializer.scala 3.45 KiB
Newer Older
  • Learn to ignore specific revisions
  • package de.tobias.playpad.server.sql
    
    import java.sql.{Connection, ResultSet}
    import java.util.UUID
    
    class SqlSerializer {
    
        def queryObj[T](clazz: Class[T], key: UUID, connection: Connection, keyName: String = null): T = {
            val obj = clazz.newInstance()
            if (clazz.isAnnotationPresent(classOf[Table])) {
                val table = clazz.getAnnotation(classOf[Table]).value()
    
                val columnName = if (keyName != null) {
                    keyName
                } else {
                    getKeyName(clazz)
                }
    
                val stmt = connection.prepareStatement(s"SELECT * FROM $table WHERE $columnName = ?")
                stmt.setString(1, key.toString)
                val result = stmt.executeQuery()
    
                if (result.first()) {
                    clazz.getDeclaredFields
                        .filter(f => f.isAnnotationPresent(classOf[ColumnName]))
                        .foreach(f => {
                            f.setAccessible(true)
                            f.set(obj, result.getObject(f.getAnnotation(classOf[ColumnName]).value()))
                        })
                }
    
                result.close()
                stmt.close()
            }
            obj
        }
    
        private def getKeyName[T](clazz: Class[T]): String = {
            val field = clazz.getDeclaredFields
                .filter(f => f.isAnnotationPresent(classOf[ColumnName]))
                .find(f => f.isAnnotationPresent(classOf[Id]))
    
            if (field.isDefined) {
                field.get.getAnnotation(classOf[ColumnName]).value()
            } else {
                null
            }
        }
    
        //	def queryObj[T](clazz: Class[T], key: UUID, connection: Connection, keyName: String): List[T] = {
        //		if (clazz.isAnnotationPresent(classOf[Table])) {
        //			val table = clazz.getAnnotation(classOf[Table]).value()
        //
        //			val stmt = connection.prepareStatement(s"SELECT * FROM $table WHERE $keyName = ?")
        //			stmt.setString(1, key.toString)
        //			val result = stmt.executeQuery()
        //
        //			val list = getResult(clazz, result)
        //
        //			result.close()
        //			stmt.close()
        //			list
        //		} else {
        //			null
        //		}
        //	}
    
        def queryObj[T](clazz: Class[T], connection: Connection): List[T] = {
            if (clazz.isAnnotationPresent(classOf[Table])) {
                val table = clazz.getAnnotation(classOf[Table]).value()
    
                val stmt = connection.prepareStatement(s"SELECT * FROM $table")
                val result = stmt.executeQuery()
    
                val list = getResult(clazz, result)
    
                result.close()
                stmt.close()
                list
            } else {
                null
            }
        }
    
        private def getResult[T](clazz: Class[T], result: ResultSet): List[T] = {
            var list = List[T]()
            while (result.next()) {
                val obj = clazz.newInstance()
                clazz.getDeclaredFields
                    .filter(f => f.isAnnotationPresent(classOf[ColumnName]))
                    .foreach(f => {
                        f.setAccessible(true)
    
                        if (f.getType.equals(classOf[UUID])) {
                            f.set(obj, UUID.fromString(result.getString(f.getAnnotation(classOf[ColumnName]).value())))
                        } else {
                            val column = f.getAnnotation(classOf[ColumnName])
                            val columnName = column.value()
                            f.set(obj, column.handler().newInstance().fromResult(result.getObject(columnName)))
                        }
    
                    })
                list = obj :: list
            }
            list
        }
    }