mybatis基础系列(一)——mybatis入门
好久不发博客了,写博文的一个好处是能让心静下来,整理下之前学习过的一些知识一起分享,大神路过~
mybatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。传统的 JDBC代码通常存在如下问题:
1. 频繁对数据库进行连接和关闭,造成资源浪费,性能下降。
2. SQL代码、preparedStatement参数、占位符号等硬编码到代码中,不方便维护。
3. 遍历结果集数据时,硬编码解析表字段成java属性,不方便维护。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis框架简要原理
mybatis的核心类与会话流程如下:
Configuration:读取mybatis配置文件(SqlMapConfig.xml、mapper.xml等)->
SqlSessionFactory:根据配置文件创建会话工厂->
SqlSession:API接口,表示和数据库交互时的会话,定义增删改查->
Executor:MyBatis 核心执行器,负责SQL语句的生成->
MappedStatement:负责输入输出的封装。
更详细的流程可参考其它资料。
mybatis与springboot 整合
创建项目
Idea: File->new->project->Spring initializr->Next 依次输入maven坐标信息,Dependencies选择Mysql、Mybatis。在File->Setting->Maven中配置本地Maven安装目录和setting.xml配置文件路径,完成。
习惯用yml了,将application.properties改为application.yml。在 mybatis 开发包里面,会将 druid 的配置的数据库连接池变为所需要的 DataSource 数据源对象。下文junit Test中会用到。
<dependencies> <!--mybatis 开发包--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--druid 的数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> </dependencies>
创建数据库以及关系表
CREATE DATABASE mybatis_test; USE mybatis_test; CREATE TABLE t_user( id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL , password VARCHAR(255) NOT NULL , phone VARCHAR(255) NOT NULL ) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;
配置数据库连接方式与数据源
后面要进行druid 的数据源的配置,需在pom.xml文件中添加druid 依赖包。
<!--druid 的数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency>
yml配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
添加自动生成代码插件以及配置文件
pom中的<plugins>添加mybatis generator 自动生成代码插件
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> </plugin> </plugins> </build>
新增/src/main/resources/generatorConfig.xm配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包--> <classPathEntry location="C:\Users\hjwu\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库链接URL,用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf8" userId="root" password="root"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置--> <javaModelGenerator targetPackage="com.itpsc.entity" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成映射文件的包名和位置--> <sqlMapGenerator targetPackage="com.itpsc.mapper.xml" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.itpsc.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <table tableName="t_user" domainObjectName="User"></table> </context> </generatorConfiguration>
运行插件生成CRUD代码,自动生成代码可以提高我们的开发效率。
可见自动生成user实体类、Mapper文件、xxxMapper.xml
启动测试
启动SpringbootMybatisDemoApplication测试
问题1
o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.itpsc]' package. Please check your configuration.
解决办法:在SpringbootMybatisDemoApplication中注解@MapperScan("com.itpsc.mapper*")
问题2:
Unregistering JMX-exposed beans on shutdown
解决办法:
pom.xml添加下面两个依赖包
<!--嵌入tomcat--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <!--springboot web模块支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
启动成功
整合Mybatis-Plus
添加mybatis plus插件。Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
<!-- mybatis --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.4</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.0.7</version> </dependency>
业务实现
//User.java @TableName("t_user") public class User { private Long id; private String name; private String password; private String phone; ...... } //UserMapper.xml <?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.itpsc.mapper.UserMapper" > </mapper> //UserMapper.java public interface UserMapper extends BaseMapper<User>{ } //UserService.java public interface UserService { boolean insert(User user); User query(Integer id); boolean update(User user); int delete(Integer id); } //UserServiceImpl.java @Service public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{ @Override public boolean insert(User entity) { return super.insert(entity); } @Override public User query(Integer id) { return super.selectById(id); } @Override public boolean update(User user) { return super.updateById(user); } @Override public int delete(Integer id) { return 0; } }
//SpringbootMybatisDemoApplicationTests SpringbootMybatisDemoApplicationTests.java @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootMybatisDemoApplicationTests { @Resource private DataSource dataSource; @Resource private UserService userService; @Test public void contextLoads() { } @Test public void testConnection() throws Exception { System.out.println(this.dataSource); } @Test public void testInsertUser() { User user = new User(); //user.setId(2L); user.setName("name3"); user.setPassword("123456"); user.setPhone("138777888888"); System.out.println(userService.insert(user)); } @Test public void testQueryUser() { System.out.println(userService.query(1)); } @Test public void testUpdateUser() { User user = new User(); user.setId(1L); user.setName("update name1 tow times"); user.setPassword("98764"); user.setPhone("13877711111"); System.out.println(userService.update(user)); } }
从上面可以看出,我们的UserMapper.xml中不用写crud语句,Mybatis-Plus帮我们封装了基本的curd。下面我们重点学习mybatis的基础语法。
下篇预告
mybatis基础系列(二)——(增删改查语法、别名、输入映射、输出映射)