MyBatis个人笔记(1.2版本)

Posted 霏ིྀ宇ིྀ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis个人笔记(1.2版本)相关的知识,希望对你有一定的参考价值。

MyBatis个人笔记

MyBatis

  1. mybatis优势
    mybatis与jdbc、hibernate的对⽐:

jdbc:代码⽐较多,开发效率低,重复代码多,业务代码和数据库操作混杂⼀起。在代码块中对象要创建和销毁,查询的结果要封装 list。

hibernate:全⾃动

mybatis:提供访问数据库基本功能,半⾃动,sql与java编码分离,轻量级的框架

一、Mybatis介绍

MyBatis是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

二、mybatis快速入门

1.1 准备开发环境

  1. 创建普通java项目或者是JavaWeb项目

  2. 添加相应的jar包

  1. 创建数据库
  2. 配置 MyBatis
    配置 MyBatis 有多种方式,使用最基础最常用的 XML 形式进行配置

使用 XML 形式进行配置,首先在 src/main/resourc es 下面创建 mybatis-config.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 >
    <!--    log4j日志组件的使用-->
    <properties resource="db.properties">
    </properties>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <setting name="useGeneratedKeys" value="true"/>
    </settings>
    <typeAliases>
<!--        <typeAlias type="com.qq.model.Book" alias="Book"/>  -->
        <package name="com.qq.model"/>
    </typeAliases>

    <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/shop?serverTimezone=Hongkong&amp;useSSL=false&amp;characterEncoding=utf-8&amp;useUnicode=true" />
                <property name="username" value="$username"/>
                <property name="password" value="$password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
         <!--<mapper resource="com/qq/mapper/BookMapper.xml"></mapper>-->
         <!--<mapper class="com.qq.mapper.BookMapper"></mapper>-->
         <!--<mapper url="file:///E:\\HQYJ\\studyMybatis\\src\\com\\qq\\mapper\\BookMapper.xml"></mapper>-->
        <package name="com.qq.mapper"/>
    </mappers>

</configuration>

Mybatis 核心配置文件解析

 <?xml version="1.0" encoding="UTF-8" ?>

<?xml ?>:报文头格式,报文头内容放在xml和?符号中间

version="1.0":声明使用的xml版本

encoding="utf-8":声明用xml传输数据时候用的字符编码(字符集)

验证文档:<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
在全集配置文件中引入dtd约束“http://mybatis.org/dtd/mybatis-3-config.dtd”


根节点是<configuration>:
 Configuration类的位置org.apache.ibatis.session.Configuration
Configuration类保存了所有Mybatis的配置信息。
一般情况下Mybatis在运行过程中只会创建一个Configration对象,并且配置信息不能再被修改。
Configuration的属性
configuration的属性主要分为两大部分:
1. 从mybatis-config.xml中读取的配置
2. 从mapper配置文件或Mapper注解读取的配置
    
可选的properties节点:
properties属性----引入外部properties配置文件
    可以使用properties节点来指定.properties文件,那么后面在很多需要的地方,就可以用$xxx的形式从.properties文件中取值。这样的好处是可以把重要、独立、机密的一些值统一放到.properties文件中,便于管理。
我们把配置文件中基础信息单独写在db.properties文件中
    <properties resource="db.properties">           //指定文件
	<property name="db.username" value="root"/>   //也可以在这里传值
	<property name="db.password" value="123456"/>
     </properties>
注意一个问题:
在配置文件中,url 路径中有 & 符号,会使用 &amp; 来代替,当我们把url抽离出来,放到xxx.properties 文件中时,需要把  &amp; 改成 & 。

<settings> 中的 ogimp 属性配置指定使用 LOG4J 输出日志
    cacheEnabled
    lazyLoadingEnabled
    logImpl
 
类名别名(typeAliases)
   如果嫌有时写类型名太长,比如上面的查询结果类型resultType="com.qq.model.Book"的名写着太长,可以使用类型别名方式,这要在基本配置文件中使用<typeAliases>指定。
    <typeAliases>
        以使用类型别名方式,这要在基本配置文件中使用<typeAliases>指定。
        方式一:<!--<typeAlias type="com.qq.model.Book" alias="Book"/>  -->
        这样我们后面在映射文件中就可以写成resultType="Book"了
        方式二:也可以使用一个包名
        <package name="com.qq.model"/>
    </typeAliases>
    
<environments>环境 配置中 主要 配置了数据库连接,数据库的 url
jdbc:mysql://localhost:3306/mybatis ,使用的是本机 MySQL 中的 mybatis
数据库,后面的 username password 分别是数据库的用户名和密码(如果你的数据库用户名及密码和这里的不 样,请修改为自己数据库可用的用户名和密码〉   
    <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/lib?characterEncoding=utf-8" />
			<property name="username" value="root"/><property name="username" value="$db.username"/>
			<property name="password" value="123456" /><property name="password" value="$db.password" />
		</dataSource>
	</environment>
</environments>

<mappers></mappers>中配置了 个包含完整类路径的 CountryMapper.xml ,这是 MyBatis
SQL 语句和映射配置文件  
  最常用的配置:
<!--每一个Mapper.xml(sql映射文件)都需要在Mybatis核心文件中注册!-->
<mappers>
    <mapper resource="com/lxc/dao/UserMapper.xml"></mapper>
</mappers>
Mybatis中mappers的映射配置:
    一、通过resource加载单个映射文件:
      1.通过<mapper resource=""/>
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/>
</mappers>
      2.通过<mapper url=""/>
    <mappers>
    <mapper url="D:\\myeclipse\\word\\mybatis\\config\\mapper\\UserMapper.xml"/>    
</mappers>
    3.通过mapper接口加载
    <!--  需要将mapper接口类名和mapper.xml映射文件名称保持一致且在同一个目录中,
     注意:要使用的是mapper代理。两个文件要在同一个目录  -->
<mappers>
    <mapper class="dancheng.mybatis.mapper.UserMapper"/>
</mappers>
    二、批量加载
    指定mapper接口包名
    <!--  需要将mapper接口类名和mapper.xml映射文件名称保持一致且在同一个目录中,
     注意:要使用的是mapper代理。两个文件要在同一个目录    -->
<mappers>
    <package name="dancheng.mybatis.mapper"/>
</mappers>
    
    在数据库中,由于大多数数据库设置不区分大小写 ,因此下画线方式的命名很常见,如
user name user email 。在 Java 中, 般都使用驼峰式命名,如 userName userEmail
因为数据库和 Java 中的这两种命名方式很常见,因此 MyBatis 还提供 个全局属性
mapUnderscoreToCamelCase ,通过配置这个属性为 true 可以自动将以下画线方式命名的
数据库列映射到 Java 对象的驼峰式命名属性中。这个属性默认为 false ,如果想要使用该功能,
需要在 MyBatis 的配置文件(mybatis-config.xml 文件)中增加如下配置。
    <settings>
	<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
    如果使用了这个驼峰转换,在查询select数据时可以进行智能的匹配(以便得到的字段值填入实体类对象成员),但是在插入insert和修改update数据时不能智能匹配(此时必须给出类中成员的真名)

根节点内的子节点的顺序是固定的:

The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

2.2 用mybatis去访问数据库的三种编码方式

(一)xml映射文件 + sqlSession调用相应的方法

框架已经设计了多个方法供使用,如selectOne(statement,id),该statement是“命名空间与映射文件中的id组成的字符串”,则就运行起sql语句了(此方式已过时,但常作为入门写法学习)。(这是直接执行id号的感觉,也可以往里面传输丰富的参数值,得到的对象也是指定了类型)

  1. 定义操作Book表的sql映射文件BookMapper.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.qq.mapper.BookMapper">
    
        <select id="selectOne" parameterType="int" resultType="com.qq.model.Book" >
            select * from book where id=#id
        </select>
    
        <select id="selectAll" resultType="Book" >
            select * from book
        </select>
    
        <insert id="insertOne"  keyProperty="id" parameterType="com.qq.model.Book">
    <!--        <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">-->
    <!--            SELECT LAST_INSERT_ID()-->
    <!--        </selectKey>-->
            insert into book (name,author,price)
            values (#name,#author,#price)
        </insert>
        <insert id="insertOne2">
            insert into book (name,author,price)
                values (#name,#author,#price)
        </insert>
        <insert id="insertOne3" >
            insert into book (name,author,price)
            values (#name,#author,#price)
        </insert>
        <update id="modify" parameterType="com.qq.model.Book">
            update book
            set name=#name,
                <if test="author!=null and author!=''">
                    author=#author,
                </if>
            price=#price where id=#id
        </update>
        <delete id="deleteById" >
            delete from book
            where id=#id
        </delete>
    
        <select id="selectByName" parameterType="String" resultType="com.qq.model.Book" >
            select * from book where name like #name
        </select>
        <select id="selectByName2" parameterType="String" resultType="com.qq.model.Book" >
            select * from book where name like '%#name%'
        </select>
        <select id="selectByName3" parameterType="String" resultType="com.qq.model.Book" >
            select * from book where name like concat( '%',#name , '%')
        </select>
        <select id="selectByName4" parameterType="String" resultType="com.qq.model.Book" >
            select * from book where name like '%$value%'
        </select>
        <select id="queryOrder" parameterType="string" resultType="com.qq.model.Book">
    
            select * from book order by CONVERT($value USING gbk)
    
        </select>
        <select id='queryOrder1' parameterType='string' resultType='com.qq.model.Book'>
            select * from book where  lower(name)  LIKE  lower('%$value%')
        </select>
    
    
    
    
    </mapper>
    
    

    MySQL 定义在 BookMapper.xml 文件中,里面的配置作用如下:

    • XML 的根元素 属性 ηamespace 定义了当 XML 的命名 空间。

    • <select >元素 :我们所定义的一个 SELECT 查询。
      
    • id 属性:定义了当前 SELECT 查询的唯一一个id

    • resultType :定义了当前查询的返回值类型

    • select id, …: 查询 SQL 语句。

    • parameterType:该参数只表示一个参数类型,其中@Param和parameterType 二者存其一即可

  2. 编写测试

package com.qq;

import com.qq.model.Book;
import com.qq.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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

/**
 * @description:com.qq_studyMybatis
 * @author: 霏宇
 * @time: 2022/7/24,15:48
 * (一)xml映射文件  + sqlSession调用相应的方法
 */
public class MyTest1 
    public static void main(String[] args) 


       SqlSession  session = MybatisUtil.getSqlSession();
       List<Book> books= session.selectList("com.qq.mapper.BookMapper.selectAll");
        for (Book one : books) 
            System.out.println(one.toString());

        
        String statement1 = "com.qq.mapper.BookMapper.selectOne";
        Book book = session.selectOne(statement1, 1); // 隐式强转
        System.out.println(book.toString());


        String statement="com.qq.mapper.BookMapper.insertOne";
        Book book1 =new Book();
        book1.setName("最丑的男人");
        book1.setAuthor("2");
        book1.setPrice(5.0);

        int num = session.insert(statement,book1);
        System.out.println("受影响的行数=" + num);
        session.commit();//一定要有这句
        session.close();

        for (Book one : books) 
            System.out.println(one.toString());

        
    


(二)xml映射文件 + java接口方式

Xml文件中的sql语句,和java接口中的方法相对应。

sqlSession可以获取接口对象,(接口能被框架实例化出类对象),然后利用这个对象调其中的方法。

这种方式要多写一个接口Interface以及其中的抽象方法。此方式整体功能强大,是目前最多使用的方式。

这种方式的有个必须满足的要求就是Mapper.xml文件的根标签的namespace属性的值需要写成接口的全限定名。虽然,XxxxMapper.xml与XxxxMapper.java是可以放置在不同的文件夹下面,不过呢,笔者一般是把.java接口文件和xml文件并列放在挨在一起的,这行都这样做。

BookMapper接口文件代码:

package com.qq.mapper;
import com.qq.model.Book;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * @description:com.qq.mapper_studyMybatis
 * @author: 霏宇
 * @time: 2022/7/25,9:17
 *
 */
public interface BookMapper 
     List<Book>selectAll();
     Book selectOne以上是关于MyBatis个人笔记(1.2版本)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习 -每天一记(驼峰命名匹配)

mybatis-plus配置返回map自动转换为驼峰

MyBatis 笔记

mybatis-generator 生成代码字段名默认按驼峰命名,可否设置

MyBatis学习笔记

MyBatis学习笔记