首页 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
资讯 业界资讯 软件杂谈 编程开发 网站建设 网络观查 搜索引擎 移动应用 网站运营 网络地图
开发 移动开发 Web前端 架构设计 编程语言 互联网 数据库 系统运维 云计算 开发杂谈
[架构设计] mybatis语法总结、
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>

 
 
 
 


 此文从网络中自动搜索生成,不代表本网站赞成被搜索网站的内容或立场    查看原文
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年11日历
2018-11-14 19:43:00
 
  网站联系 软件世界网-www.sjsjw.com ©2014 蜀ICP备06016416号 三峰网旗下网站