17

Mybatis入门 Mybatis存在的意义 解决的问题 基本操作

 3 years ago
source link: http://www.cnblogs.com/pjhaymy/p/13905358.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Mybatis入门 Mybatis的作用 解决的问题 基本操作

2020103022221353.png#pic_center

为什么要学MyBatis

我们链接操作数据库需要做的步骤

package Test;

import java.sql.*;

public class test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取链接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3309/test", "root", "1234");
        //获取statement
        PreparedStatement statement = connection.prepareStatement("select id from user");
        //执行
        ResultSet resultSet = statement.executeQuery();
        //遍历结果集
        while(resultSet.next()){

        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

缺点:

原始jdbc开发存在的问题如下:

1.数据库创建及频繁释放造成系统资源浪费

2.sql语句在代码中硬编码,实际运用中sql的变化较大,sql变动需要改变java代码

3.查询操作,需要手动将结果集里的数据封装到实体中,插入操作时,需要手动将实体的数据设置到sql语句的占位符

解决方案:

1.使用数据库连接池技术

2.使用xml配置的方式配置sql语句

3.使用反射内省的技术自动将实体和表进行属性与字段的自动映射

这个解决方案不用我们去实现,因为mybatis都帮我们实现好了,站在前人的肩膀上干活总是省力

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

Mybatis是什么:

一个优秀的基于java的持久层框架,内部封装了jdbc,使开发者只需要关心sql语句本身,而不需要花费经历在如何加载驱动,创建链接,创建statement等繁杂的过程

mybatis通过注解和xml配置的方式将要执行各种statement配置起来。并通过java对象和statement中的动态参数进行映射生成最终执行的sql语句

最后mybatis框架执行sql语句并将其封装为java对象返回采用ORM思想解决了实体与数据库映射的问题,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

ORM简介:

ORM(Object Relational Mapping)对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 ,即将程序中的对象自动的持久化到关系数据库中

O(对象模型):

实体对象,即我们在程序中根据数据库表结构建立的一个个实体Entity。

R(关系型数据库的数据结构):

即我们建立的数据库表。

M(映射):

从R(数据库)到O(对象模型)的映射,可通过XML文件映射。

如图:当表实体发送变化时,ORM会帮助我们把实体的变化映射到数据库表。

20201030223631286.png#pic_center

作用

ORM框架自动实现Entity实体的属性与关系型数据库字段的映射。CRUD的工作则可以交给ORM来自动生成代码方式实现。隐藏了数据访问细节,“封闭”的通用数据库交互,他使得我们的通用数据库交互变得简单易行,并且完全不用考虑SQL语句。大大提高我们开发效率, 这样一来也减少我们维护一个复杂 缺乏灵活性数据访问层的成本。

下面我们用一个简单的案例来给大家操作一下Myabatis的基本实现

1.所需的jar坐标

<dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>

2.创建一个简单的表

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

3.在java中写一个对应的类

package domain;

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

4.编写映射文件UserMapper.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="UserAction">
    <select id="selectId" resultType="int">
        select id from Test
    </select>
</mapper>

5.编写核心文件SqlMapConfig.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
                <property name="url" value="jdbc:mysql://localhost:3309/test"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

6.测试类

package Test;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

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

public class test2 {
    @Test
    public void test1() throws IOException {
    //加载核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //获取sqlsession工厂对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //获取session对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //执行sql语句
    List<Integer> id = sqlSession.selectList("UserAction.selectId");
    System.out.println(id);
    //释放资源
    sqlSession.close();
    }
}

结果

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

1.插入操作

<insert id="add" parameterType="domain.User">
       insert into test values(#{id},#{name})
    </insert>

括号里的名字要与传入的对象中的变量名一致

2.修改操作

<update id="update" parameterType="domain.User">
        update test set username=#{name} where id=#{id}
    </update>

括号里的名字要与传入参数一致

3.删除操作

<!--删除操作-->
    <delete id="delete" parameterType="int">
        delete * from test where id=#{id}
    </delete>

2020103110215292.png#pic_center括号里的名字要与传入参数一致

Mybatis核心配置文件的配置项概述

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_centerwatermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center1.environments标签

事务管理器

其中,事务管理器(transactionManager)类型有两种:

JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

数据源

其中,数据源(dataSource)类型有三种:

UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。

POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。

JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

2.mapper标签

该标签的作用是加载映射的,加载方式有如下几种:

使用相对于类路径的资源引用,例如: 使用完全限定资源定位符(URL),例如: 使用映射器接口实现类的完全限定类名,例如: 将包内的映射器接口实现全部注册为映射器,例如:

3.properties标签

和spring框架中的配置没区别

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

4. typeAliases标签

一个用于取别名的标签

本来的配置

select * from User **使用别名后** ```java

```

<select id="findAll" resultType=“user">  
  select * from User
  </select>

许多别名mybatis已经帮我们配置好了

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center

一些对应的API

常用API:SqlSessionFactory build(InputStream inputStream)

通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象

String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource); 
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。

SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:

20201031101445262.png#pic_center

SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

主要执行语句

<T> T selectOne(String statement, Object parameter) 
<E> List<E> selectList(String statement, Object parameter) 
int insert(String statement, Object parameter) 
int update(String statement, Object parameter) 
int delete(String statement, Object parameter)

操作事务的方法

void commit()  
void rollback()

以上就是Mybatis的一些基础操作,如有帮助还请点赞关注支持,如有疑问评论私信都可,看到后可帮助解答本博客主要侧重于数据结构于算法和java开发,操作系统,计算机网络,觉得我的文章有帮助的小伙伴可以关注我,有疑问可评论私信,相逢即是缘,大家高处见

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK