slick for play 使用原生sql查询以及拼接sql

在play中用函数式框架slick来操作数据库是一件很爽的事情。但有时因为某些特殊场景又不得不用原生的sql了。 还好slick支持这种写法,可以看看slick官方文档,Slick Plain SQL queries

http://slick.lightbend.com/doc/3.1.1/sql-to-slick.html#slick-plain-sql-queries

 

下面说说我的场景,我的一个系统中有一个表格,由于用这个系统的也都是技术人员,为了方便就直接在表格上面开放了一个sql查询框,用来做条件筛选。 当用户录入sql where后面的条件后,需要把条件拼接到sql后面,这是就要用到slick的原生sql执行方式了。

代码如下:

implicit val getHostResult = GetResult(r => Host(r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<, r.<<))

def queryForList(condition: String): Future[Seq[Host]] = db.run((sql"select * from ops_host where 1=1 #$condition".as[Host]))

需要注意的是getHostResult非常重要,它用来转换sql查询返回的结果的,如果不定义getHostResult,那么结果就没法解析,导致报错。

另外还有一个需要注意的就是#$condition

$是用来传递变量的,但$穿过来的值会被加上单引号,并且会被转义,那就是说如果你传递  and name='lemontea'会变成'and name=\'lemontea\''

那么为了不被转义,只需要在前面加上#就可以了。

 

原创文章,转载请注明出处。

转载于:https://www.cnblogs.com/tangjizhong/p/6210508.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Scala中,可以通过使用Scala语言内置的JDBC或使用Scala提供的第三方库(如Slick)来执行SQL查询。以下是使用JDBC的示例代码: ```scala import java.sql.{Connection, DriverManager, ResultSet} val url = "jdbc:mysql://localhost:3306/mydatabase" val driver = "com.mysql.jdbc.Driver" val username = "myuser" val password = "mypassword" // register driver Class.forName(driver) // create connection val connection: Connection = DriverManager.getConnection(url, username, password) // create statement val statement = connection.createStatement() // execute query val query = "SELECT * FROM mytable" val resultSet: ResultSet = statement.executeQuery(query) // iterate through result set while (resultSet.next()) { val id = resultSet.getInt("id") val name = resultSet.getString("name") val age = resultSet.getInt("age") println(s"$id\t$name\t$age") } // close connection resultSet.close() statement.close() connection.close() ``` 在上面的示例中,我们使用JDBC驱动程序连接到MySQL数据库,并使用`Statement`对象执行查询。结果存储在`ResultSet`对象中,我们可以使用`next()`方法迭代结果集并获取每一行的值。 如果你使用的是Slick库,则可以使用其提供的DSL语言来执行SQL查询。以下是使用Slick的示例代码: ```scala import slick.jdbc.MySQLProfile.api._ val url = "jdbc:mysql://localhost:3306/mydatabase" val driver = "com.mysql.jdbc.Driver" val username = "myuser" val password = "mypassword" // create database connection val db = Database.forURL(url, username, password, driver) // define table schema case class MyTable(id: Int, name: String, age: Int) class MyTableTable(tag: Tag) extends Table[MyTable](tag, "mytable") { def id = column[Int]("id", O.PrimaryKey) def name = column[String]("name") def age = column[Int]("age") def * = (id, name, age) <> (MyTable.tupled, MyTable.unapply) } val myTableQuery = TableQuery[MyTableTable] // execute query val query = myTableQuery.result val result = db.run(query) // iterate through result set result.map { rows => rows.foreach { row => println(s"${row.id}\t${row.name}\t${row.age}") } } // close connection db.close() ``` 在上面的示例中,我们首先定义了表结构,并使用Slick的DSL语言定义了查询。然后,我们使用`db.run()`方法执行查询,并使用`map()`方法迭代结果集。由于Slick使用异步API,所以我们需要在最后关闭数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值