mybatis语法总结、

mybatis中的#和$的区别?

这是我在使用mybatis时候最蛋疼的问题,下面做出总结

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111",

如果传入的值是id,则解析成的sql为order by "id".

  

2. $将传入的数据直接显示生成在sql中。

如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,

如果传入的值是id,则解析成的sql为order by id.

  

3. #方式能够很大程度防止sql注入。

  

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.

  

6.一般能用#的就别用$.

注入攻击 就不用我多说了吧~

<![CDATA[ ]]> 这个是什么?

标明是纯文本的,没有这个的话 <  >  & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。

可以避免未预料的特殊符号导致XML解析出错。

在XML中的所有的text将被parser解析,当一个XML的元素被解析,XML tags之间的text也将别解析,之所以这样做,是因为在XML tags之间可能包含其它元素,例如:

<name><first>Bill</first><last>Gates</last></name> 。

<name>中包含<first>和<last>两个其它元素。Parser也必须对它们进行解析,并把它们解析成为<name>的两个字元素,但是如果在text中出现了“<”这种符号,例如:

<message>if salary < 1000 then</message>。

Parser将面临着一些困难,因为它需要判断:这是XML tag的开始;还是“<”小于号,这会导致解析错误。为了解决这个问题,代替符号“&”被使用,用它来代替“<”符号。

但是如果text中包含太多的“<”和“&”,例如程序中的逻辑判断。代替符号便不是一个好的办法。因此XML提供了CDATA section。

一个CDATA section 以"<![CDATA["开始,并以"]]>"结束。例如:

<script>

<![CDATA[

function matchwo(a,b)

{

if (a < b && a < 0) then

{

return 1

}

else

{

return 0

}

}

]]>

</script>

其中所有在CDATA section里的符号都将被忽略。

另:CDATA section中不能包含字符串“]]>”,因此CDATA section 不能嵌套。并且在“]]>”中不能有空格符或换行符。

1
程序代码


//声明一个session管理工厂

SqlSessionFactory factory =null;

//声明读取器

Reader reader =null;

try{

//通过读取器定位到主配置文件

reader = Resources.getResourceAsReader ("SqlMapConfig.xml");

//初始化工厂

factory =newSqlSessionFactoryBuilder().build(reader);

}catch(IOException
e) {

//TODOAuto-generated
catch block

e.printStackTrace();

}

//打开一个会话(类似于
jdbc
中创建数据库连接)

SqlSession session = factory.openSession();

Person p =newPerson();

p.setName("张三"
);

p.setAge(11);

p.setBirthday(newDate());

//进行插入

try{

session.insert("org.leadfar.mybatis.Person.insert",
p);

//事务提交

session.commit();

System.out.println("保存成功!"
);

}catch(Exception
e) {

e.printStackTrace();

//事务回滚

session.rollback();

}finally{

//关闭连接

session.close();

}

2sql
参数传递

1. 简单参数


<deleteid="delete"parameterType="int">

delete from t_person where id=#{id} <!—无所谓写什么都可以à

</delete>

2. 多个参数,建议采用
Map 包装


<selectid="selectLikeNameAndAgeBetween"parameterType="map"resultType="Person">

<includerefid="selectBasic"/>where
name like #{name} and age between #{age1} and #{age2}

</select>


SqlSession session =factory.openSession();

Mapmap =newHashMap();

map .put("name","%张%"
);

map .put("age1",
0);

map .put("age2",
100);

List persons=session.selectList(Person.class.getName()+".selectLikeNameAndAgeBetween",map
);

System.out.println(((Person)(persons.get(0))).getName());

session.close();

3.sql
语句块


<sqlid="selectBasic">

select * from t_person

</sql>

<selectid="selectLikeName"parameterType="string"resultType="Person">

<includerefid="selectBasic"/>where
name like #{name}

</select>

4属性名与字段名不匹配

<resultMaptype="Person"id="select-reusltMap">

<resultcolumn="sex"property="gender"/>

</resultMap>

<selectid="selectLikeNameAndAgeBetweenResultMap"parameterType="map"resultMap="select-reusltMap">

<includerefid="selectBasic"/>where
name like #{name} and age between #{age1} and #{age2}

</select>

5
动态 sql

5.1
.if


<selectid="selectIf"parameterType="map"resultType="Person">

select * from t_person

<iftest="name
!=null">

where name like #{name}

</if>

<iftest="age
!=0">

and age=#{age}

</if>

</select>

注:如果 name==null
,则 sql 拼写错误


<selectid="selectWhere"parameterType="map"resultType="Person">

select * from t_person

<where>

<iftest="name
!=null">

name like #{name}

</if>

<iftest="age
!=0">

and age=#{age}

</if>

</where>

</select>

注 :
加 <where> 后则确保一定是where开头

5.2
.choose

类似于 switch


<selectid="selectChoose"parameterType="map"resultType="Person">

select * from t_person

<choose>

<whentest="name!=null">

where name like #{name}

</when>

<otherwise>

where name like ‘%%‘

</otherwise>

</choose>

<iftest="age
!=0">

and age=#{age}

</if>

</select>

5.3
.foreach

如 in
操作


<selectid="selectFor"parameterType="list"resultType="Person">

select * from t_person where id in

<foreachcollection="list"item="p"open="("close=")"separator=",">

#{p}

</foreach>

</select>


SqlSession session =factory.openSession();

Listl =newArrayList();

l .add(1);

l .add(2);

l .add(3);

l .add(4);

List persons=session.selectList(Person.class.getName()+".selectFor",l
);

System.out.println(((Person)(persons.get(1))).getName());

session.close();

5.4
$

相当于转义,字符串替换


<selectid="selectIn"parameterType="map"resultType="Person">

select * from t_person where id in ${instr}

</select>


SqlSession session =factory.openSession();

Map params=newHashMap();

//params.put("name", "%张%");

params.put("instr","(1,2,3,4)");

List persons=session.selectList(Person.class.getName()+".selectIn",params);

System.out.println(((Person)(persons.get(1))).getName());

session.close();

另外对于排序时由外部传入某字段


<selectid="selectOrderBy"parameterType="map"resultType="Person">

select * from t_person
order by ${by}

</select>


SqlSession session =factory.openSession();

Map params=newHashMap();

//params.put("name", "%张%");

params.put("by","age
desc");

List persons=session.selectList(Person.class.getName()+".selectOrderBy",params);

System.out.println(((Person)(persons.get(1))).getName());

session.close();

6
一对一映射

6.1
简单方法

设 Person
与 Address 是一对一关系

PersonMapper.xml


<resultMaptype="Person"id="select-resultMap">

<!--一对一(多对一
)
通过
association,property
目标对象的属性
-->

<associationproperty="address"select="org.leadfar.mybatis.Address.selectAll"column="id"javaType="Address">

         

     </association>

</resultMap>


<selectid="selectAll"resultMap="select-resultMap">

select * from t_person

</select>

AddressMapper.xml


<selectid="selectAll"parameterType="int"resultType="Address">

select * from t_address where person_id=#{pId}

</select>

6.2
解决 N+1
问题


<selectid="selectAllN1"resultMap="select-resultMapN1">

select a.*,b.id addr_id, b.postCode,b.area from t_person a left join t_address b on

a.id=b.person_id

</select>


<!--这种方式能解决N+1问题,但是自动对象赋值将不行-->

<resultMaptype="Person"id="select-resultMapN1">

<idcolumn="id"property="id"/>

<resultcolumn="sex"property="gender"/>

<resultcolumn="name"property="name"/>

<resultcolumn="birthday"property="birthday"/>

<resultcolumn="age"property="age"/>

<associationproperty="address"column="id"javaType="Address">

<idcolumn="addr_id"property="id"/>

<resultcolumn="area"property="area"/>

<resultcolumn="postCode"property="postCode"/>

</association>

</resultMap>

7
一对多映射

设 Person
和 Car 为一对多关系


<selectid="selectAllN1"resultMap="select-resultMapN1">

select a.*,b.id addr_id, b.postCode,b.area from t_person a left join t_address b on

a.id=b.person_id

</select>


<!--这种方式能解决N+1问题,但是自动对象赋值将不行-->

<resultMaptype="Person"id="select-resultMapN1">

<idcolumn="id"property="id"/>

<resultcolumn="sex"property="gender"/>

<resultcolumn="name"property="name"/>

<resultcolumn="birthday"property="birthday"/>

<resultcolumn="age"property="age"/>

<associationproperty="address"column="id"javaType="Address">

<idcolumn="addr_id"property="id"/>

<resultcolumn="area"property="area"/>

<resultcolumn="postCode"property="postCode"/>

</association>

<!--将t_car中相关的数据与目标对象(Person)中的cars属性进行对应-->

<collectionproperty="cars"column="id"select="org.leadfar.mybatis.Car.selectByPerson"></collection>

</resultMap>

时间: 2024-10-23 01:58:28

mybatis语法总结、的相关文章

MYSQL mybatis

 mysql 1 每个语句的结束记得加分号; 2where条件里再做if分支 SELECT *FROM `table` WHERE IF( `parentID` is null, `plan_id` <10, `plan_id` >500 ) 3 is null, is not null 用于判断某个字段或是变量为null或不为null. 4 isnull(expr) 的用法: 如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0. 5 ifnull(exp1,exp

IBatis批量插入数据

IBatis插入注意,数据量比较多的花,需要分批插入,策略是dao里面控制插入批次,mapper里面批量插入即可 @Override public Long insertBatch(List<WaiterDO> list) throws Exception { //每批次插入数量 int batchCount = 3; //游标 int index = 0; //批次 int batchNum = 1; for(;;){ if(index+batchCount>=list.size())

Mybatis动态sql语句(OGNL语法)

下面是Mybatis动态sql语句(即OGNL语法)的简单案例 1.创建表 create table test(id int primary key auto_increment,name varchar(20),job varchar(20),dept varchar(20),sal int) charset=utf8; insert into test values (null,'鲁班','java','甲',1456), (null,'后裔','java','甲',2440), (null

mybatis 批量update报语法错误解决方法

1.为什么会报语法错误 原因:在 *.xml文件内使用了循环,在mybatis中默认是不允许使用批量修改. <update id="setMaxMin" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="&quo

spring + myBatis 常见错误:SQL语法错误

在程序运行时,有时候会出现如下错误: 这个错误通常是你的sqlmapper.xml中sql语句语法有错误.所以请仔细查看你sql语句是否正确,比如{#id}这样写就会报上述错误,其实应该#{id}这样写.

Mybatis的SQL语句根据某些字段查不到值(语法不错)

遇到过这样的问题,根据一些字段查数据库,数据库里运行没问题,但是到mapper.xml就是拿不到 结果我按每个条件试着查,发现其他都没问题,有一个字段作为条件查询时查询不到, 于是试着把#取值换成$取值,好了 <select id="getInventoryByThree" parameterType="com.docc.model.Inventory" resultType="com.docc.model.Inventory"> s

mybatis中&quot;#&quot;和&quot;$&quot;的区别

mybatis中"#"和"$"的区别 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}. 在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别: select * from user where name = #{name}; select * from

Mybatis 高级结果映射 ResultMap Association Collection

作者:ilovejava_2010 MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程序,也将是非常棒的,但也没有.结果集映射就是MyBatis为解决这些问题而提供的解决方案.例如,我们如何映射下面这条语句? <!-- Very Complex Statement --> <select id="selectBlogDetails"

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe