黑马程序员技术交流社区
标题:
mybatis总结
[打印本页]
作者:
tanglong
时间:
2019-5-31 15:02
标题:
mybatis总结
mybatis框架基本运用
1. 创建一个maven项目
2. 在pom.xml文件中添加坐标导入依赖,需要导入的依赖有:
*
mybatis框架 → mybatis
*
数据库连接 → mysql-connector-java
*
单元测试 → junit
*
日志 →log4j
3. 编写实体类
4. 编写持久层接口 *Dao
5. 编写持久层接口的映射文件 *Dao.xml,*Dao.xml文件在resources目录下的路径必须与*Dao在java包下的路径一致
*
找到约束,复制粘贴过来
<?xml version="1.0" encoding = "utf-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
*
配置映射文件指向的名称空间
<mapper namespace = "具体的持久层接口的全限定类型名">
<!--配置文件的主体内容-->
</mapper>
*
配置结果集类型resultType
*
当返回值为基本类型时 resultType = "类型名"
*
当返回值为实体类对象且属性名与查询表结果字段名匹配时 resultType = "对象实体类的全限定名",可以在SqlMapConfig.xml文件中配置别名,配置后可直接写类名,不区分大小写
*
当返回值为实体类对象但属性名与查询表结果字段名不同时,需配置结果集对应关系:
<resultMap id="起一个名字供配置语句时调用" type="封装成的对象的全限定类名(有别名则只写类名即可)">
<id column="与对象表主键对应的列名" property="对应的对象属性名"></id>
<result column="列名" property="对应的对象属性名"></property>
. . .
</resultMap>
*
当封装的对象中包含对象时,resultMap标签中需配置association标签:
<association property="属性名" javaType="对象实体类名">
<id property="对象的属性名" column="与对象表主键对应的列名"></id>
<result property="对象的属性名" column="列名"></result>
. . .
</association>
*
当封装的对象中包含实体类对象集合List<Object>时,resultMap标签中需配置collection:
<collection property="属性名" ofType="对象的实体类名" >
<id property="对象的属性名" column="与对象表主键对应的列名"></id>
<result property="对象的属性名" column="列名"></result>
. . .
</collection>
*
配置具体的增删改查sql语句
*
增删改方法一般没有返回值 ,若是方法有返回值,可以在内部添加selectKey标签进行查询;
*
方法有参数时,用#{ }字符替换sql语句中的?,参数值写在花括号内部;也可以使用el表达式${value}获取参数字符串,但#{}代表占位符,可以防止sql注入,且当参数为基本类型时,花括号内的参数名可以随便写;
*
模糊查询可以使用‘%${value}%’组装成的字符串,也可以在业务逻辑中组装参数;
*
当传入的参数不止一个时,要对参数进行封装,传入一个封装好的参数对象,通过#{}字符取出参数;
<insert id="接口中的方法名" parameterType="传入的参数类型" resultType="返回值的类型名">
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id()
</selectKey>
insert into formname values (.#{property}..)
</insert>
<delete id="方法名" parameterType="int">
delete from formname where id=${value}
</delete>
<update id="方法名 parameterType="User">
update formname set username=#{username} where id=#{id}
</update>
<select id="方法名" parameterType="int" resultType="user">
select * from formname where id=#{id}
</select>
<select id="方法名" parameterType="int" resultMap="配置的resultMap的id值">
select * from formname where id=#{id}
</select>
*
mybatis中的动态sql语句:if、where、foreach及 抽取重复的sql语句代码片段
*
if标签test属性中写的是参数的属性,如果该属性为包装类对象要使用OGNL表达式写法
*
where标签相当于where 1=1 的作用 ,标签内的首条sql语句中and可省略
*
foreach循环标签的属性值:
collection:要遍历的集合元素,注意不要写#{};
open: 新增sql语句的开头;
close:新增sql语句的结尾;
items:遍历的集合中的单个元素,生成的元素名
seperator:单个元素间的分割符号
<sql id="replaceSql">
select * from user
</sql>
<select id="" parameterType="queryVo" resultType="user">
<!--select * from user-->
<include refid="replaceSql"></include>
<where>
<if test="ids!=null and ids.size()>0">
<foreach
collection="ids"
open="and id in ("
close=" )"
items="uid"
seperator="," >
#{uid}
</foreach>
</if>
</where>
</select>
6. 编写mybatis框架的核心配置文件SqlMapConfig.xml
*
配置文件约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
*
主配置文件内容
<configuration>
<!--使用typeAliases配置指定目录下的类型别名,必须在环境配置前面-->
<typeAliases>
<package name="com.itcast.case01.domain"></package>
</typeAliases>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事物的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源/连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的四个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3309/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/itcast/case01/dao/UserDao.xml"/>
. . .
</mappers>
</configuration>
7. 编写测试类单独运行mybatis框架
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
//7.释放资源
session.close();
in.close();
8.mybatis框架基于注解的使用
*
无需再写*Dao的xml配置文件,在接口中添加注解即可通过接口的代理实现类调用方法,操作数据库,常用的注解有
*
@Insert("sql语句") 增
*
@Delete("sql语句") 删
*
@Update("sql语句") 改
*
@Select("sql语句") 查
*
@Result(id="true",column="列名",property="属性名") 封装结果集,非主键不用写id属性;
*
@Results(id="结果集名",value={@Result(...), ...}) 与@Result注解合用,封装多个结果集;
*
@ResultMap() 用于引用封装好的@ResultMap注解;
*
@One :用于一对一结果集封装:one=@One(select="方法的全限定名",fetchType=FetchType.LAZY);
*
@Many :用于一对多结果集封装:many=@Many((select="方法的全限定名",fetchType=FetchType.LAZY);
*
修改mybatis核心配置文件SqlMapConfig.xml中的映射位置
*
class指定具体的接口路径
<mappers>
<mapper class="接口的全限定类路径名"/>
<mapper class="接口的全限定类路径名"/>
. . .
</mappers>
*
package指定接口所在的包
<mappers>
<mapper package="接口所在包的全限定路径名"/>
</mappers>
9.延迟加载
*
在SqlMapConfig.xml文件中开启延迟加载
<settings>
<setting name="lazyLoadingEnable" value="true"></setting>
<setting name="aggressvieLazyLoading" value="false"></setting>
</settings>
*
在*Dao.xml文件中修改查询方法,将需要延迟加载的部分剥离开来,并在assocaition/collection标签中添加属性column和select
*
column 指定一个字段的值作为参数
*
select 指定要执行的方法的全限定路径
*
注解开启延迟加载直接给fetchType赋值FetchType.LAZY
10.mybatis框架自带的缓存
*
一级缓存
*
一级缓存是Sqlsession级别的缓存,只要SqlSession没有close()或flush(),它就存在;
*
当调用sqlsession的增、删、改、commit()、close()等方法时,一级缓存就会清空;
*
mybatis框架查询数据库,默认先去查询一级缓存,若缓存中不存在数据,则从数据库中查询数据并保存到一级缓存中;
*
二级缓存
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2