MyBatis入门

MyBatis简介

  • MyBatis 本是apache的一个开源项目iBatis, 是一个基于Java的Dao框架。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(JDBC仅是规范)
  • MyBatis 使用简单的 XML或注解用于配置和原始映射,将java普通对象映射为数据库的记录。(ORM---Object Relational Mapping)

创建样本表作准备

sql1

创建数据库(mysql)

create database test(id int,name varchar(10),major varchar(20));

创建表

use mybatis;
create table test(id int,name varchar(10),major varchar(20));

sql2

写入样本数据

insert into test values(1,'Jack','Math');
insert into test values(2,'Marck','English');
insert into test values(3,'szx','弱鸡');

sql3

PS: 这里我用了mycli插件,支持自动补全和语法高亮

建立新的Maven项目

maven项目默认,建好之后如下

idea1

导入依赖

编辑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>org.example</groupId>
    <artifactId>MyBatisTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <!--MyBatis框架依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <!--日志相关-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <!--测试类-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
</project>

完成后会自动下载依赖,如果没有则手动导入
idea2

建立相关的包(Dao和Domain)

idea3

  • dao中建IinfoDao接口,其中写的findAll()方法是用来查询的
  • domain中的info类实现Serializable接口(方便其对象被序列化)
    • 其中Serializable接口只是个标志,里面是空的
    • serialVersionUID最好是定义,否则反序列化可能出毛病
      结果如图
      idea4
      idea5

编写info类(查询结果以类的形式封装)

  • 首先查看mybatis数据库的数据类型
  • info类中定义的变量名和类型都尽量与数据库中的一样
    sql4
  • 编写info类
//info.class
//自己导包(通常可以自动)
import java.io.Serializable;

public class info implements Serializable {
    private static final long serialVersionUID = 1L;
    //定义变量
    private int id;
    private String name;
    private String major;

    //alt+insert 生成方法
    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 getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }

    //ctrl+o重写toString方法

    @Override
    public String toString() {
        return "id:"+id
                +", name:"+name
                +", major:"+major;
    }
}


编写配置部分

编写log4j.properties

  • 在resources目录下新建两个文件分别是log4j.properties和SMConfig.xml
  • 其中SMConfig.xml为mybatis的核心配置文件
  • 先编写log4j.properties
### log4j.properties ###
### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

编写SMConfig.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="mysql">
        <!--环境id-->
        <environment id="mysql">
            <!--事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源(连接池)-->
            <dataSource type="POOLED">
                <!--连接数据库的基本信息-->

                <!--驱动-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>      <!--注意mysql版本(有无cj)-->
                <!--url-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <!--数据库用户名-->
                <property name="username" value="root"/>
                <!--数据库密码-->
                <property name="password" value="szx"/>
            </dataSource>
        </environment>
    </environments>

    <!--如果不使用注解的方法还要配置映射文件-->
    <!--指定映射配置文件位置,映射配置文件指的是每个Dao独立的配置文件-->
    <mappers>
        <!--包名最好一一对应-->
        <!--在resources文件夹中建包com.szx.dao        包下建文件IinfoDao.xml -->
        <mapper resource="com/szx/dao/IinfoDao.xml"/>
    </mappers>
</configuration>

编写IinfoDao.xml

  • 在resources文件夹中建包
  • 包下建文件IinfoDao.xml
如果不能建包,那就一层层文件夹地建
![C!--这上面都是规范--E](https://images.cnblogs.com/cnblogs_com/xun-/1760690/o_200508144354idea6.png)
<!-- IinfoDao.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="com.szx.dao.IinfoDao">
    <!--配置查询所有-->
    <!--Dao的方法名称-->
    <select id="findAll" resultType="com.szx.domain.info">
    <!--id必须和方法名对应,resultType指定结果存放在哪个类-->
    <!--里面写sql语句-->
        select * from user;
    </select>
</mapper>

到这一步所有的配置都已经完成,接着写测试类运行


编写测试类

  • test文件夹的java中建立相同的包结构
    6
//test.java
package com.szx.test;

import com.szx.dao.IinfoDao;
import com.szx.domain.info;
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;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SMConfig.xml");
        //2.创建SqlSessionFactory工厂对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.用工厂生产新的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IinfoDao infoDao = session.getMapper(IinfoDao.class);
        //5.使用代理对象执行方法
        List<info> infos = infoDao.findAll();
        for (info inf:infos) {
            System.out.println(inf);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

运行查看结果

idea8

原文地址:https://www.cnblogs.com/xun-/p/12853582.html