Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. package main
  2.  
  3. import com.zaxxer.hikari.HikariDataSource
  4. import org.apache.ibatis.annotations.Insert
  5. import org.apache.ibatis.annotations.Select
  6. import org.apache.ibatis.mapping.Environment
  7. import org.apache.ibatis.session.Configuration
  8. import org.apache.ibatis.session.SqlSession
  9. import org.apache.ibatis.session.SqlSessionFactory
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder
  11. import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory
  12. import org.jetbrains.ktor.application.call
  13. import org.jetbrains.ktor.application.install
  14. import org.jetbrains.ktor.host.embeddedServer
  15. import org.jetbrains.ktor.netty.Netty
  16. import org.jetbrains.ktor.response.respondText
  17. import org.jetbrains.ktor.routing.Routing
  18. import org.jetbrains.ktor.routing.get
  19.  
  20. /**
  21. Ktor(corutine)使ったマイクロWebフレームワークで試す
  22. MyBatisでDBアクセス、トランザクション管理
  23. */
  24. fun main(args: Array<String>): Unit {
  25.  
  26. val sessionFactory: SqlSessionFactory = createSessionFactory()
  27.  
  28. embeddedServer(Netty, 8080) {
  29. install(Routing) {
  30. get("/") {
  31. withSession(sessionFactory.openSession()) {
  32. val dao = getMapper(PersonMapper::class.java)
  33. val str =dao.selectAll()
  34. .map{it.toString()}
  35. .reduceRight{first:String,second:String -> first +":" + second}
  36.  
  37. call.respondText(str)
  38. }
  39. }
  40.  
  41. get("/insert") {
  42. withSession(sessionFactory.openSession()) {
  43. val dao = getMapper(PersonMapper::class.java)
  44. val name = call.request.queryParameters["name"]
  45. val id = call.request.queryParameters["id"]
  46. if(null != id && null != name){
  47. val p =Person(id.toInt(), name)
  48. dao.insert(p)
  49. call.respondText("OK!"+p)
  50. }else{
  51. call.respondText("NG!")
  52.  
  53. }
  54. }
  55. }
  56. }
  57. }.start(wait = true)
  58. }
  59.  
  60. /**
  61. corutinから呼べるようにsuspendファンクションとして定義
  62. パフォーマンス的にどこまでcorutineのメリット生かせるのかは?
  63. */
  64. suspend fun withSession(session: SqlSession, block: suspend SqlSession.() -> Unit) {
  65. session.use {
  66. try {
  67. block.invoke(session)
  68. session.commit()
  69. }catch (e:Exception){
  70. session.rollback()
  71. throw e
  72. }
  73. }
  74. }
  75.  
  76. data class Person(val id: Int, val name: String)
  77. interface PersonMapper {
  78.  
  79. @Select("""
  80. SELECT *
  81. FROM person
  82. """)
  83. fun selectAll(): List<Person>
  84.  
  85. @Insert("""
  86. INSERT into person
  87. VALUES(#{id},#{name})
  88. """)
  89. fun insert(person: Person): Int
  90. }
  91.  
  92. fun createSessionFactory(): SqlSessionFactory {
  93. val dataSource = HikariDataSource()
  94. dataSource.jdbcUrl = "jdbc:h2:mem:hello"
  95. dataSource.username = "user"
  96. dataSource.password = "pass"
  97.  
  98. val transactionFactory = JdbcTransactionFactory()
  99. val environment = Environment("development", transactionFactory, dataSource)
  100. val configuration = Configuration(environment)
  101.  
  102. dataSource.connection.use { connection ->
  103. val st = connection.createStatement()
  104. st.execute("create table person (id int primary key, name varchar(100))")
  105. st.execute("insert into person(id, name) values (1, 'Boy')")
  106. }
  107. configuration.addMapper(PersonMapper::class.java)
  108. return SqlSessionFactoryBuilder().build(configuration)
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement