Mybatis搞一下

Mybatis搞一下

image-20200921192606194

啥是Mybatis呢,简单来说,Mybatis就是一个持久层的框架,就是一个框架,他支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

初学一个东西可以从他的官网API快速入门,英语不好不用担心,官网支持中文API。

https://mybatis.org/mybatis-3/zh/index.html

映射

上面说到映射,首先搞懂什么是映射?为什么mybaits支持映射?

在mybatis里,只要sql返回的列名和Javabean中的属性一一致,mybatis就会帮我们把结果自动填到对应的Javabean中,而Javabean可以返回给调用者。我们经常通过取别名的方式让sql返回的列名和pojo的属性一致从而实现自动映射。比如

select id,stu_name as stuName from stu where id=#{id}

为什么要取别名?因为数据库中字段一般用_隔开,如stu_name,但是Javabean中是驼峰命名如stuName,如果两者不一致那就没办法映射,对应的属性也是null。

这里顺便普及几个名词的意思

  • Data Access Object(DAOs):数据访问,对数据库执行增删改查
  • POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans
  • VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收。
  • SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)
  • SSH是 struts+spring+hibernate的一个集成框架(较老)
  • ORM(Object Relational Mapping)ORM就是对象关系匹配,是为了解决面向对象与关系数据库存在的互不匹配的问题。简单来说,就是把关系数据库中的数据转换成面向对象程序中的对象。

MVC中架构图

初学者总是搞不懂这些,这里把总结的图放在这里,希望能给大家加深印象

MVC架构1

Mybatis的安装

这玩意安装啥呀,maven直接导入就行了昂

往pom.xml里插入这个就可以了

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

搭建Mybatis项目

创建一个普通的maven项目

在pom.xml中导入以下依赖

<!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

贴一下我的sql

CREATE DATABASE `mybatis`;

USE `mybatis`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(20) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  `perms` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`pwd`,`perms`) values 
(1,'马云','123456',NULL),
(2,'张三','123213',NULL),
(3,'李四','1z1z1z',NULL),
(4,'半仙','123355',NULL),
(5,'大仙','123255',NULL),
(6,'小仙','222255',NULL),
(7,'李武','546552',NULL),
(8,'刘霸','555599',NULL),
(9,'root','123456','user:add'),
(10,'feng','123456','user:update'),
(12,'root1','123422',NULL),
(13,'cici','213144',NULL);

后面的操作我都是基于这个数据库来的

核心配置文件 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>

    <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/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <mapper resource="com/feng/dao/UserMapper.xml"/>
    </mappers>

</configuration>

mybatis工具类 MybatisUtils.java

package com.feng.utils;

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 java.io.IOException;
import java.io.InputStream;

//sqlSessionFactory --> sqlSession
public class MybatisUtils {
    
    

    private static SqlSessionFactory sqlSessionFactory;

    static {
    
    
        try {
    
    
            //使用Mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }

    //既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
    // SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
    public static SqlSession getSqlSession() {
    
    
        return sqlSessionFactory.openSession();
    }

}

实体类 User.java

package com.feng.pojo;
//实体类
public class User {
    
    
    private int id;
    private String name;
    private String pwd;

    public User() {
    
    
    }

    public User(int id, String name, String pwd) {
    
    
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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;
    }

    public String getPwd() {
    
    
        return pwd;
    }

    public void setPwd(String pwd) {
    
    
        this.pwd = pwd;
    }

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

这里如果觉得实体类过于繁琐,可以用lombok插件,虽然这个插件争议性很大,但我觉得仁者见仁智者见智吧,反正我挺喜欢的

Dao接口 UserDao.java

public interface UserDao {
    
    
    List<User> getUserList();
}

接口实现类 UserMapper.xml

接口实现类由原来的UserDaoImpl转变为一个 Mapper配置文件.

<?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接口-->
<mapper namespace="com.feng.dao.UserDao">

<!--select查询语句-->
   <select id="getUserList" resultType="com.feng.pojo.User">
       select * from mybatis.user
   </select>

</mapper>

测试类

前面导的junit包就在这里使用啦

@Test
public void test(){
    
    
    //第一步:获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    //方式一:getMapper
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    List<User> userList = userDao.getUserList();

    for (User user : userList) {
    
    
        System.out.println(user);
    }
    //关闭SqlSession
    sqlSession.close();
}

查询成功

image-20200921202145372

这里我们二话不说,直接使用了Mybatis,但是却不知道很多细节问题,下面补充一些理论细节。

Mapper文件详解

sql映射文件(UserMapper.xml)中各标签的含义及用法

sql映射文件,在这里面写sql语句,mybatis会帮我们执行这些sql语句

<!-- 
version="1.0" 声明用的xml版本是1.0
encoding="UTF-8" 声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--1、指定约束文件-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
约束文件作用
限制作用,检查当前文件中出现的标签属性是否符合mybatis的要求
-->

<!--
mapper:当前文件的根标签
namespace:命名空间(唯一),可以使自定义的字符串,要求必须是dao接口的全限定名称,全限定名就是绝对路径,比如com.feng.dao.UserMapper
用全限定名目的:通过mapper.xml和mapper.java进行关联。
-->

<!--
在当前文件中使用特定标签,表示数据库特定操作
 	<select>:表示查询
    <update>:更新语句
    <insert>:插入语句
    <delete>:删除语句
-->

<select id="getUserList" resultType="com.feng.pojo.User">
        select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.feng.pojo.User">
        select * from mybatis.user where id = #{id}
    </select>

<!--
select后面的id表示sql语句的唯一标识,mybatis根据这个id的值来定位要执行的sql语句,可以自定义,要求使用接口中的方法名称
resultType:sql语句执行后得到ResulSet,遍历这个ResulSet得到的java对象的类型值的类型的全限定名称,说白了就是Sql语句执行的返回值
parameterType:参数类型
-->

Mybatis配置文件详解

mybatis.xml或者mybatis-config.xml

可以看到configuration里有很多配置信息,包括这么多种

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

我们如果不知道当前标签该写什么或者可以写什么,我们可以先打一个左尖括号,idea会自动提示能打的标签。

image-20200922094629584

<!--
和上面一样,1.0xml版本,utf8转码
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--
mybatis-config的约束文件
-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">



<!--
<configuration>:根标签
-->
<environments default="development">
<!--
<environments>:环境配置,一般是数据库连接信息,
default:必须和某个environment的id值一样,告诉mybatis使用哪个数据库的配置信息
-->
        <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/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="******"/>
                <property name="password" value="******"/>
            </dataSource>
        </environment>
    </environments>

还是不放在代码块的注释里讲了,拎出来整理吧,讲几个常用的标签

环境配置(environments)

<environments> : 环境配置,一般是数据库连接信息,
default:必须和某个environment的id值一样,告诉mybatis使用哪个数据库的配置信息

<transactionManager type=“JDBC”/>:mybatis事务类型

type:JDBC(使用JDBC中Connection对象的commit,rollback事务处理)

<dataSource> :数据源,连接数据库

type:type="POOLED"表示使用连接池

<property>:表示连接数据库的具体信息

diver(驱动),user,username,password是固定的,不能自定义

属性(properties)

我们可以把数据库配置信息提取成一个db.properties,(老套路了,应该都懂吧),是不是猜到这个标签的作用了?

先整一个db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=*******

然后在mybatis.xml里这样用

 <!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="pwd" value="******"/>
    </properties>

这个主要是用来引入外部文件的,一般是配置文件。注意如果两个文件有相同字段,优先使用外部配置文件的。

类型别名(typeAliases)

别名,那就是取外号了,不管在哪个框架里,看到aliases其实大多是取别名的意思

比如我的Java类型太长了,可能是com.feng1.feng2.feng3.feng4.pojo.User怎么办,那代码不是丑的一批,又臭又长?这个时候就可以用这个标签了

<!--可以给实体类起别名-->
<typeAliases>
    <typeAlias type="com.feng.pojo.User" alias="User"/>
</typeAliases>

也可以指定一个包名,Mybatis会在包名下搜索需要的Javabean,比如扫描实体类的包,那他的默认别名就是这个类的类名(首字母小写)

<!--可以给实体类起别名-->
<typeAliases>
    <package name="com.feng.pojo"/>
</typeAliases>

在实体类比较少的时候,使用第一种方式。

如果实体类十分多,建议使用第二种。

第二种虽然是默认取名,但也可以自定义“外号”,只需要在实体类上加一个注解即可

@Alias("user")
public class User {
    
    }

设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 但这里的可以设置的东西可太多了,在这里不想赘述,贴一个官网API的网址

https://mybatis.org/mybatis-3/zh/configuration.html

image-20200922100203628

其他配置

映射器(mappers)重要

MapperRegistry:注册绑定我们的Mapper文件;

方式一: 【推荐使用】

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper resource="com/feng/dao/UserMapper.xml"/>
</mappers>

方式二:使用class文件绑定注册

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper class="com.feng.dao.UserMapper"/>
</mappers>

注意点:

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

方式三:使用扫描包进行注入绑定

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <package name="com.feng.dao"/>
</mappers>

注意点:

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

们的Mapper文件;

方式一: 【推荐使用】

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper resource="com/feng/dao/UserMapper.xml"/>
</mappers>

方式二:使用class文件绑定注册

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper class="com.feng.dao.UserMapper"/>
</mappers>

注意点:

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

方式三:使用扫描包进行注入绑定

<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <package name="com.feng.dao"/>
</mappers>

注意点:

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

本篇就到这里了,下一篇就从sqlsession继续讲一下mybatis的动态代理和生命周期,今天开始所有博客里的图已经放到了图床,觉得很好用,下次更新一篇关于博客图床的配置。

猜你喜欢

转载自blog.csdn.net/weixin_43876186/article/details/108731039