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中引入插件