项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表、操作表字段等)。常见的我们会把日志、设备实时位置信息等存入数据表,并且以一定时间段生成一个表来存储,log_201806、log_201807等。在这里我们用mybatis实现,会用到动态sql。
动态sql是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个boundsql对象,也是在此对动态sql进行处理。
在动态sql解析过程中,#{ }与${ }的效果是不一样的:
#{ } 解析为一个jdbc预编译语句(prepared statement)的参数标记符。
如以下sql语句:
1
|
select * from user where name = #{name};
|
会被解析为:
1
|
select * from user where name = ?;
|
可以看到#{ }被解析为一个参数占位符 ? 。
${ } 仅仅为一个纯粹的string替换,在动态sql解析阶段将会进行变量替换。
如以下sql语句:
1
|
select * from user where name = ${name};
|
当我们传递参数“joanna”时,sql会解析为:
1
|
select * from user where name = “joanna”;
|
可以看到预编译之前的sql语句已经不包含变量name了。
综上所述,${ }的变量的替换阶段是在动态sql解析阶段,而#{ } 的变量的替换是在dbms中。
下面实现mybatis动态创建表,判断表是否存在,删除表功能。
mapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace= "xx.xxx.xx.mapper.operatetablemapper" >
<select id= "existtable" parametertype= "string" resulttype= "integer" >
select count(*)
from information_schema.tables
where lcase(table_name)=#{tablename}
</select>
<update id= "droptable" >
drop table if exists ${tablename}
</update>
<update id= "createnewtable" parametertype= "string" >
create table ${tablename} (
id bigint( 20 ) not null auto_increment,
entityid bigint( 20 ) not null ,
dx double not null ,
dy double not null ,
dz double not null ,
ntype varchar( 32 ) not null ,
gnsstime bigint( 20 ) not null ,
speed float default null ,
direction float default null ,
attributes varchar( 255 ) default null ,
primary key (id))
</update>
<insert id= "insert" parametertype= "xx.xxx.xx.po.trackpoint" >
insert into ${tablename}
(entityid,dx,dy,dz,ntype,gnsstime,speed,direction,attributes)
values
(#{trackpoint.entityid},
#{trackpoint.dx},
#{trackpoint.dy},
#{trackpoint.dz},
#{trackpoint.ntype},
#{trackpoint.gnsstime},
#{trackpoint.speed},
#{trackpoint.direction},
#{trackpoint.attributes})
</insert>
</mapper>
|
mapper.java
package xx.xxx.xx.mapper;
1
2
3
4
5
6
7
8
|
import org.apache.ibatis.annotations.param;
import xx.xxx.xx.po.trackpoint;
public interface operatetablemapper {
int existtable(string tablename);
int droptable( @param ( "tablename" )string tablename);
int createnewtable( @param ( "tablename" )string tablename);
int insert( @param ( "tablename" )string tablename, @param ( "trackpoint" )trackpoint trackpoint);
}
|
总结
以上所述是小编给大家介绍的mybatis动态创建表的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/Joanna-Yan/p/9187538.html