MyBatis学习笔记(一)

一、MyBatis 简介

1.1 MyBatis 特性

  • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
  • MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架

1.2 和其它持久化层技术对比

  1. JDBC
    • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
    • 代码冗长,开发效率低
  2. Hibernate 和 JPA
    • 操作简便,开发效率高
    • 程序中的长难复杂 SQL 需要绕过框架
    • 内部自动生产的 SQL,不容易做特殊优化
    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降
  3. MyBatis
    • 轻量级,性能出色
    • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
    • 开发效率稍逊于HIbernate,但是完全能够接受

二、搭建 MyBatis

  1. 引入依赖:

    <dependencies>
        <!-- Mybatis核心 -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.7</version>
        </dependency>
    
        <!-- junit测试 -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
    
        <!-- MySQL驱动 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.8</version>
        </dependency>
    
      </dependencies>
    
  2. 创建MyBatis的核心配置文件

    • 习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
    • 核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息;核心配置文件存放的位置是src/main/resources目录下
    <?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="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
          </dataSource>
        </environment>
      </environments>
      <!--引入映射文件-->
      <mappers>
        <package name="mappers/UserMapper.xml"/>
      </mappers>
    </configuration>
    
  3. 创建 mapper 接口:

    MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。

    public interface UserMapper {
      /*** 添加用户信息 */
      public int insertUser();
    }
    
  4. 创建 MyBatis 的映射文件:

    1. 相关概念:ORMObject Relationship Mapping)对象关系映射。
    • 对象:Java的实体类对象

    • 关系:关系型数据库

    • 映射:二者之间的对应关系

    • 在这里插入图片描述

    • 映射文件的命名规则:表所对应的实体类的类名+Mapper.xml

      例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml;因此一个映射文件对应一个实体类,对应一张表的操作;MyBatis映射文件用于编写SQL,访问以及操作表中的数据;MyBatis映射文件存放的位置是src/main/resources/mappers目录下

    • MyBatis中可以面向接口操作数据,要保证两个一致:a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致;b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

    • <?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.cgg.mybatis.mapper.UserMapper">
          <!--
              mapper接口和映射文件要保证两个一致:
              1、mapper接口的全类名和映射文件的namespace一致
              2、mapper接口中的方法的方法名要和映射文件中的sql的id保持一致
          -->
          <!--int insertUser();-->
          <insert id="insertUser">
                  insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
          </insert>
      </mapper>
      
  5. 通过 junit 测试功能:

    • SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)

    • SqlSessionFactory:是“生产”SqlSession的“工厂”。

    • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

    //获取核心配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //获取SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            //获取sql的会话对象SqlSession(不会自动提交事务),是MyBatis提供的操作数据库的对象
            //SqlSession sqlSession = sqlSessionFactory.openSession();
            //获取sql的会话对象SqlSession(会自动提交事务),是MyBatis提供的操作数据库的对象
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            //获取UserMapper的代理实现类对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //调用mapper接口中的方法,实现添加用户信息的功能
            int result = mapper.insertUser();
            //提供sql以及的唯一标识找到sql并执行,唯一标识是namespace.sqlId
            /*int result = sqlSession.insert("com.atguigu.mybatis.mapper.UserMapper.insertUser");*/
            System.out.println("结果:"+result);
            //提交事务
            //sqlSession.commit();
            //关闭SqlSession
            sqlSession.close();
    
  6. 加入 log4j 日志功能

    log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
        <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <param name="Encoding" value="UTF-8" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
            </layout>
        </appender>
        <logger name="java.sql">
            <level value="debug" />
        </logger>
        <logger name="org.apache.ibatis">
            <level value="info" />
        </logger>
        <root>
            <level value="debug" />
            <appender-ref ref="STDOUT" />
        </root>
    </log4j:configuration>
    

    日志的级别

    FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)

    从左到右打印的内容越来越详细

  7. 核心配置文件详解:

    核心配置文件中的标签必须按照固定的顺序:

    properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,refl

    ectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?

    <?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>
    
      <!--MyBatis核心配置文件中,标签的顺序:
      properties?,settings?,typeAliases?,typeHandlers?,
      objectFactory?,objectWrapperFactory?,reflectorFactory?,
      plugins?,environments?,databaseIdProvider?,
      mappers? -->
      <!--引入properties文件-->
      <properties resource="jdbc.properties" />
      <!--设置类型别名-->
      <typeAliases>
        <!--typeAlias:设置某个类型的别名 属性:type:
        设置需要设置别名的类型 alias:设置某个类型的别名,若不设置该属性,
        那么该类型拥有默认的别名,即类名 且不区分大小写 -->
        <!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>-->
        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.cgg.mybatis.pojo"/>
      </typeAliases>
      <!--设置连接数据库的环境-->
      <environments default="development">
        <!--
            environments:配置连接数据库的环境
            属性:
            default:设置默认使用的环境的id
        -->
        <environment id="development">
          <!--
                environment:设置一个具体的连接数据库的环境
                属性:
                id:设置环境的唯一标识,不能重复
            -->
    
          <!--
                    transactionManager:设置事务管理器
                    属性:
                    type:设置事务管理的方式
                    type="JDBC|MANAGED"
                    JDBC:表示使用JDBC中原生的事务管理方式
                    MANAGED:被管理,例如Spring
                -->
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
          </dataSource>
        </environment>
    
        <environment id="test">
          <transactionManager type="JDBC"/>
    
          <!--
                    dataSource:设置数据源
                    属性:
                    type:设置数据源的类型
                    type="POOLED|UNPOOLED|JNDI"
                    POOLED:表示使用数据库连接池
                    UNPOOLED:表示不使用数据库连接池
                    JNDI:表示使用上下文中的数据源
                -->
          <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
          </dataSource>
        </environment>
      </environments>
      <!--引入映射文件-->
      <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
      </mappers>
    </configuration>
    
  8. MyBatis 的增删改查

    <!--int insertUser();-->
        <insert id="insertUser">
                insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
        </insert>
        <!--int updateUser();-->
        <update id="updateUser">
          update t_user set username='root',password='123' where id = 2
        </update>
      <!--int deleteUser();-->
      <delete id="deleteUser">
        delete from t_user where id = 2
      </delete>
    
    <!--  User selectUserById-->
      <!--
            resultType:设置结果类型,即查询的数据要转换为的java类型
            resultMap:自定义映射,处理多对一或一对多的映射关系
        -->
      <select id="selectUserById" resultType="User">
        select * from t_user where id = 1
      </select>
    
      <!--  User selectAllUser-->
      <select id="selectAllUser" resultType="User">
        select * from t_user
      </select>
    

    注意:

    1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射

    关系

    resultType:自动映射,用于属性名和表中字段名一致的情况

    resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

三、MyBatis 获取参数值的两种方式

MyBatis获取参数值的两种方式:${}#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

3.1 单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型
此时可以使用**$ {}和# {}**以任意的名称获取参数的值,注意${}需要手动加单引号

3.2 多个字面量类型的参数

若mapper接口中的方法参数为多个时

此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以param1,param2…为键,以参数为值;因此只需要通过**KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}**访问map集合的键就可…{}需要手动加单引号

3.3 map 集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中,只需要通过**KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}**访问map集合的键就可…{}需要手动加单引号

3.4 实体类类型的参数

若mapper接口中的方法参数为实体类对象时
此时可以使用**KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}**,通过访问实体类对象中…{}需要手动加单引号

3.5 使用 @Param标识参数

可以通过@Param注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以
param1,param2…为键,以参数为值;只需要通过**KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}**访问map集合的键就可…{}需要手动加单引号

四、MyBatis 的各种查询功能

4.1 查询一个实体类对象

<!--  public User getUserById(@Param("id") String id);-->
  <select id="getUserById" resultType="user">
    select * from t_user where id = #{id}
  </select>

4.2 查询一个 list集合

<!--  public List<User> getAllUser();-->
  <select id="getAllUser" resultType="User">
    select * from t_user
  </select>

当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常

TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值

4.3 查询单个数据

<!--  public int getCount();-->
  <select id="getCount" resultType="int">
    select count(*) from t_user
  </select>

4.4 查询一条数据为 map 集合

<!--Map<String,Object> getUserToMap(@Param("id") int id);-->
  <select id="getUserToMap" resultType="map">
    select * from t_user where id = #{id}
  </select>

4.5 查询多条数据为map 集合

@MapKey("id")
  public Map<String, Object> getAllUserToMap();
<select id="getAllUserToMap" resultType="map">
    select * from t_user
  </select>

五、特殊SQL的执行

5.1 模糊查询

<!--List<User> getUserByLike(@Param("mohu") String mohu);-->
  <select id="mohuselect" resultType="User">
    <!--select * from t_user where username like '%${mohu}%'-->
    <!--select * from t_user where username like concat('%',#{mohu},'%')-->
    select * from t_user where username like "%"#{mohu}"%"
  </select>

5.2 批量删除

<!--void deleteMoreUser(@Param("ids") String ids);//ids:9,10-->
  <delete id="deleteMoreUser">
    delete from t_user where id in(${ids})
  </delete>

5.3 动态设置表名

<!--List<User> getUserList(@Param("tableName") String tableName);-->
  <select id="getUserList" resultType="User">
    select * from ${tableName}
  </select>

5.4 添加功能获取自增的主键

场景模拟:

t_clazz(clazz_id,clazz_name)

t_student(student_id,student_name,clazz_id)

1、添加班级信息

2、获取新添加的班级的id

3、为班级分配学生,即将某学的班级id修改为新添加的班级的id

/*** 
添加用户信息 * @param user * @return * useGeneratedKeys:
设置使用自增的主键 * keyProperty:因为增删改有统一的返回值是受影响的行数,
因此只能将获取的自增的主键放在传输的参 数user对象的某个属性中 
*/ 
int insertUser(User user); 
<!--int insertUser(User user);--> 
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> 
insert into t_user values(null,#{username},#{password},#{age},#{sex}) 
</insert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程哥哥吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值