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