MyBatis快速入门

Posted 夏天里的Jasmine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis快速入门相关的知识,希望对你有一定的参考价值。

先说说缘由为啥今天才来学习和总结MyBatis。。

我自己学Springboot刚入门的时候,用SptingBoot+JdbcTemplate+Thymeleaf 搭建了一个bug管理平台

后来自己用自己的接口,测试DB连接数对性能的影响,TPS会特别受到程序中连接池的配置影响

后来DB中就涌现了很多数据,我的bug管理平台,有一个接口是列出所有的bug,这个页面就会特别特别地慢,于是想到分页。

 

在网上查找分页信息的时候,发现大多数都是针对MyBatis的,用JdbcTemplate的查询,将没有现成的分页插件,需要自己改写JdbcTemplate中的一些方法,要添加页码和每页的条数

 

每天依旧,工作依旧。

忽然一日得闲,又开始自学SpringBoot,于是根据教程先用springboot+MyBatis+MyBatis插件 自动生成了Mapper和实体类。

难道MyBatis必须在SpringBoot框架中? 忽然冒出这样的疑问之后,就开始搜索MyBatis的历史,也开始最简单的学习。

 

 

mybatis是什么?最初开发出来做什么的?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

 

http://blog.mybatis.org/        mybatis官方网站   ---   需要翻墙

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

 下载第一个zip格式的,解压后如下图,其中有个pdf文档,可以参考用来配置mapper以及配置config文件。 License和Notice只是一些证书说明等,可以忽略。lib目录下是一些常搭配的jar包。

mybatis-xx.xx.x.jar 可以放置到自己的项目源中。用了maven的话,可以自己去找maven的路径。

 

 

 

 

 

mybatis是怎么用的呢?

不管是何种程序,持久化的数据都是重中之重。不可能让前段用户直接去操作数据库吧,这样都不安全,而且也不是任何一个人都会的。

所以要用程序编写页面,编写后台接口,让mybaits操作对象,就像操作数据库这么简单。

user表, user对象,一一对应

想查看,想更新,想新增,直接操作对象,就能存入持久化数据DB中

use test

select * from user

create table user(
id INT NOT NULL auto_increment primary key,
name VARCHAR(20),
age int,
phone varchar(20),
password varchar(20)
)ENGINE=InnoDB AUTO_INCREMENT=300;

insert user(name,age,phone,password) values ("王族 ",33,"18962811111","12345")  

以上是创建了user表,接下来创建User对象

public class User {

    private Integer id;
    private String name;
    private String phone;
    private String password;
    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User(){

    }

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

 

表和对象都有了,现在就是mybatis的作用了,首先要进行配置config.xml,然后配置映射文件UserMapper.xml.这些在刚下载的pdf中都有介绍,有例子。

上面是项目的目录结构,我创建的有点随意,下面l两个分别是config.xml 和UserMapper.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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>


</configuration>

  

 

<?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="useraaa">
    <select id="selectById" parameterType ="int" resultType="com.test.mybatis.entity.User">
        select * from user where id = #{id}
    </select>

    <select id="selectAll" resultType="com.test.mybatis.entity.User">
        select * from user
    </select>

    <insert  id="addUser" parameterType="com.test.mybatis.entity.User">
        insert into user (name,age,phone,password) values(#{name},#{age},#{phone},#{password})
    </insert>


    <update  id="updateUser" parameterType="com.test.mybatis.entity.User">
        update user set name = #{name},age =#{age},phone =#{phone},password = #{password} where id = #{id}
    </update>


    <delete  id="deleteUserById" parameterType ="int">
        delete from user where id = #{id}
    </delete>

</mapper>

 

  

 

下面是如何读取配置文件config.xml,如何将UserMapper中的查询语句打印出表中的信息

用了testNG来测试,具体测试内容如下

import com.test.mybatis.entity.User;
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.testng.annotations.Test;

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

public class TestMyBatis {

    @Test(description = "通过InputStream读取配置config文件")
    public void TestInputStream() throws IOException {

        String resource = "config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.selectById";


        User user = session.selectOne(statement,300);
        System.out.println(user);
        session.close();


    }

    @Test(description = "通过Reader读取配置config文件")
    public void Reader() throws IOException {

        Reader reader =Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.selectById";
        User user = session.selectOne(statement,300);
        System.out.println(user);
        session.close();
    }

    @Test(description = "读取所有的对象")
    public void selectAll() throws IOException {

        Reader reader =Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.selectAll";


        List<User> user = session.selectList(statement);
        System.out.println(user);
        session.close();
    }

}

  

以下是新增,更新,删除的测试,注意事物的提交【当前config.xml中可以配置,目前是JDBC,需要手动提交】

 

import com.test.mybatis.entity.User;
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.testng.annotations.Test;

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

public class TestMyBatis02 {

    @Test(description = "新增记录")
    public void Add() throws IOException {

        Reader reader =Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.addUser";
        User user= new User();
        user.setName("may");
        user.setAge(20);
        user.setPassword("12345678");
        user.setPhone("18976532121");


        int count = session.insert(statement,user);
        System.out.println(count);
        session.commit();
        System.out.println(user);
        session.close();
    }


    @Test(description = "更新记录")
    public void Update() throws IOException {

        Reader reader =Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.updateUser";
        User user= new User();
        user.setId(300);
        user.setName("may");
        user.setAge(20);
        user.setPassword("12345678");
        user.setPhone("18976532121");


        int count = session.update(statement,user);
        System.out.println(count);
        session.commit();
        System.out.println(user);
        session.close();
    }


    @Test(description = "删除记录")
    public void Delete() throws IOException {

        Reader reader =Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);

        SqlSession session =sessionFactory.openSession();
        String statement = "useraaa.deleteUserById";

        int count = session.delete(statement,307);
        System.out.println(count);
        session.commit();
        session.close();
    }

}

 

  

 

 

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mybatis01</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.14</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>test</scope>
        </dependency>


    </dependencies>


</project>

  

mybatis使用中要注意的地方?

1. config.xml 和 Mapper.xml 中的头部分要复制正确,是不一样的,config中是configration,后者是Mapper

2. config.xml中数据的连接url,驱动,用户名和密码要全部填写正确

3.UserMapper.xml中的namespace 要用到,之后读取的是namespace.select的id的值,如下

 

4. 有很多报错原因是两个xml中的路径没有写对,pay attention~

5. config.xml中有挺多可以讲的,

    比如数据库的确定是由environments下的default值 与 enviroment下的id值来确定的,备注:也可以通过SqlSessionFactoryBuilder的第二个参数来强制指定

 

上图是缺省模式,默认config中的配置

上图进行了指定,要开发环境的数据库配置

    比如 <transactionManager type="JDBC"/>表示事务提交方式是JDBC,即利用JDBC的方式处理事务,需要手动去commit,rollback和close操作

      <transactionManager type="MANAFED"/>表示将事务交给其他组件去托管,比如spring,jboss,默认会关闭连接等

 

    比如 <dataSource type="POOLED">,POOLED是指用数据库连接池;

      <dataSource type="UNPOOLED">表示使用传统的JDBC模式,即每次访问数据库,均需要打开、关闭等数据库操作,每次打开关闭数据库通常比较消耗性能,一般不建议
      <dataSource type="JNDI">表示从tomcat中间件中获取一个内置的数据库连接,数据库连接池,数据源,可以认为是pooled方式相似

 

 6. mybatis的sql映射文件的UserMapper潜在约定:

    1#  输入参数和输出参数,parameterType和resultType在形式上都只能是一个

     2# 输入参数parameterType如果是简单类型,即8个基本类型+String,是可以使用任何占位符的, #{xxx}

              如果是对象类型,则必须是对象的属性,#{属性名}

              一般,为了可读性,都会尽量写成 #{属性名}

   3# 输出参数resultType,如果返回类型是一个对象,比如User对象,则无论返回一个还是多个,都写成User对象
       比如resultType="com.test.mybatis.entity.User"

 


 

以上是关于MyBatis快速入门的主要内容,如果未能解决你的问题,请参考以下文章

13.2 MyBatis Generator 快速入门(MyBatis Generator逆向代码生成工具) -《SSM深入解析与项目实战》

MyBatis快速入门

MyBatis学习总结——MyBatis快速入门

MyBatis学习总结——MyBatis快速入门

mybatis介绍和mybatis快速入门

MyBatis学习总结——MyBatis快速入门