一、mybatis入门案例

今天学习了mybatis框架,简单记录一下mybatis第一个入门案例,目标是使用Mybatis作为持久层框架,执行查询数据的SQL语句并且获取结果集

基本步骤:

  1. 物理建模
  2. 逻辑建模
  3. 引入依赖
  4. 创建持久层接口
  5. 加入日志框架
  6. 全局文件配置
  7. 映射文件配置
  8. 测试程序

1. 物理建模

创建数据库mybatis-example,表t_emp,添加一行数据。

CREATE DATABASE mybatis-example;
USE mybatis-example;
CREATE TABLE t_emp(
emp_id INT AUTO_INCREMENT,
emp_name CHAR(100),
emp_salary DOUBLE(10,5),
PRIMARY KEY(emp_id)
);
INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33);

2. 逻辑建模

创建pojo包下的实体类Employee,并引入lombok依赖,添加注解。(lombok注解添加后就不用我们另外添加get,set方法和构造函数了)。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Integer empId;

    private String empName;

    private Double empSalary;
}

lombok的使用

第一步,安装插件,在settings的Plugins中的Marketplace里面搜索Lombok小辣椒点击下载安装

一、mybatis入门案例
第二步,引入依赖,在pom.xml文件中引入

    org.projectlombok
    lombok
    1.18.8
    provided

3. 引入依赖

逻辑建模时已经引入了lombok依赖,但在这个案例中还需要引入以下依赖


        org.mybatis
        mybatis
        3.5.7

        junit
        junit
        4.12
        test

        mysql
        mysql-connector-java
        5.1.3

4. 创建持久层接口

持久层接口就是我们之前的Dao接口,但我们在使用Mybatis框架的时候习惯给它们命名为Mapper接口。因为持久层是和数据库连接的,因此我们可以解释为什么要引入mysql依赖。

package Mapper;

import pojo.Employee;

public interface EmployeeMapper {
    /*增加*/
    void insertEmployee(Employee employee);
    /*刪除*/
    void deleteEmployee(Integer empId);

    /*根据id修改名字*/
    void updateEmployee(Integer empId,String empName);

    /*查找*/
    Employee selectEmployee(Integer id);
}

以上是实行增删改查方法,注意我们创建的是接口,不用实现类(因为Mybatis内置连接池),解决了持久层代码的冗余和耦合问题。所以我们在这一步就不用准备sql语句和执行sql语句,直接在配置映射文件里写就可以了。

5. 加入日志框架

因为Mybatis中内置使用log4j进行日志打印,所以我们要想观察到Mybatis框架内部的日志,就必须引入log4j的依赖,并且提供log4j的配置文件

5.1 log4j的依赖

在pom.xml引入log4j依赖


    log4j
    log4j
    1.2.17

5.2 log4j的配置文件

第一种,xml配置,在类路径下,也就是resources下创建log4j.xml(我们所说的类路径有两个:一个是java,放我们的Java文件,一个是resources,放配置文件)。


第二种,properties配置,在类路径下,也就是resources下创建log4j.properties,只要引入log4j依赖我们都要配置这个。

输出的日志级别
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#[%-5p] %t %l %d %rms:%m%n
#%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p [%t] {%c}-%m%n
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %t %l %d %rms:%m%n
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:\\idea_project\\mybatis.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p [%t] {%c}-%m%n
日志的概述
1. 日志的级别

ATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试),从左到右打印的内容越来越详细

2. STDOUT

是standard output的缩写,意思是标准输出。对于Java程序来说,打印到标准输出就是打印到控制台。

6. 全局配置文件

在类路径下,即resources,建立mybatis-config.xml。全局配置文件名字推荐写这个,也可以写别的,但是记得在将全局配置文件转成字节输入流的时候名字对应上。


7. 映射配置文件

一个映射配置文件对应一个Mapper接口,映射配置文件中的一个子标签对应Mapper接口中的一个方法。在resources 路径下键一个文件夹mappers,在mappers下创建映射配置文件。

要求:

  1. 名称空间要和对应的Mapper接口的全限定名保持一致
  2. Mapper接口中的增、删、改、查方法分别对应映射配置文件中的insert、delete、update、select标签
  3. 标签的id对应方法的名字
  4. 标签的parameterType属性对应方法的参数类型
  5. 标签的resultType属性(只有select标签有)对应方法的返回值类型

        insert into t_emp (emp_name,emp_salary) values (#{empName},#{empSalary})

        delete from t_emp where emp_id=#{empId}

        update t_emp set emp_name=#{param2} where emp_id=#{param1}

        select emp_id empId, emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}

补充数据输入和输出

7.1. 输入

一、mybatis入门案例

7.1.1 获取输入信息的方式

#{} (推荐)

Mybatis会在运行过程中,把配置文件中的SQL语句里面的 #{} 转换为” ? “占位符,发送给数据库执行。
映射文件的配置:


    delete from t_emp where emp_id=#{empId}

实际sql语句:
delete from t_emp where emp_id=?

${} (不推荐,会有sql注入问题)

Mybatis会在运行过程中, 将来会 根据${}拼字符串

7.2. 输出

只有select标签有输出,我们目前是使用resultType属性来指定输出的类型。详细的在另一篇提到:数据输出


    select emp_id empId, emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}

8. 测试程序

目的为了获取Mapper接口的代理对象,并且调用方法执行SQL语句,之后用spring框架,(以下代码就可以不写了)

import Mapper.EmployeeMapper;
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.After;
import org.junit.Before;
import pojo.Employee;

import java.io.InputStream;

public class Test {
    private EmployeeMapper employeeMapper;
    private InputStream is;
    private SqlSession sqlSession;
    @Before
    public void init() throws Exception{
        //目标:获取EmployeeMapper接口的代理对象,并且使用该对象调用selectEmployee(1)方法,然后返回Employee对象
        //1. 将全局配置文件转成字节输入流
        is = Resources.getResourceAsStream("mybatis-config.xml");
        //2. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3. 使用构建者模式创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //4. 使用工厂模式创建一个SqlSession对象
        sqlSession = sqlSessionFactory.openSession();
        //5. 使用动态代理模式,创建EmployeeMapper接口的代理对象
        employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
    }

    @org.junit.Test
    public void testInsertEmployee(){
        Employee employee = new Employee(null, "Amy", 500d);

        //调用employeeMapper对象的insertEmployee()方法
        employeeMapper.insertEmployee(employee);
    }

    @After
    public void after() throws Exception{
        //提交事务!!!

        sqlSession.commit();
        //7. 关闭资源
        is.close();
        sqlSession.close();
    }

    @org.junit.Test
    public void testDeleteEmployee(){
        employeeMapper.deleteEmployee(2);
    }

    @org.junit.Test
    public void testUpdateEmployee(){
        employeeMapper.updateEmployee(3,"Salar");
    }

    @org.junit.Test
    public void testSelectEmployee(){
        Employee employee=employeeMapper.selectEmployee(1);
        System.out.println(employee);
    }
}

Before和After都是一样的,后面学到spring框架的时候这里就不用写了,所以直接理解然后复制粘贴就可以了。

以上就是mybatis第一个入门案例的步骤

Original: https://www.cnblogs.com/jasmine-e/p/15330355.html
Author: 素衣黛眉
Title: 一、mybatis入门案例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622691/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot日志框架

    日志门面与具体实现 slf4j(http://www.slf4j.org/)、log4j、logback是同一个人开发的 log4j2是apache开发的,只是借了log4j的名字…

    Java 2023年5月30日
    065
  • Java: State Pattern

    java;gutter:true; /<em><em> * 版权所有 2022 涂聚文有限公司 * 许可信息查看: * 描述: * 状态模式 State P…

    Java 2023年6月16日
    064
  • Java精进-手写持久层框架

    前言 本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理。 JDBC操作回顾及问题分析 学习java的同学一定避免不了接触过j…

    Java 2023年6月13日
    0125
  • MybatisPlus自动填充公共字段的策略

    背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一、创建基础实体【BaseEntity】,定义需要…

    Java 2023年6月8日
    082
  • spring上传文件

    本文将说明spring上传文件如何配置,以及从request请求中解析到文件流的原理 #添加依赖 主要用来解析request请求流,获取文件字段名、上传文件名、content-ty…

    Java 2023年6月9日
    082
  • Ubuntu中安装redis

    第一种方式在线安装首要前提安装c语言编译环境,命令如下:$sudo apt-get install gcc 安装完成后可以输入$gcc –version查看版本 1、获…

    Java 2023年6月9日
    092
  • RabbitMQ的初识和快速入门

    1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以…

    Java 2023年6月7日
    066
  • 引用拷贝,浅拷贝和深拷贝

    1.引用拷贝 引用拷贝会生成一个新的对象引用地址,但是两个最终指向依然是同一个对象。 class Son { String name; int age; public Son(St…

    Java 2023年6月5日
    063
  • java中scanner获取char字符类型的方法

    java中基本数据类型的输⼊包括整形的输⼊: in.nextInt();单精度浮点型: in.nextFloat();双精度浮点型: in.nextDouble();字符串类型: …

    Java 2023年6月9日
    066
  • spring的RestTemplate连接池相关配置

    转发:https://blog.csdn.net/weixin_33724659/article/details/93338398?utm_medium=distribute.pc…

    Java 2023年5月30日
    075
  • shiro的过滤器

    shiro的过滤器 shiro与web进行集成的时候,主要通过过滤器来进行实现,下面是shiro的过滤器的继承体系 AbstractFilter:shiro中filter的顶级抽线…

    Java 2023年6月7日
    095
  • java技术整理1

    一、基本 1.hashmap: 1.1 转红黑树条件:a.数组长度大于等于64(默认16,要经过2次扩容–当达到16*默认扩容因子0.75=12就扩容)b.链表长度大于…

    Java 2023年6月13日
    0118
  • Spring Security整合企业微信的扫码登录,企微的API震惊到我了

    本文代码: https://gitee.com/felord/spring-security-oauth2-tutorial/tree/wwopen/ 现在很多企业都接入了企业微信…

    Java 2023年5月30日
    068
  • 面试官:你说你精通Redis,你看过持久化的配置吗?

    前边我们已经介绍了 Redis 五种数据类型的命令与 配置文件的基本配置,今天让我们从理论和配置两个层面来揭开 Redis持久化的神秘面纱。 所谓持久化可以简单理解为将内存中的数据…

    Java 2023年6月5日
    072
  • Spring Ioc容器xml配置

    Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> &l…

    Java 2023年6月15日
    063
  • 关于在网上突然多了一个“孙子”这件事,我是服气的!

    你好呀,我是歪歪。 今天又带大家用新姿势来带吃个的瓜,这瓜老好吃了。 老规矩,先把瓜吃干净,再解锁新的技术姿势。 事情是这样的,上周五的时候不是中国第三艘航空母舰福建舰下水了嘛。 …

    Java 2023年6月5日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球