由于公司的单体服务是采用的SSM架构,这里对Mybatis的学习做一下记录,以加深印象
一、简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录
二、简单使用
1.引入依赖(pom.xml)
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.8</version></dependency>
2.全局配置文件(mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 根标签 --><configuration><properties><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis-110?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true"/><property name="username" value="root"/><property name="password" value="123456"/></properties><!-- 环境,可以配置多个,default:指定采用哪个环境 --><environments default="test"><!-- id:唯一标识 --><environment id="test"><!-- 事务管理器,JDBC类型的事务管理器 --><transactionManager type="JDBC" ><!-- 数据源,池类型的数据源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" ><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis-110" ><property name="username" value="root" ><property name="password" value="123456" ></dataSource></environment><environment id="development"><!-- 事务管理器,JDBC类型的事务管理器 --><transactionManager type="JDBC" ><!-- 数据源,池类型的数据源 --><dataSource type="POOLED"><property name="driver" value="${driver}" > <!-- 配置了properties,所以可以直接引用 --><property name="url" value="${url}" ><property name="username" value="${username}" ><property name="password" value="${password}" ></dataSource></environment></environments></configuration>
3.配置Map.xml(MyMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一 --><mapper namespace="MyMapper"><!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表--><select id="selectUser" resultType="com.zpc.mybatis.User">select * from tb_user where id = #{id}</select></mapper>
4.修改全局配置文件(mybatis-config.xml)
<configuration><!-- 环境,可以配置多个,default:指定采用哪个环境 --><environments default="test"><!-- id:唯一标识 --><environment id="test"><!-- 事务管理器,JDBC类型的事务管理器 --><transactionManager type="JDBC" ><!-- 数据源,池类型的数据源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" ><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdemo" ><property name="username" value="root" ><property name="password" value="123456" ></dataSource></environment></environments><mappers><mapper resource="mappers/MyMapper.xml" ></mappers></configuration>
5.构建sqlSessionFactory(MybatisTest.java)
// 指定全局配置文件String resource = "mybatis-config.xml";// 读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);// 构建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
6.打开sqlSession会话,并执行sql(MybatisTest.java)
// 获取sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 操作CRUD,第一个参数:指定statement,规则:命名空间+“.”+statementId// 第二个参数:指定传入sql的参数:这里是用户idUser user = sqlSession.selectOne("MyMapper.selectUser", 1);System.out.println(user);
示例代码:MybatisTest
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 java.io.InputStream;public class MybatisTest {public static void main(String[] args) throws Exception {// 指定全局配置文件String resource = "mybatis-config.xml";// 读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);// 构建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 获取sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();try {// 操作CRUD,第一个参数:指定statement,规则:命名空间+“.”+statementId// 第二个参数:指定传入sql的参数:这里是用户idUser user = sqlSession.selectOne("MyMapper.selectUser", 1);System.out.println(user);} finally {sqlSession.close();}}}
User.java
import java.text.SimpleDateFormat;import java.util.Date;public class User {private String id;private String userName;private String password;private String name;private Integer age;private Integer sex;private Date birthday;private String created;private String updated;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getCreated() {return created;}public void setCreated(String created) {this.created = created;}public String getUpdated() {return updated;}public void setUpdated(String updated) {this.updated = updated;}@Overridepublic String toString() {return "User{" +"id='" + id + '\'' +", userName='" + userName + '\'' +", password='" + password + '\'' +", name='" + name + '\'' +", age=" + age +", sex=" + sex +", birthday='" + new SimpleDateFormat("yyyy-MM-dd").format(birthday) + '\'' +", created='" + created + '\'' +", updated='" + updated + '\'' +'}';}}
7.目录结构

MyBatis使用步骤总结
1)配置mybatis-config.xml 全局的配置文件 (1、数据源,2、外部的mapper)
2)创建SqlSessionFactory
3)通过SqlSessionFactory创建SqlSession对象
4)通过SqlSession操作数据库 CRUD
5)调用session.commit()提交事务
6)调用session.close()关闭会话
二、mybatis缓存
一级缓存:默认开启 存在session中
条件: 同一个session,相同的sql和参数
update、insert、delete时候会清空缓存
二级缓存:作用域:一个mapper的namespace、同一个namespace查询sql可以从缓存中命中
开启二级缓存:必须序列化
<mapper namespace="com.zpc.mybatis.dao.UserMapper"><cache/></mapper>
关闭二级缓存:
不开启、或者全局mybatis-config.xml中关闭二级缓存
<settings><!--开启驼峰匹配--><setting name="mapUnderscoreToCamelCase" value="true"/><!--开启二级缓存,全局总开关,这里关闭,mapper中开启了也没用--><setting name="cacheEnabled" value="false"/></settings>
三、spring 集成 mybatis
1.引入spring和mybatis相关依赖
pom.xml
<!--数据库连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.1.3.RELEASE</version></dependency><!--spring集成Junit测试--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.1.3.RELEASE</version><scope>test</scope></dependency><!--spring容器--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.3.RELEASE</version></dependency>
2.配置spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 加载配置文件 --><context:property-placeholder location="classpath:properties/*.properties"/><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="driverClassName" value="${jdbc.driver}"/><property name="url"value="jdbc:mysql://${jdbc.host}:3306/${jdbc.database}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"/><property name="username" value="${jdbc.userName}"/><property name="password" value="${jdbc.passWord}"/><!-- 初始化连接大小 --><property name="initialSize" value="${jdbc.initialSize}"></property><!-- 连接池最大数据库连接数 0 为没有限制 --><property name="maxActive" value="${jdbc.maxActive}"></property><!-- 连接池最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态 0 为没有限制 --><property name="maxIdle" value="${jdbc.maxIdle}"></property><!-- 连接池最小空闲 --><property name="minIdle" value="${jdbc.minIdle}"></property><!--最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制--><property name="maxWait" value="${jdbc.maxWait}"></property></bean><!-- spring和MyBatis完美整合 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 自动扫描mapping.xml文件 --><property name="mapperLocations" value="classpath:mappers/*.xml"></property><!--如果mybatis-config.xml没有特殊配置也可以不需要下面的配置--><property name="configLocation" value="classpath:mybatis-config.xml" ></bean><!-- DAO接口所在包名,Spring会自动查找其下的类 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.zpc.mybatis.dao"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- (事务管理)transaction manager --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean></beans>
其中需要的有:
1.配置数据库连接池-比如可以配置不同数据源的数据库连接池
2.配置sqlSessionFactory,指定自动扫描mapping.xml文件、配置mybatis-config.xml,如果没用特殊配置可以不配置
3.配置MapperScannerConfigurer,自动扫描相关Mapper包和类
4.配置transactionManager,事务管理
db.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.host=localhostjdbc.database=ssmdemojdbc.userName=rootjdbc.passWord=123456jdbc.initialSize=0jdbc.maxActive=20jdbc.maxIdle=20jdbc.minIdle=1jdbc.maxWait=1000
在构建sqlSessionFactory时不配置mybatis-config.xml也行:
<!-- spring和MyBatis完美整合 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 自动扫描mapping.xml文件 --><property name="mapperLocations" value="classpath:mappers/*.xml"></property><!--如果mybatis-config.xml没有特殊配置也可以不需要下面的配置--><!--<property name="configLocation" value="classpath:mybatis-config.xml" >--></bean>
3.测试
import com.zpc.mybatis.dao.UserMapper;import com.zpc.mybatis.pojo.User;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.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.io.InputStream;import java.util.Date;import java.util.List;//目标:测试一下spring的bean的某些功能@RunWith(SpringJUnit4ClassRunner.class)//junit整合spring的测试//立马开启了spring的注解@ContextConfiguration(locations="classpath:spring/applicationContext-*.xml")//加载核心配置文件,自动构建spring容器public class UserMapperSpringTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testQueryUserByTableName() {List<User> userList = this.userMapper.queryUserByTableName("tb_user");for (User user : userList) {System.out.println(user);}}@Testpublic void testLogin() {System.out.println(this.userMapper.login("hj", "123456"));}@Testpublic void testQueryUserById() {System.out.println(this.userMapper.queryUserById("1"));User user = new User();user.setName("美女");user.setId("1");userMapper.updateUser(user);System.out.println(this.userMapper.queryUserById("1"));}@Testpublic void testQueryUserAll() {List<User> userList = this.userMapper.queryUserAll();for (User user : userList) {System.out.println(user);}}@Testpublic void testInsertUser() {User user = new User();user.setAge(20);user.setBirthday(new Date());user.setName("大神");user.setPassword("123456");user.setSex(2);user.setUserName("bigGod222");this.userMapper.insertUser(user);System.out.println(user.getId());}@Testpublic void testUpdateUser() {User user = new User();user.setBirthday(new Date());user.setName("静静");user.setPassword("123456");user.setSex(0);user.setUserName("Jinjin");user.setId("1");this.userMapper.updateUser(user);}@Testpublic void testDeleteUserById() {this.userMapper.deleteUserById("1");}@Testpublic void testqueryUserList() {List<User> users = this.userMapper.queryUserList(null);for (User user : users) {System.out.println(user);}}@Testpublic void queryUserListByNameAndAge() throws Exception {List<User> users = this.userMapper.queryUserListByNameAndAge("鹏程", 20);for (User user : users) {System.out.println(user);}}@Testpublic void queryUserListByNameOrAge() throws Exception {List<User> users = this.userMapper.queryUserListByNameOrAge(null, 16);for (User user : users) {System.out.println(user);}}@Testpublic void queryUserListByIds() throws Exception {List<User> users = this.userMapper.queryUserListByIds(new String[]{"5", "2"});for (User user : users) {System.out.println(user);}}
4.目录结构:

自己的项目mybatis配置文件(这里用了多种数据库数据源):
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd "><!-- hive数据库连接配置文件 --><!-- 配置文件位置 --><context:property-placeholder location="classpath:dataSource.properties"/><bean id="dataSourceHive" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" autowire="byName"><property name="driverClassName" value="${hive.driverClass}"/><property name="url" value="${hive.url}"/><property name="username" value="hive"/><property name="password" value=""/><property name="filters" value="stat"/><property name="maxActive" value="${hive.maxActive}"/><property name="initialSize" value="${hive.initialSize}"/><property name="minIdle" value="${hive.minIdle}"/></bean><!-- 配置MyBatis的sqlSessionFactory --><bean id="sqlSessionFactoryHive" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSourceHive"></property><property name="configLocation" value="classpath:mybatis-config.xml"></property><property name="mapperLocations" value="classpath:mapper/hive/*.xml"></property></bean><!-- Mapper接口所在包名,Spring会自动查找其下的Dao接口 --><bean id="Configurerhive" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.rjtx.dao.hive"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryHive"></property></bean><bean id="transactionManagerHive"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSourceHive" /><qualifier value="hive"/></bean><!-- 配置基于注解的声明式事务 --><tx:annotation-driven transaction-manager="transactionManagerHive"></tx:annotation-driven></beans>
#重点:
如:项目用到了Hive、mysql等不同数据库
则配置不同的数据源,然后对应的DriverClass需要配置对应数据库的class、以及配置不同ID的sqlSessionFactory
原理:
使用的时候直接使用Mapper操作数据、由于配置了对应的不同sqlSessionFactory,则操作数据库的时候,会使用不同的sqlSessionFactory-然后操作对应的数据源,数据库
四、springboot 集成 mybatis
1.引入Mybatis
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
2.application.yml文件配置
server:port: 8081spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/zzz?useUnicode=true & characterEncoding=utf-8 &useSSL=true & serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mybatis:mapper-locations: classpath:/mapper/*.xml <!--用于将配置路径下的 * .xml 文件加载到 mybatis 中-->type-aliases-package: com.example.entity <!--指定POJO扫描包来让 mapper.xml 文件的 resultType 自动扫描到自定义POJO,这样就不用每次指定完全限定名-->
3.编写Entity、编写Dao或者Mapper、编写Service、编写Controller
4.启动类添加MapperScan扫描
@MapperScan("com.example.dao")@SpringBootApplicationpublic class SpringmybatisApplication {public static void main(String[] args) {SpringApplication.run(SpringmybatisApplication.class, args);}}
注意:如果不使用@MapperScan注解的话,则需要在对应的DAO或者是Mapper类上添加@Mapper注解,表明它是数据库操作
5.编写Mapper.xml文件,书写sql
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.dao.UserDao"><select id="getUserById" resultType="User">select * from `user` where id=#{id}</select><select id="getUserById2" resultType="User">select * from `user` where age=#{age}</select></mapper>
6.启动,访问
五、springcloud集成mybatis
springcloud的集成和springboot的基本一样,只是对应的有些不同的依赖需要替换成springcloud、不再赘述




