手记

Mybatis 代码实践

Mybatis 是什么?

Mybatis 是一个持久层框架。Java 中通过 Mybatis ,程序可以很方便的对数据库进行操作。使开发者专注于 SQL语句,避免了重复的 JDBC 代码。

  • 使用 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集

  • 灵活且强大,支持定制化 SQL、存储过程以及高级映射

  • 支持 XML 和注解两种形式编写 SQL

  • 数据库中的记录可以映射为普通 Java 对象

准备

环境:

开发工具:IDEA

包管理:Maven

JDK:1.8

Mybatis :Mybatis 3.4.6

问题场景

使用 Mybatis 完成基于简单权限设计的数据库表的相关操作、查询

涉及到的表

t_user
t_user_info
t_role
t_menu
t_user_role //关系表
t_role_menu //关系表

要做哪些操作

  • t_user 表的简单增删改成

  • 关联复杂查询,查询一个用户的所有权限信息

  • 动态查询,包含某些菜单权限的用户

1、新建数据库表,初始化些数据

-- ------------------------------  Table structure for `t_menu`-- ----------------------------DROP TABLE IF EXISTS `t_menu`;CREATE TABLE `t_menu` (  `id` int(10) NOT NULL AUTO_INCREMENT,  `name` varchar(50) DEFAULT NULL,  `type` int(11) DEFAULT NULL,  `url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;-- ------------------------------  Table structure for `t_role`-- ----------------------------DROP TABLE IF EXISTS `t_role`;CREATE TABLE `t_role` (  `id` int(10) NOT NULL AUTO_INCREMENT,  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ------------------------------  Table structure for `t_role_menu`-- ----------------------------DROP TABLE IF EXISTS `t_role_menu`;CREATE TABLE `t_role_menu` (  `role_id` int(10) DEFAULT NULL,  `menu_id` int(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------  Table structure for `t_user`-- ----------------------------DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `username` varchar(50) DEFAULT NULL,  `password` varchar(50) DEFAULT NULL,  `nickname` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),  UNIQUE KEY `t_user_username_uindex` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;-- ------------------------------  Table structure for `t_user_role`-- ----------------------------DROP TABLE IF EXISTS `t_user_role`;CREATE TABLE `t_user_role` (  `user_id` int(10) DEFAULT NULL,  `role_id` int(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;SET FOREIGN_KEY_CHECKS = 1;-- ------------------------------  Table structure for `t_user_info`-- ----------------------------DROP TABLE IF EXISTS `t_user_info`;CREATE TABLE `t_user_info` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `user_id` int(11) DEFAULT NULL,  `name` varchar(100) COLLATE utf8_bin DEFAULT NULL,  `email` varchar(100) COLLATE utf8_bin DEFAULT NULL,  `address` varchar(255) COLLATE utf8_bin DEFAULT NULL,  `phone` varchar(20) COLLATE utf8_bin DEFAULT NULL,  `sex` varchar(2) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;SET FOREIGN_KEY_CHECKS = 1;

手动初始化些数据进去,构建一些关联数据,为下面测试所用

2、构建Maven项目

image-20180811093734875

组织 project 目录

└── src
    ├── main
    │   ├── java
    │   │   └── me
    │   │       └── imcoding
    │   │           ├── dao
    │   │           ├── mapper
    │   │           ├── model
    │   └── resources
    │       └── mapper
    └── test
        └── java
            └── me
                └── imcoding

3、引入 Mybatis 相关依赖

在 maven 环境中,需要在 pom.xml 文件中增加依赖

 <dependencies>
    <!--引入 Mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>
    <!-- 引入 MySQL 驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
     <!-- JSON 工具包-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.31</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

4、配置 Mybatis

在 resources 目录新建 mybatis-config.xml

└── resources
    ├── mapper
    └── 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>
    <!--设置properties 属性文件-->
    <properties resource="dbconfig.properties"></properties>
    <!--默认使用的配置环境:development-->
    <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>

    <mappers>
         <!-- 这里引入 Mapper 文件-->
    </mappers></configuration>

外部属性配置,resources 目录下新增 dbconfig.properties 文件

└── resources
    ├── dbconfig.properties
    ├── mapper
    └── mybatis-config.xml

配置内容:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis-demo?useUnicode=true&characterEncoding=utf8
username=root
password=root

数据库连接的相关属性信息

5、获取  SqlSession

核心代码:

// 配置文件位置String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();

写个工具类 MybatisUtils:

├── java
   └── me
     └── imcoding
        ├── App.java
        ├── MybatisUtils.java
public class MybatisUtils {    private static SqlSessionFactory factory;    /**
     * 根据 mybatis-config.xml 配置初始化 factory
     */
    private static void initialFactory() {
        String resource = "mybatis-config.xml";        try {
            InputStream in = Resources.getResourceAsStream(resource);
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    
    public static SqlSession getSession() {        if (factory == null) {
            initialFactory();
        }        // factory.openSession(true) - 开启事务自动提交
        SqlSession sqlSession = factory.openSession();        return sqlSession;
    }



作者:密叔
链接:https://www.jianshu.com/p/a482541b86b1


0人推荐
随时随地看视频
慕课网APP