mybatis入门学习

  • Post author:
  • Post category:其他


项目的搭建可以参考IDEA专栏的构建方式:

mybatis项目创建1

1.借用别人总结的流程图

2 添加坐标,可以参考官方文档,即下载jar包的时候会带有英文文档

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.1</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.9</version>
</dependency>

更新pom文件

3 创建实体

4 编写 Dao 接口

5 编写 Dao 接口 Mapper 映射文件 StudentDao.xml

要求:

1. 在 dao 包中创建文件 StudentDao.xml

2. 要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。

new — file–StudentDao.xml

为了编译.xml能进入class文件夹中,需要加入编译插件

编译没有文件解决常用方法:

1)maven–lifecycle–clean–complier

2) Build–Rebuild Project

3) 重启IDEA  file–Innalidate Caches/Resatart– 第一个按钮

4)都用不到的话直接将文件拷贝到classes文件夹下

6 建立主配置文件mybatis.xml,主要定义数据库的配置信息,基本都是固定的,只要改库相关信息即可。

设置控制输出日志到控制台上。

<dataSource type="POOLED">负责创建连接池

7 创建mybatis类

mybatis项目总结必备步骤(

重要

):

1)加入maven依赖

2)创建dao接口,写符合业务场景的方法

3)创建mapper文件(sql映射文件)来写sql,对应接口中的方法

4)创建mybatis主配置文件(连接数据库信息和指定mapper文件位置)

5)使用mybatis的对象sqlSession来执行sql语句

二、概念引入:

1)mybtis可以理解为增强的jdbc

三层架构对应的框架framework(可以理解为一个模板,根据自己的业务增加到模板中,框架已包含常用的功能,半成品软件)

界面层–springmvc

业务逻辑层–spring

数据访问层–mybatis

2)为什么不用jdbc而选择mybatis

1)因为jdbc代码多且重复,开发效率低,需要进行connection statement result对象创建和销毁,业务代码和数据库操作混在一起。

2)mybatis作为sql映射框架,sql mapper可以将数据库表的一行数据映射成为一个java对象(一行数据可以看作是一个java对象);

开发人员不需要进行connection statement result对象创建和销毁;

执行sql的能力,不用手动执行sql;

能封装结果集;


开发人员只需要写sql正确就可以了!!


三、功能


3-1)

mybatis默认不是提交事务,需要sqlsession.commit();

开启日志可以看到sql等详细信息,有助于调试定位问题,可查看以上信息;

3-2)sqlSession

private Mybatis() {
        String resource = "xxx.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);
        sqlSession = factory.openSession(true);
    }

Resources:作为mybatis中的一个类,读取主配置文件内容;

SqlSessionFactoryBuilder:主要创建SqlSessionFactory ;

SqlSessionFactory :是一个重量级对象,程序创建一个对象消耗的时间长且使用资源多,为此一个项目中有一个SqlSessionFactory 对象即可。是一个接口,实现类是DefaultSqlSessionFactory .

主要作用是获取SqlSession对象;

sqlSession = factory.openSession(true);假设是factory.openSession()无参,获取的是非自动提交事务的SqlSession对象,有参为true则是自动提交事务,false是非自动提交事务的。

sqlSession 是一个接口,定义了不同的方法来操作数据。其实现类是DefaultsqlSession 。

使用规范:sqlSession对象不是线程安全的,需要在方法内部使用,执行sql之前需要获取sqlSession,执行完sql语句后需要关闭它,sqlSession。close(),这样保证是线程安全的。

3-3)mybatis动态代理(重要、理解)

mybatis会根据接口dao的方法调用,获取执行sql语句的信息,创建出一个dao接口的实现类(这也是我们不需要写dao接口实现类的原因),并创建这个类的对象,最终完成sqlSession调用方法,访问数据库。

mybatis会完成getSqlSession和sqlSession对应的CRUD方法操作,并且最后sqlSession.close()?

动态代理机制:使用sqlSession.getMapper(dao接口),能够获取dao接口对于实现类对象。

public class TestMybatisProxy {

    //测试功能
    @Test
    public void testSelect() throws IOException {

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        List<Student> list = studentDao.selectStudents();
        list.forEach(student -> System.out.println(student));

    }
}

insert方法需要提交事务sqlSession.commit();

结论总结:

mybatis动态代理使用的jdk的动态代理机制,深层目前暂时不需要深入理解;

后期项目都是使用动态代理方法!

3-4)

简单项目拷贝步骤

直接在IDEA代码文件夹中找到要拷贝的项目,复制一份—修改文件夹名称—删掉target文件夹和.iml文件—修改pom.xml中的坐标名称和文件夹名称一样;

IDEA软件操作:file—Project Struture—选择module—选择+号(import module)—选择需要导入的项目—选择module SDK—完成

导入完后需要手动将resource文件夹修改为mark directory as — resource root

四、参数(重点内容)

4-1)parameterType:写在mapper中的一个属性,表示的是dao接口中方法的参数的数据类型;mybatis会从这个参数中知道传入参数的类型。

parameterType 可以是java的全限定名称或者mybatis定义的别名(请参考文档),作用是简短点。

parameterType不是强制的,因为mybatis能通过反射机制发现接口参数的数据类型。

结论 是可以没有,平时写代码也是不写!!

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" > 

4-2)mybatis定义的简单类型参数:java的基本数据类型和String叫做简单类型,在mapper文件中通过#(任意字符)获取简单类型的一个参数的值。

4-3)mybatis是增强版的jdbc(jdbc步骤以及mybatis封装哪些步骤,可百度查看)

4-4)传参方式(1 2常用,其他较少使用)

1- @param 多个参数时,使用@param命名参数,格式:@Param(“参数名”) String name,推荐使用该方式。

2- 对象方式传参(实际项目中使用频次高,因为灵活方便):完成的语法格式:#{属性名,javaType=类型名称,jdbcType=数据类型},javaType指的是java中的属性数据类型,jdbcType指的是数据库中的数据类型(可以参考文档)

但是这样的写法在实际项目中比较少使用。

我们使用更多的简化方式:#{属性名}

3-按位置传参方式

#{arg0},#{arg1}

4-map传参方式

#{key}来获取对应的value值,可读性差,buzhi阿里开发手册也不建议参数使用map;

4-5) # $区别

# 安全性高,避免sql注入,效率高,代表的是列值。

$ 是字符串的替换,告诉mybatis传入的是字符串。

未完待续!



版权声明:本文为Icedeny原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。