Mybatis学习(idea版配Maven)

Mybatis 的学习

0.0 idea关键坑补充

idea和eclipse中不同的是,idea使用的tomcat不会创建一个副本,而是直接采用了原先的tomcat,会采用原先的tomcat原型配置

idea修改css不起作用

右键清空缓存

本来以为是idea的问题,但是其实我已经开了热部署
而且jsp文件也可以正常修改
最后发现是浏览器的锅QAQ

0.1 JDBC连接数据库默认坑

我们需要了解JDBC的事务是自动提交的,什么是自动提交?

1)只执行任意一条DML(增删改)语句,则提交一次。JDBC默认的提交方式是自动提交,是JDBC默认的事务行为

2)在实际开发业务中,通常都是N条DML语句共同联合才能完成的,必须保证DML语句在一个事务中同时成功或者同时失败

1.1 什么是Mybatis

Mybatis其实是ssm中最后的m,其作用主要是简化了数据库的使用

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

持久化:将数据持久化就是将数据存储在数据库中,换一种说法,就是将在内存中的数据转换为能够永久存储的数据,所以任何将数据永久存储的方式都是一种持久化

1.2 为什么需要MyBatis

  • 简化了JDBC的操作
  • 帮助程序员将数据存储到数据库中
  • 不用也可以,只要会底层代码
  • 因为使用的人多

1.3 MyBatis使用

思路:搭建环境----》导入MyBatis—》编写代码----》测试

1.3.1 搭建环境,导入MyBatis

idea中导入mybatis环境依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
 </dependency>
<!--注意此处一定要有连接数据库的jar包依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

在resource资源目录下创建mybatis-config.xml文件配置mybatis,每个标签的顺序不能轻易改变

<?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="db.properties"/>
    
    <!--配置日志-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>

            <!--配置数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--以下部分自己写-->
                <property name="url" value="jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&amp;characterEncoding=utf-8&amp;userSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123.com"/>
            </dataSource>

        </environment>
    </environments>
    <!--映射文件配置,非常重要-->
    <mappers>
        <mapper resource="com/hr/daos/UserMapper.xml" />
	<!--resource属性里面要用斜杠-->
    </mappers>
</configuration>

在pom.xml中添加如下代码,可以阻止资源过滤问题(MAVEN中默认将配置文件存放入src下的resource文件夹下,导出时默认导出resource文件夹下的xml文件,其他地方的xml文件不导出):

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

配置java资源路径下的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="org.mybatis.example.BlogMapper">//这个xml父接口所在的位置
    //下面是相关的sql语句
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

1.3.2 编写代码

固定格式:

String resource = "org/mybatis/example/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream( resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build( inputStream);
//可以包装成工具类

package com.hr.utils;

import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
//            如果在resource文件夹下可自动导入,无路径
            String resource = "Mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
//            得到SqlSessionFactory对象,生产SqlSession对象,用来执行Sql语句
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

1.4 Mybatis 配置文件优化

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

Mybatis默认的事务管理器就是JDBC,默认数据源管理方式(连接池):POOLED

1.4.1 属性优化(重要)

1.4.1.2 可以通过properties标签来配置属性
1.4.1.3 可以通过db.properties文件来配置属性
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&characterEncoding=utf-8&useSSL=true
username = root
password = 123.com

然后在Mybatis-config.xml文件中进行配置

<!--直接引入外部properties文件即可,顺序不可改变  -->
    <properties resource="database.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>

            <!--配置数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--以下部分自己写-->
                <property name="url" value="jdbc:mysql://localhost:3306/bdcstd?useUnicode=true&amp;characterEncoding=utf-8&amp;userSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123.com"/>
            </dataSource>

        </environment>
    </environments>

1.4.2 别名优化(typeAliases)(重要)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<!--第一种方式,直接给指定的实体类起一个别名,即可以在任何Mapper.xml文件中使用-->
    <typeAliases>
        <typeAlias type="com.hr.pojos.User" alias="User"/>
    </typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

<!--第二种方式,直接指定实体类所在的包名,会自动到包下找相同的类名,即可以在任何Mapper.xml文件中使用-->
    <typeAliases>
        <package name="com.hr.pojos"/>
    </typeAliases>
  • 第一种方式可以自定义别名,第二种可以通过注解定义别名
@Alias("User01")
public class User implements Serializable {}
  • 第一种适用于类的数量较少的情况,第二种适用于类较多的情况

常用别名:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

1.4.3 Setting 设置(重要)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true | falsefalse
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J未设置

一个配置完整的 settings 元素的示例如下:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

Spring之后就用不到了

1.4 .4 mapper 映射器配置

使用相对于类路径的资源引用

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

使用完全限定资源定位符(URL)(已经完全淘汰)

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

使用映射器接口实现类的完全限定类名

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

注意点

  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

将包内的映射器接口实现全部注册为映射器

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

注意点

  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

1.4.5 其他配置

  • typeHandlers(类处理器)
  • objectFactory(对象工厂)
  • plugins插件
    • Mybatis-generator-core:自动生成mysql代码
    • Mybatis-plus:能够跟深一步简化Mybatis
    • 通用mapper

可以使用RowBounds进行分页开发

1.5 Mybatis注解开发

核心就是利用反射进行开发

步骤

​ 1、只需要一个接口,不需要配套的xml文件,直接在接口上定义sql语句

package com.hr.mappers;
import com.hr.beans.Book;
import org.apache.ibatis.annotations.Select;
import java.util.List;

public interface BookMapper {
    @Select("select * from allbook")
    public List<Book> selectAllBook();
}


​ 2、需要在Mybatis-config中写明接口的位置

<mapper class="com.hr.mappers.BookMapper"></mapper>

​ 3、进行测试

public void testBookMapper(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        List<Book> books = mapper.selectAllBook();
        for (Book book : books) {
            System.out.println(book);
        }
    }

本质:反射机制

底层:动态代理

Mybatis解决数据库字段名和实体类属性名不一致的问题

Mybatis映射为javaBean的方式是根据数据库和bean中的属性字段一一对应然后通过反射进行赋值创建,所以要想成功映射,必须确保数据库中的字段名和bean中属性名相同,但是,有时也不得不进行一些配置也能完成成功的映射,下面的三种方式就是当数据库中的字段名和bean中属性名不同时进行的操作

方法一:使用别名的形式

<select id="findByTel" resultType="user">
    select user_id as userId, age, sex ,address from tb_user where user_id=#{id}
</select>

方法二:使用resultMap映射实体类属性名和表的字段名一一对应关系

img

方法三:在核心配置文件中启用下划线与驼峰式命名规则的映射

<configuration>  
     <settings>  
          <setting name="mapUnderscoreToCamelCase" value="true" />  
     </settings>  
</configuration>

1.6 动态Sql语句创建

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值