mybatis入门

1、环境配置

第一步:创建maven工程

第二步:导入坐标(pom.xml的相关依赖)

第三步:编写必要代码(实体类(属性)和持久层接口(Dao或者接口))

第四步:编写SqlMapConfig.xml(数据库连接和设置)

第五步:编写映射配置文件(方法与接口的连接及SQL语句)

第六步:编写测试类(psvm)

2.

--根据id查询-->
<select id="findById" resultType="com.itheima.domain.User" parameterType="int">
select * from user where id = #{uid}
</select>
resultType 属性:用于指定结果集的类型。
parameterType 属性:用于指定传入参数的类型。
sql语句中使用#{}字符:
它代表占位符,相当于原来jdbc部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
#{}中内容的写法:
由于数据类型是基本类型,
所以此处可以随意写。

3.模糊查询

3.1查询的值不固定

select * from user where username like #{username}
配置文件中的#{username}也只是一个占位符,所以SQL语句显示为“?”。

3.2查询的值固定

select * from user where username like '%${value}%'
我们在上面将原来的#{}占位符,改成了${value}。
注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字。

 

#{}表示一个占位符号

通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}表示拼接sql串

通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

4、jdbc与mybatis对比

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。 

 5、解决SQL查询时,有太多数据库列明和实体类之间别名从而有了resultMap

<--建立User实体和数据库表的对应关系

type属性:指定实体类的全限定类名

id属性:给定一个唯一标识,是给查询select标签引用用的。-->

<resultMaptype="com.itheima.domain.User"id="userMap">

<id column="id"property="userId"/>

<result column="username"  property="userName"/>

<result column="sex" property="userSex"/>

<result column="address" property="userAddress"/>

<result column="birthday" property="userBirthday"/>

</resultMap>

id标签:用于指定主键字段

result标签:用于指定非主键字段

column属性:用于指定数据库列名

property属性:用于指定实体类属性名称

6.自定义别名

在SqlMapConfig.xml中配置:

<typeAliases><!--单个别名定义-->

<typeAliasalias="user"type="com.itheima.domain.User"/>

<!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)--><packagename="com.itheima.domain"/>

<packagename="其它包"/>

</typeAliases>

7.sqlMapConfig.xml

-properties(属性)        --property-settings(全局配置参数)

--setting-typeAliases(类型别名)        --typeAliase--package-typeHandlers(类型处理器)

-objectFactory(对象工厂)                -plugins(插件)

-environments(环境集合属性对象)        --environment(环境子属性对象)

---transactionManager(事务管理)        ---dataSource(数据源)

-mappers(映射器)

 8.动态SQL之if语句

8.1使用情况

根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在id如果不为空时可以根据id查询,如果username不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

8.2持久层dao映射配置

<select id="findByUser" resultType="user" parameterType="user">
select * from user where 1=1
<if test= "username!=null and username != ''">
and usernamelike #{username}
</if>
<if test="address != null">and address like #{address}
</if>
</select>

注意:<if>标签的test属性中写的是对象的属性名,如果是包装类的对象要使用OGNL表达式的写法。另外要注意where 1=1的作用~!(1=1 永真, 1<>1 永假。)

相当于以下代码(动态sql的where用法)

<select id="findByUser" resultType="user" parameterType="user">
<includeref id="defaultSql"></include>
<where>
<if test="username!=null and username != '' ">
and usernamelike #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
</select>

9.动态SQL的foreach

9.1使用场景:

9.2 

<!--查询所有用户在id的集合之中-->

<select id="findInIds" resultType="user" parameterType="queryvo">

<!--select * from user where id in (1,2,3,4,5);-->

        <includerefid="defaultSql"></include>

        <where>

                <if test="ids != null andids.size() > 0">

                        <foreach collection="ids" open="id in ("close=")" item="uid" separator=",">

                                #{uid}

                        </foreach>

                </if>

        </where>

</select>

SQL语句:select字段from user where id in (?)

<foreach>标签用于遍历集合,

它的属性:

collection:代表要遍历的集合元素,注意编写时不要写#{}

open:代表语句的开始部分

close:代表结束部分

 

10、一对多(一句SQL同时查多个表) 

一对一(多对一)【】

11.mybatis的缓存

11.1一级缓存(同一个sqlsession)

一级缓存是SqlSession级别的缓存,自动开启,它就存在。

一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()、clearcache(仅适用一级缓存)等方法,同一个SQL session不同查询条件;不同SQL session会清空一级缓存。目的为了让缓存中存储的是最新的信息,避免脏读。

 

 二级缓存

二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

需要自己 开启二级缓存

1.在映射文件中设置<cache/>标签

2.二级缓存必须在一级缓存关闭或者提交之后失效。

3.查询的数据所转换的实体类必须实现序列化(Serializable)接口

12、mybatis的分页插件

pom.xml中引入插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值