A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tanglong 初级黑马   /  2019-5-31 15:02  /  781 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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框架查询数据库,默认先去查询一级缓存,若缓存中不存在数据,则从数据库中查询数据并保存到一级缓存中;
        *
二级缓存

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马