Mybatis-01

一、mybatis准备及介绍

mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集代码。

1、如何获得mybatis

中文文档:https://mybatis.org/mybatis-3/zh/getting-started.html

github:https://github.com/mybatis/mybatis-3

maven仓库:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>

2、持久化:数据持久化

持久化就是将程序的数据在持久状态和瞬时状态转化的过程

内存:断电即失

为什么需要持久化:有一些对象不能让他丢掉(比如账户余额...) 另一个原因就是内存太贵了,做持久化也能更好地节省内存。

3、持久层

Dao层 Service层 Controller层...等等都是层,每个层都有自己具体的业务

mybatis是一款优秀的持久层框架

框架 : 按照相应的步骤填写相应的东西,他就能帮你做原来要很多代码才能做的事情。

就好比一张白纸,你要填写简历,你要自己画出来框框再写,才能用。现在面试的公司直接给你一张已经画好表格的纸,你只需要直接填写好个人信息就能当作简历。

二、Mybatis程序

1、思路:搭建环境-->导入jar包(Mybatis jar包)-->编写代码-->测试代码

0.1、搭建环境 数据库

0.2、新建项目 新建一个普通的maven项目 删除src目录 就可以当作父工程

  导入Maven依赖

   <!--导入依赖-->
    <dependencies>
        <!--mysql驱动jar-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <!--mybatis jar-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

0.3、创建模块

这样做的好处就是子项目再也不用去导包,因为它父项目中已经导过包了

在创建好的模块中的resources创建配置文件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">
<!--核心配置文件-->
<!--自己修改property中的value参数-->
<configuration>
    <environments default="development"><!--环境-->
        <environment id="development"><!--具体环境-->
            <transactionManager type="JDBC"/><!--事务管理,默认用的是jdbc的-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:8080/mybatis?serverTimezone=UTC&amp;userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="space/urbeautiful/dao/UserMapper.xml"/>
    </mappers>
</configuration>
<!--写完得mapper记得在这里注册mapper才能使用 不然Java怎么知道你调用得mapper是谁 路径记得用/-->
<!--不配置就会报一个异常  org.apache.ibatis.binding.BindingException: Type interface space.urbeautiful.dao.UserDao is not known to the MapperRegistry.-->

0.4、编写mybatis工具类

//其实就做了两件事  把资源加载进来,并创建一个能执行sql的对象
//SqlSessionFactory  工厂模式   --->SqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;//提升作用域 方便下面方法调用 不然在trycatch中调用不到
    static{
        InputStream inputStream = null;
        try {
            //使用mybatis的第一步,获取SqlSessionFactory对象
            //有了获取SqlSessionFactory对象,我们就可以从中获得SqlSession实例了 SqlSession完全包含了面向数据库执行sql命令所需的所有方法
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(inputStream!=null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //static方便调用对象
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();//.openSession之后拿到一个SqlSession对象
    }
}

2、编写代码

0.1、编写实体类 操作数据库那就要写实体类 一个表对应一个类

0.2、接口---->接口实现类 操作实体类的实现类

public interface UserDao {
    List<User> getUser();
}
<!--接口实现类  现在用.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"> <!--命名空间namespace=绑定一个对应Dao/Mapper接口 绑定之后就相当于是之前实现了这个接口--> <!-- id=“” 代表之前实现类中重写的方法名 resultType="" 代表实现类方法中的返回值类型 可以这样理解:和以前做的操作没有本质上的区别 以前是创建一个UserDao的实现类,现在我们是写一个标签 以前重写接口中的方法,现在id中设置重写的方法 以前是返回一个结果,现在在resultTtpe中设置返回值类型 以前写实现类的时候还要写一些connection prepareStatement resultSet等 现在mybatis都给简化了 现在的这个Mapper配置文件就相当于之前的实现类 --> <mapper namespace="space.urbeautiful.dao.UserDao"> <select id="getUser" resultType="space.urbeautiful.pojo.User"> select * from mybatis.user </select> </mapper>

0.3、测试代码

三、CRUD

查询的时候不需要提交,因为只是在数据库中查询,并不会对表结构造成影响。

但是增删改操作会对数据库中的表造成影响,所以必须提交事务,保持事务的特性。ACID

 

个人对sqlSession的理解:可以把sqlSession看作是Connection,也可以把sqlSession看成是PrepareStatement;因为提交事务是connection.commit() 执行sql是PrepareStatement对象。

sqlSession是执行sql的对象,sqlSession用于提交事务。所以看不明白时可以先把它看成是Connection + PrepareStatement结合体~

原文地址:https://www.cnblogs.com/jzspace/p/13168539.html