使用mybatis也是有一段时间了,但是一直没有系统了解和学习,最近正好有空,索性花点时间熟悉下。
为什么是mybatis?
了解mybatis之前,需要知道什么是"数据库持久层",我的理解,就是将数据存储至存储介质设备(包括硬盘、磁带等)功能的框架。此处提及到数据库,那么最先联想到的就是直接SQL语句的增删改查功能,而早期JAVA语言中,用的最多的便是JDBC连接数据库操作,但是使用起来繁琐,并且如果切换数据库类型后,容易出现SQL语句不匹配的问题,这时候使用对象映射的方式,底层解决了不同数据库之间的语法兼容问题。类似的框架很多,hibernate也是其中的佼佼者,而今天我们主要学习下mybatis,之所以是用mybatis,主要因为她具备了一下优点:
- 无需使用JDBC方式,减少了代码开发量
- 非常简单的持久层框架,学习曲线低,容易上手
- 语句与代码分离,SQL写在XML中,降低耦合
- 提供各种强大的标签,方便注入使用,并支持对象ORM字段映射
- 生态成熟,兼容多种数据库,并具有多种插件使用
- 与spring框架能很好的集成
当然,网上提到了缺点:
- 主要对于复杂的数据查询,需要手动编写,至于字段多这个问题,我觉得使用mybatis generater针对单表查询能提高不少效率,而针对特别复杂的查询,个人觉得项目中这部分的工作量还是较少的
安装mybatis
mybatis的地址:https://mybatis.github.io/mybatis-3/,帮助手册:https://mybatis.org/mybatis-3/zh/index.html。快速安装步骤如下:
一、安装依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
二、添加配置
添加jdbc配置,jdbc.properties,配置信息如下:
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3388/db_ddyx?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.userId=root
jdbc.password=root
然后添加mybatis的配置文件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">
<!-- 注意顺序,否则报错:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)". -->
<!-- 具体标签使用请参考:https://mybatis.net.cn/configuration.html -->
<configuration>
<!-- 引入配置文件,或者子元素中设置 -->
<properties resource="jdbc.properties" />
<!-- 配置信息 -->
<settings>
<!-- 打印查询日志 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 类型别名 -->
<typeAliases>
<typeAlias alias="User" type="tiny.mybatis2.models.User" />
</typeAliases>
<!-- 配置环境,可以支持多种不同的工作模式 -->
<environments default="development">
<!-- 配置开发环境 -->
<environment id="development">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源,三种内建数据源:UNPOOLED、POOLED、JNDI -->
<dataSource type="POOLED">
<!-- 连接数据库的属性 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.connectionURL}"/>
<property name="username" value="${jdbc.userId}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="tiny.mybatis2.mapper/UserMapper.xml"/>
</mappers>
</configuration>
当然上面只使用了常见的一些配置,如果需要查看详细的配置说明,可以查看官方文档,查看详情。
三、编写对象interface
在tiny.mybatis2.mapper包中,编写对应接口,代码如下:
package tiny.mybatis2.mapper;
import tiny.mybatis2.models.User;
import java.util.List;
public interface IUserMapper {
/**
* 获取所有用户
* @return
*/
List<User> findAll();
/**
* 获取某个用户
* @param uid
* @return
*/
User findOne(String uid);
}
上面定义了最简单的对象操作方法,如果需要更复杂的方法,进行扩展即刻。
四、编写对象model
接下来编写映射对象,内容如下:
package tiny.mybatis2.models;
import java.io.Serializable;
public class User implements Serializable {
private int uid;
private String mobile;
private String unick;
@Override
public String toString(){
return getClass().getSimpleName() +
"[" +
"uid = " + uid +
", mobile = " + mobile +
", unick = " + unick +
"]";
}
}
此对象可以在映射文件中使用,作为返回类型。
五、编写映射XML文件
此处我们简单的编写了一个xml文件,位置为:tiny.mybatis2.mapper,内容如下:
<?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="tiny.mybatis2.mapper.IUserMapper">
<select id="findAll" resultType="tiny.mybatis2.models.User">
select * from g2_user
</select>
<select id="findOne" resultType="tiny.mybatis2.models.User" parameterType="string">
select * from g2_user where uid = #{uid}
</select>
</mapper>
上面为最简单的演示,如果需要更复杂的查询,可以查看帮助文档:帮助详情
六、测试调用
为了方便获取SqlSession,撰写了SqlSessionUtils工具类:
package tiny.mybatis2.utils;
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.IOException;
public class SqlSessionUtils {
public static SqlSession getSqlSession(){
//-------- 从XML中构建SqlSessionFactory --------
SqlSession session = null;
try {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
//-------- 不使用XML构建SqlSessionFactory,参考官网 -------
/*
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
*/
//从SqlSessionFactory获取SqlSession
session = factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return session;
}
}
然后使用test文件调用:
package tiny.mybatis2;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import tiny.mybatis2.mapper.IUserMapper;
import tiny.mybatis2.models.User;
import tiny.mybatis2.utils.SqlSessionUtils;
import java.util.List;
public class TestDemo {
@Test
public void testFindAll() {
SqlSession session = SqlSessionUtils.getSqlSession();
IUserMapper userMapper = session.getMapper(IUserMapper.class);
//测试数据
List<User> users = userMapper.findAll();
for(User item: users){
System.out.println(item.toString());
}
session.close();
}
@Test
public void testFindOne() {
SqlSession session = SqlSessionUtils.getSqlSession();
IUserMapper userMapper = session.getMapper(IUserMapper.class);
User user = userMapper.findOne("10010680");
if(user != null){
System.out.println(user);
}else{
System.out.println("result is empty");
}
}
}
Run “TestDemo”,结果如下:
至此,mybatis的简单使用完毕,以上代码已上传至github上,传送门:点击打开。
下一篇,来学习一下如何集成mybatis进去到spring中,正常使用中,我们一般都会将mybatis和其它框架一起使用,现在很少自己手动去配置,当然之所以学习基础用法,也是在我们遇到比较复杂的场景之下,可以通过已掌握的知识深入定制,而达到我们的目的。