运用该技术,在scala小项目里面可以很简单的往mysql内插入数据。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.scalikejdbc</groupId>
<artifactId>scalikejdbc_2.11</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.scalikejdbc</groupId>
<artifactId>scalikejdbc-config_2.11</artifactId>
<version>3.1.0</version>
</dependency>
配置文件的名称需要为application.conf
,这样才能被识别。配置文件内容如下:
db.default.driver="com.mysql.jdbc.Driver"
db.default.url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false"
db.default.username="root"
db.default.password="123456"
增删改操作都是使用DB.autoCommit方法进行编写,这里做统一的撰写。
//加载application.conf配置文件
DBs.setup()
//往表中插入数据
//implicit是导入隐式转换
DB.autoCommit{ implicit session =>
//编写sql语句
SQL("insert into student values(?,?,?)")
//绑定参数
.bind(1,"zhangsan",18)
//执行代码,只要表数据发生了改变都需要用update,也就是增删改都需要添加update
.update()
//提交任务
.apply()
}
//从表中删除数据
DB.autoCommit{implicit session =>
SQL("delete from student where id = ?")
.bind(1)
.update()
.apply()
}
修改表中的数据
DB.autoCommit{implicit session =>
SQL("update student set name = "lisi" where id = ?)
.bind(1)
.update()
.apply()
}
scalikejdbc的查询操作使用的是readOnly方法
//加载application.conf配置文件
DBs.setup()
//从表中查找数据
//implicit是导入隐式转换
val list:List[(Int,String,Int)] = DB.readOnly{implicit session =>
SQL("select id,name,age from student")
.map(
wrs =>(
wrs.int("id"),
wrs.string("name"),
wrs.int("age")
))
//此处不需要执行update方法
//将采集的数据转换成元组,放入list中
.list()
//提交任务
.apply()
}
//打印输出
list.foreach(println)
场景:如果我们往数据库插入了几百万条数据甚至更多,如果中间有一条出现了错误导致异常退出,我们也很难找到哪些数据插入了,那些没有插入,因此对整个操作进行操作很有必要。
不加入事务,插入大量数据的过程中产生异常:
//加载application.conf配置文件
DBs.setup()
for(i <- 1 to 1000){
if (i == 456){
//手写除0异常
i/0
}
//插入数据
DB.autoCommit{implicit session =>
SQL("insert into student values(?,?,?)")
.bind(i,"zhangsan","18")
.update()
.apply()
}
}
该代码片段产生的结果就是,只插入了id为1到455
的这455条数据,剩下的全部未插入。
加入事务,插入大量数据的过程中产生异常:
//加载application.conf配置文件
DBs.setup()
//插入数据,使用localTx方法添加事务
DB.localTx{implicit session =>
for(i <- 1 to 1000){
if (i == 456){
//手写除0异常
i/0
}
SQL("insert into student values(?,?,?)")
.bind(i,"zhangsan","18")
.update()
.apply()
}
}
该代码片段如果产生了异常,则一条数据都不会插入数据库。