继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Mybatis 代码实践

慕哥9229398
关注TA
已关注
手记 1245
粉丝 199
获赞 913

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项目

webp

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


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP