天天看点

《Java EE核心框架实战》—— 2.6 动态SQL的使用

本节书摘来异步社区《java ee核心框架实战》一书中的第2章,第2.6节,作者: 高洪岩,更多章节内容可以访问云栖社区“异步社区”公众号查看。

mybatis框架还支持动态sql标签的使用,而且某些标签的使用率还非常高。

创建名为dynsqltest的web项目,创建名为test1的servlet对象,核心代码如下。

select idauto.nextval from dual

insert into userinfo(id,username,password,age,insertdate)

values(#{id},#{username},#{password},#{age},#{insertdate})

<code>`</code>

程序运行后出现如下异常信息。

&lt;?xml version="1.0" encoding="utf-8" ?&gt;

values(#{id,jdbctype=integer},#{username,jdbctype=varchar},#{password,

jdbctype=varchar},#{age,jdbctype=integer},#{insertdate,jdbctype=timestamp})

这里在#{}格式中加入了数据类型的声明,这样可以明确地告诉mybatis框架如果遇到null值该如何处理。再次运行程序,成功插入数据表,运行结果如图2-5所示。

《Java EE核心框架实战》—— 2.6 动态SQL的使用

通过在#{}格式中加入jdbctype即可避免插入null值时的异常,其实使用动态sql标签也可以达到同样的效果。

在映射文件userinfomapping.xml添加如下代码。

public class test2 extends httpservlet {

public void doget(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

userinfo userinfo1 = new userinfo();

userinfo1.setusername("英国");

userinfo1.setpassword(null);

userinfo1.setage();

userinfo1.setinsertdate(new date());

userinfo userinfo2 = new userinfo();

userinfo2.setusername("法国");

userinfo2.setpassword("法国人");

userinfo2.setage();

userinfo2.setinsertdate(new date());

sqlsession sqlsessionref = getsqlsession.getsqlsession();

sqlsessionref.insert("insertuserinfo2", userinfo1);

sqlsessionref.insert("insertuserinfo2", userinfo2);

sqlsessionref.commit();

sqlsessionref.close();

}

}<code>`</code>

程序运行后,成功向数据表中插入两条记录,如图2-6所示。

《Java EE核心框架实战》—— 2.6 动态SQL的使用

&lt; choose&gt;标签的作用是在众多的条件中选择出一个条件,它有些类似于java语言中switch语句的作用。

在映射文件userinfomapping.xml中添加如下配置代码。

public class test3 extends httpservlet {

userinfo1.setusername("英");

userinfo2.setpassword("法");

userinfo userinfo3 = new userinfo();

list listmap1 = sqlsessionref.selectlist("selectuserinfo1",

for (int i = 0; i &lt; listmap1.size(); i++) {

map eachmap = listmap1.get(i);

system.out.println("listmap1中的内容: " + eachmap.get("id") + " "

list listmap2 = sqlsessionref.selectlist("selectuserinfo1",

for (int i = 0; i &lt; listmap2.size(); i++) {

map eachmap = listmap2.get(i);

system.out.println("listmap2中的内容: " + eachmap.get("id") + " "

list listmap3 = sqlsessionref.selectlist("selectuserinfo1",

for (int i = 0; i &lt; listmap3.size(); i++) {

map eachmap = listmap3.get(i);

system.out.println("listmap3中的内容: " + eachmap.get("id") + " "

数据表userinfo中的内容如图2-7所示。

程序运行后,在控制台输出如图2-8所示的信息。

《Java EE核心框架实战》—— 2.6 动态SQL的使用

&lt; set&gt;标签可以用在update语句中,作用是动态指定要更新的列。

在映射文件userinfomapping.xml中添加如下映射代码。

public class test4 extends httpservlet {

userinfo userinfo = new userinfo();

userinfo.setid();

userinfo.setusername(null);

userinfo.setpassword("新密码");

userinfo.setage();

userinfo.setinsertdate(new date());

sqlsessionref.update("updateuserinfo", userinfo);

程序运行结果如图2-9所示。

《Java EE核心框架实战》—— 2.6 动态SQL的使用

&lt; foreach&gt;标签有循环的功能,可以用来生成有规律的sql语句。

item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次迭代之间以什么符号作为分隔符,close表示该语句以什么结束。

public class test5 extends httpservlet {

// id的值来自于list

list list = new arraylist();

list.add(1);

list.add(3);

list.add(5);

list listmap1 = sqlsessionref.selectlist("selectuserinfo2", list);

system.out.println("list1中的内容: " + eachmap.get("id") + " "

// id的值来自于queryuserinfo实体中的list

queryuserinfo queryuserinfo = new queryuserinfo();

queryuserinfo.setusername("法");

queryuserinfo.getidlist().add(198);

queryuserinfo.getidlist().add(199);

listmap1 = sqlsessionref.selectlist("selectuserinfo3", queryuserinfo);

system.out.println("list2中的内容: " + eachmap.get("id") + " "

// id的值来自于map中的list

map parammap = new hashmap();

parammap.put("username", "5");

parammap.put("idlist", list);

listmap1 = sqlsessionref.selectlist("selectuserinfo4", parammap);

system.out.println("list3中的内容: " + eachmap.get("id") + " "

运行程序后,控制台输出如图2-10所示的结果。

《Java EE核心框架实战》—— 2.6 动态SQL的使用

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。