xml映射文件

<1>namespace
dao接口的全类名。

<2>mapper中的属性
1.cache/cache-ref
2.delete/update/insert/select

insert/delete/update的用法基本类似,此处一起讲。

insert/deletet/update标签属性:

标签说明
parameterType传入的参数类型,基本不用。mybatis可以自动通过TypeHandler推断出传入的参数类型
flushCache与缓存有关
timeout与事务有关,用Spring处理
statementType不写默认为使用prepareStatement处理sql语句,通过此属性,可配置其它的方式
useGeneratedKeys取值(true
keyProperty将useGeneraterKeys获取的自增id赋值给某个属性
keyColumn仅对特殊的数据库使用,一般不考虑
databeseId

useGeneraterKeys和keyColumn的用法:
支持自增主键的数据库:
数据库中可以设置一个属性为自增id,且只能设置一个。
加入这个列名为id设置了属性自增。则这一列的序号依次递增。每行依次取1,、2、3、4、5、6…。
此时如果需要插入一行,而不知道当前行的id值。可以将插入属性设置为null。然后设置useGeneratedKeys==true,再设置keyProperty=“id”。即可自动插入自增的id。

<insert id="" useGeneratedKeys="true" keyProperty="id">

不支持自增主键的数据库:
可以则sql语句的上边用selectKey获取主键。设置属性order=“BEFORE”,表示在sql语句执行之前执行一个sql语句。
sql语句:select max(id) from user。查询最大的值。
然后将值+1给keyProperty。

    <insert id="">
        <selectKey order="BEFORE" keyProperty="id">
            select max(id)+1 from user
        </selectKey>
        要执行的sql语句
    </insert>

select标签属性:

标签说明
resultType返回值类型

resultType
有返回值的必须写此标签。用全类名或别名,
如果返回的是一个集合类型,则直接写集合中元素的类型。
如果是返回一个map类型:
a,返回一条记录,返回值可以写map,且默认将类名作为key。对应的值作为value。
b,返回多条记录,可以将主键作为key(在对应的方法名上加注释@MapKey(“”)可以指定主键作为key),其对应行的记录为一个对象作为为value。因此此处的返回值写map中元素的类名称。

resultMap:
1、按照列名称和属性名称相同一一对应。
2、如果不想起相同的名字:
1)开启驼峰命名法。
2)起别名,为sql语句为列名起别名。
3,自定义结果集:使用resultMap属性,其中type标签指定要进行自定义的类。id为自己的唯一标识。(注意,此时不能使用resultType,而是使用resultMap=“自定义结果集的id”)
主键列的列名的对应,使用id属性(也可以用result)。property指定类属性,column指定数据库中的列名。
其它列的列名的对应,使用result属性。property指定类属性,column指定数据库中的列名。

    <resultMap id="" type="">
        <id property="" column=""/>
        <result property="" column=""/>
    </resultMap>

4.当类中含有其它类的引用类型时:
注:sql语句进行级联之后,查询结果得到是一个新的表。如果在某些地方只需要使用到这个新表的某一列,那么其它的查询结果便是多余的。则会降低数据库的性能。此时可以通过全局xml文件中settings的配置。

开启lazyLoadingEnabled,延迟加载开关。true表示开启,默认为false。即可将不需要的查询进行延时加载。这样可以提升查询数据库的性能。

agressiveLazyLoading,默认为true,将对有延迟的加载进行完整的加载,即可以加载完整的查询。改为false则会进行按需加载,不会加载未使用的部分。

因此需要将两个属性配合起来使用。
如果不需要进行延时加载,并且是按需加载。则需要按上述配置完毕之后。再在association中将fetchType的属性设为eager,即可进行立即的按需加载。
<1-1的属性级联>
a,用类名.属性名,通过上述的resultMap,即可进行映射。
b,(建议使用)通过association属性进行对象的关联。其property标签表示类中的引用类型id。javaType表示引用对象的类型(用全类名)。再在其中再进行自定义封装规则。

<association property="引用类型id" javaType="引用对象的全类名">
     依旧是id和result属性的配置
</association>

c,采用分步查询的方式(在数据库的操作中还是建议使用连接查询。因为分步查询会启动两次数据库,影响数据库的性能。)(此时是使用resultType):没有按照联合查询的方式执行的sql语句(resultType)。不会查询出引用类型的对象数据。

<association property="引用类型的id" select="namespace.查询语句id"
             column="指定通过本类的哪个属性去差引用类型的数据(一般是本类的主键)">
</association>

上述中namespace.查询语句id,将会执行对应的sql语句。此方式会依次执行sql语句进行查询。
<1-n的属性级联>
1.加入包含集合属性。使用collection。

<collection property="集合的id名称" ofType="集合中引用对象的全类名">
     依旧是级联对象的配置,
     如果此时级联对象中的引用类型又包含自己。
     则无需再配置引用类型。(只需要查询自己需要的列名即可)
</collection>

1.传入单个参数:
取值:#{随便写}。
2.传入多个参数:
#{参数名}这样的取值是错误的,因为一旦有多个参数,mybatis会将多个参数自动封装成一个map对象。
其中{}中的值为key值。而自动封装的结果的key值为1,2,param1,param2。分别表示第一个和第二个参数。因此{}内只能天1,2,param1,param2。

可以使用自己设置的key值进行传参(建议使用):
此时只需要在dao类中对应的方法的参数名前边加上@param(“id”),即可将id设置为key值。这样就可以使用自定义的key表示哪个参数。

public User getUserById(@Param("id") Integer id);

3、传入javabean
取值:#{javabean类中的属性名|类名.属性名}
4、传入map
使用自定义的map,等同于方式2。自定义一个map进行参数映射对应的参数。即可使用#{自定义的key}。

sql语句取值的附加设置:
#{key,。。。},逗号后面可以进行很多标签的定义,如:jdbcType,javaType,numericScale等。
此处只说明重要的jdbcType的作用:
jdbcType如果不设置:mysql不会有问题,但是Oracle可能会出错。
在传入的参数为null时。mysql可以进行插入,但是Oracle则不知道null是什么类型。此时则需要通过jdbcType指定传入的参数类型。

¥和#的sql取参数的区别:
在这里插入图片描述
1.两者都可以进行参数的接收。
2.#的接收参数是通过参数预编译的方式执行sql语句。而¥则是通过字符串拼接的方式进行的。如图为执行sql语句的日志打印结果,其中第一个参数的位置使用¥接收的参数,第二个位置是#接收的参数。
在这里插入图片描述

3.#接收参数比(¥)接收参数更加安全。假如传入的参数为一个字符串为"and name=123"。如果采用$符号进行接收。会将这个参数进行字符串的拼接。此时新的sql语句字符串的意义就和原来的sql语句的不同。因此¥符号进行参数的接收是不安全。
4.大多数情况都是使用#进行参数的接收。唯一需要使用到¥进行参数接收的地方,当需要动态加载sql与语句的时候,如表名,可以通过¥,动态的拼接sql语句,此时使用#则无效,因为sql语句只支持取参数的预编译。

3.parapmeterMap/resultMap/sql

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值