mybatis2

mybatis

第一天:

ORM思想:对象关系映射:

构建者模式 Bulid: 吧对象的常见细节隐藏;返回一个对象;

生产SqlSession使用了工厂模式;解耦;

prxy___>getMapper代理模式:

<?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>mybatis-day02-CRUD</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!--根据个人需要自己修改-->
                    <source>9</source>
                    <target>9</target>
                </configuration>
            </plugin>
        </plugins>
    </build>



</project>

mybatis运行原理:
1.通过加载mybatis全局配置文件以及mapper映射文件初始化configuration对象
和Executor对象(通过全局配置文件中的defaultExecutorType初始化);
2.创建一个defaultSqlSession对象,将configuration对象和Executor对象注入给
defaulSqlSession对象中;
3.defaulSqlSession通过getMapper()获取mapper接口的代理对象mapperProxy
(mapperProxy中包含defaultSQLSession对象)
4.执行增删改查:
1)通过defaulSqlSession中的属性Executor创建statementHandler对象;
2)创建statementHandler对象的同时也创建parameterHandler和
resultSetHandler;
3) 通过parameterHandler设置预编译参数及参数值;
4)调用statementHandler执行增删改查;
5)通过resultsetHandler封装查询结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDTa4XGw-1628757205536)(C:\Users\12479\AppData\Roaming\Typora\typora-user-images\image-20210724214722008.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUBKYMuZ-1628757205538)(C:\Users\12479\AppData\Roaming\Typora\typora-user-images\image-20210724214833810.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVEJ7pYa-1628757205538)(C:\Users\12479\AppData\Roaming\Typora\typora-user-images\image-20210724220924768.png)]

第二天:

mybatis的crud(基于代理模式)

配置文件: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>
    <environments default="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://localhast:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>

        </environment>
    </environments>
    <mappers>
        <mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>

第二个IUserDao.xml

<?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 ="com/heima.dao.IUserDao">
    <select id ="findALl" resultType = "com.itheima.daomin.user">
        select *from user;
    </select>

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.itheima.daomin.user">
        insert into user(usename,address,sex)values(#{usename},#{address},#{sex});

    </insert>
    <!--更新用户-->
    <update id="updateUser" parameterType = "com.itheima.daomin.user">
        update user set username=#{usernane},address=#{address},sex=#{sex},birthday=#{birthday}where id =#{};
    </update>
    <!--删除用户-->
    <delete id="deleteUser" parameterType="Inteeger">
        delete from user where id=#{id};
    </delete>

    <!--模糊查询-->
       <!--模糊查询-->
    <select id="findByName" parameterMap="string" resultType="com.itheima.domain.User">
        select * from user where like  #{name }
    </select>
    
    
      <!--查询到最后一行刚插入的行-->
    <insert id="dd"parameterType="com.itheima">
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
    </insert>

    




</mapper>

第三天:

生成的一个test.java

package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;



public class MybatisTest {
    private InputStream in ;
    private  SqlSession sqlSession;
    private  IUserDao userDao;

    @Before//用于在测试类之前执行
    public void init() throws  Exception{
        //读取配置文件;生成字节输入流
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获取SeqlSessionFactory
        SqlSessionFactory factory=  new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //4获取dao层代理对象
        IUserDao useDao =  sqlSession.getMapper(IUserDao.class);

    }
    @After//测试类之后执行
    public  void  detroy() throws  Exception{
        //提交事务
        sqlSession.commit();
        //6释放资源
        sqlSession.close();
    }

    @Test
    public void testFindAll()throws  Exception{
        init();
       User user = new User();
        //5执行保存方法
        List<User> users = userDao.findALl();

        for (User usesr : users
                ) {
            System.out.println(usesr);

        }
        detroy();
    }

    @Test
    public void testSave() {

        User user = new User();
        user.setId(4);
        user.setSex("男");
        //5执行保存方法
        userDao.saveUser(user);
    }

}


CRUD

1保存操作:mybatistest.java

  <!--查询到最后一行刚插入的行-->
    <insert id="dd"parameterType="com.itheima">
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
    </insert>

对于模糊查询:

  • 在xml中需要写value;是一种办法; ‘%${value}%’
  • 第二种:可以在java的test的类中;直接写"%王%"
  • 第二种方式实际上用的就是praperStatment的?比较好,第一种就是用拼接的;
OGNL表达式
  1. 对象图导航语言:
pojo:
  1. 类中的成员字段和数据库的列名字不一致时处理办法

    1. 可以在写sql语句的时候,起个别名

      1.     <select id ="findALl" resultType = "com.itheima.daomin.user">
                 select *from user;
                 select id as UserId,username as Username from user;
             </select>
        
    2. 配置;第二种没有第一种执行速度快,但是那个开发速度快;

        <!--配置,查询结果的列明和实体类的属性名的对应关系-->
          <resultMap id="userMap" type="com.itheima.daomin.user">
              <id property="userId" column="id"></id>
              <result property="userName" column="username"></result>
              <result property="userSex" column="sex"></result>
          </resultMap>
        <!--查询所有;这里改成usemap-->
          <select id ="findALl" resultType = "useMap">
              select *from user;
              select id as UserId,username as Username from user;
          </select>
      
3代理DAO和实现类两种实现类型:
4url(协议,主机:端口,uri)>uri
5再次更新那个SqlMapConfig.xml
  • 可以配置perperties,例如,JDBCSeq.properties的配置文件,然后在引入这个配置文件;

  •   driver="com.mysql.jdbc.Driver
      url="jdbc:mysql://localhast:3306/eesy_mybatis
      username="root
      password="root"
    
    • mapper中的package标签
<?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>
    <properties resource="JDBCConfig.properties">

    </properties>
    <typeAliases>
        <!--用于配置别名,type属性指定是是别名,-->
        <typeAlias type="com.itheima.daomin.user" alias="user"></typeAlias>
        <!--domain所在的包,用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不在区分大小写-->
        <package name="com.itheima.daomin"/>
    </typeAliases>
    <environments default="mysql">
        <!--陪住环境-->
        <environment id="mysql">
            <!--配置事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="username"/>
                <property name="password" value="password"/>
            </dataSource>

        </environment>

    </environments>
    <mappers>
        <mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
        <!--指定接口所在的包,-->
        <package name="com.itheima.dao"/>
    </mappers>
</configuration>

第四天:

一连接池:

​ 是一个ArrayList的集合;

  • type的类型:
    • POOLED :从池子里面拿一个.用完了返回池子;
    • UNPOOLED:不从池子拿,新建一个;用完关闭就行;
    • JNDI 采用服务器提供的JDNI技术实现.

二SQL深入

动态sql:
  1. if标签

  2. where标签

  3. foreach标签

  4. 代码抽取封装:(注意不要加;了,后面的拼接可能出问题;)

    1.   <sql id="defaultUser">
               select * from user   
           </sql>
           <select id ="findALl" resultType = "com.itheima.daomin.user">
               <include refid="defaultUser"></include>
               select id as UserId,username as Username from user;
           </select>
      

三多表

一对一

 </resultMap>
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="aid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射,配置封装内容-->
        <association property="user" column="uid" javaType="user">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="sex" column="sex"></result>

        </association>
    </resultMap>

一对多

  <!--一对多方法-->
    <resultMap id="userAccpuntMap" type="user">
        <id property=" id" column="id"></id>
        <result property="username" column="username"></result>
        
        <collection property="accounts" ofType="account">
            <id property="id" column="aid"></id>
            <result property=" uid" column="uid"></result>
        </collection>
<!--联合左查询语句-->
    </resultMap>
     <select id="findAll">
         select * from user u left outer jion account a on u.id = a.uid;
     </select>

多对多 ;中间表:

  1. 建立两张表,中间表.中间表包含各自的主键和外键;
  2. 建立两个实体类:各自包含对方一个集合引用
  3. 建立两个配置文件
  4. 实现配置:查询用户时;可以同时得到用户所包含的角色信息;查询角色时,能得到角色的所赋予的用户信息

第五天:代理注解.二级缓冲.延迟加载;

一 延迟加载;

​ 立即加载和延迟加载;

在SqlConfig.xml的主文件配置延迟加载的设置;可以去官网查找;

<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

二缓存:

(1)适合于缓存的情况:

  1. ​ 经常查询不经常改变的
  2. 影响不大的;

不适合的情况:

  1. 经常改变的
  2. 数据的正确结果影响很大的

(2)Mybatis的一级缓存和二级缓存:

(3) **一级:默认,**指的是SqlSeesion对象的缓存;

​ 可以使用sqlSeesion.clenCache()清除缓存;

但是当调用 SqlSsion的更新时,会从内存更新,不会走缓存了;

(2)二级缓存:指的是SqlSessionFactory的缓存;所有的Sesssion都能使用;

  • 先在映射的userDao.xml设置
    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 ="com/heima.dao.IUserDao">
        <!--开启user支持二级缓存-->
        <cache></cache>
    
    <select id ="findALl"   resultMap="usermap"  useCache="true" >
    
    再主配置文件设置:
     <settings>
            <setting name="cacheEnable" value="ture"/>
        </settings>
    
    

注解开发:

完整版–标准版本的主配置文件:

<?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>
    <properties resource="JDBC.COngfig.properties"></properties>
    <typeAliases>
        <package name="com.itheima.domain"/>
    </typeAliases>
    <environments default="mysql">
        <!--陪住环境-->
        <environment id="mysql">
            <!--配置事务-->
            <transactionManager   type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${Driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>

        </environment>
    </environments>
    <mappers>
        <!--这一句在注解里面是不用的,可以不写;这是配置映射xml的文件格式;同时用注解的时候,不能在dao下选择用xml,就会报错,只能选择一个-->
        <mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
       
        
        <package name="com.itheima.dao"/>
    </mappers>
</configuration>

2一个标准的test.java;

public class MybitsAnnoTest {

    public static void main(String[] args) throws IOException {
        //1获取字节输入流
         InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
         //2 根据字节输入流创建SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3生成SelSeesion
        SqlSession session = factory.openSession();
        //4生成代理
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5执行方法
        List<User> users = userDao.findAll();
        //6释放资源
        session.close();


    }
}

public class MybitsAnnoTest {

public static void main(String[] args) throws IOException {
    //1获取字节输入流
     InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
     //2 根据字节输入流创建SqlSessionFactory
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    //3生成SelSeesion
    SqlSession session = factory.openSession();
    //4生成代理
    IUserDao userDao = session.getMapper(IUserDao.class);
    //5执行方法
    List<User> users = userDao.findAll();
    //6释放资源
    session.close();


}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值