mybatis入门之跑起来

什么是 MyBatis?

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

第一个mybatis程序

下图是整个结构,类、xml等所在的位置。

在这里插入图片描述

准备工作

大致流程

(1)创建数据库,并建一个表,用来进行增删改查。
(2)创建maven项目,然后在pom.xml中导入要用的jar包依赖。
(3)编写mybatis的核心配置文件:mybatis-config.xml。
(4)编写实体类、UserMapper 以及UserMapper .xml文件。
(5)封装SqlSessionFactory。
(6)编写测试类。

注意:mapper类似以前的Dao,mapper.xml类似以前的Dao的实现类。
上边流程的顺序也并不是固定的,只要做完就行。

具体代码

(1)数据库

创建数据库名字为mybatis,进入该数据库

create database mybatis;
use mybatis;

创建user表

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

插入3条数据。

insert into user (id, username, pwd) values(1, '张三', '12');
insert into user (id, username, pwd) values(2, '李四', '123');
insert into user (id, username, pwd) values(3, '小明', '1234');

(2)在pom.xml中导入jar包依赖

    <dependencies>
        <!--导入mybatis的jar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <!--打印日志信息-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--方便测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

(3)在resources 包下新建 mybatis-config.xml核心文件
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

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

<?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>
    <!--加载编写的db.properties文件-->
    <properties resource="db.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定mapper接口的映射位置-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

为了实现再分离,没有在上边的核心配置文件中driver、url、username和password都没写,但添加了一句能加载配置文件的标签 <properties resource="db.properties"/> ,有顺序,要放最上边。

还在resources 包下新建db.propeties,填写driver、url、username和password的参数

driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
url –这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=utf-8&serverTimezone=UTC
username=root
password=root

(4)编写实体类、mapper以及mapper.xml文件。

创建实体类User 因为有get和set方法,所以有点长,其实自己手敲的只有那3个属性

package com.lu.pojo;

public class User {
    
    

    private int id;

    private String username;

    private String pwd;

    public User() {
    
    
    }

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

    public void setUsername(String username) {
    
    
        this.username = username;
    }

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

    public int getId() {
    
    
        return id;
    }

    public String getUsername() {
    
    
        return username;
    }

    public String getPwd() {
    
    
        return pwd;
    }

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

创建UserMapper ,类似以前的dao层,写一些接口。
位置的话,可以放在mapper文件夹中,以后多的话方便管理

package com.lu.mapper;

import com.lu.pojo.User;
import java.util.List;

public interface UserMapper {
    
    

    /**
     * 查询所有用户
     */
    List<User> findAll();
}

创建UserMapper.xml文件,类似以前的daoimpl层,用来实现mapper中的接口。
位置的话,可以在resource下创建一个mapper文件夹,然后放这个里面,就像开头的图;也可以放在mapper层,需要在核心配置文件中添加过滤,让程序能识别这些xml。

下边的UserMapper.xml中,namespace写的是要实现的UserMapper接口,要写全称;id写的是接口的某一个类;resultType是返回的结果类型,写全称。

<?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.lu.mapper.UserMapper">
    <select id="findAll" resultType="com.lu.pojo.User">
    select * from user
  </select>
</mapper>

(5)封装SqlSessionFactory。

package com.lu.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;

public class MybatisUtils {
    
    

    private static SqlSessionFactory sqlSessionFactory;
    static {
    
    
        try {
    
    
            //读取配置文件
            String resource = "mybatis-config.xml";
            //创建SqlSessionFactory的构建者对象
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //创建工厂对象
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        }catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
    //获取SqlSession实例,其包含了面向数据库执行SQL命令所需的所有方法
    public static SqlSession getSqlSession() {
    
    
        return sqlSessionFactory.openSession();
    }
}

(6)编写测试类。

package com.lu.test;

import com.lu.mapper.UserMapper;
import com.lu.pojo.User;
import com.lu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;

public class MybatisTest {
    
    
    public static void main(String[] args) {
    
    
        //通过封装的MybatisUtils类获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //使用SqlSession创建dao接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //使用代理对象执行查询所有方法
        List<User> users = userMapper.findAll();
        for (User user : users) {
    
    
            System.out.println(user);
        }
    }
}

下一篇:实现增删改和用注解实现增删改以及映射器

日志警告和简单使用

运行完前几行会有红色的,不过不影响。但也可以解决。
resource下创建 log4j.properties

#指定日志的输出级别与输出端
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# 输出日志到控制台,以下设置分别为控制台,布局格式,布局显示样式
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# 输出日志到文件
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

简单使用

在导入了maven坐标依赖和编写log4j.properties文件之后,可以使用并输出信息到控制台。
1、在要使用Log4j的类中导入

  import org.apache.log4j.Logger;

2、日志对象,参数为当前类的class。

  static Logger logger = Logger.getLogger(MybatisTest.class);

3、日志级别

logger.info("查询成功");
logger.debug("111");
logger.error("1222");

作用域(Scope)和生命周期

SqlSessionFactoryBuilder

作用域: 局部方法
生命周期: 使用过就没用了

官方文档: 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory
作用域: 应用作用域
生命周期: 创建后在应用运行期间一直存在

官方文档: SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession
作用域: 请求或方法作用域
生命周期: 回一个响应后,就关闭它

官方文档: 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

猜你喜欢

转载自blog.csdn.net/qq_42524288/article/details/108593021