MyBatis是一个开源的Java持久层框架,它通过简单的XML或注解配置,实现了对关系数据库的操作。MyBatis优点在于它可以自定义SQL语句,将程序代码与SQL语句分离,避免了在Java代码中写SQL语句的不便和繁琐,同时还能提供动态SQL的支持。
MyBatis支持的数据库包括MySQL、Oracle、DB2、SQLServer、Sybase、PostgreSQL、H2等常见的关系型数据库,它提供了丰富的映射标签和查询标签,可以使开发人员使用MyBatis进行各种复杂的SQL操作。
这一部分可直接跳过
MyBatis还提供了插件的扩展机制,可以通过插件来增强MyBatis的功能,比如实现分页查询、记录SQL语句执行时间等。 MyBatis的插件机制基于拦截器模式,开发人员可以通过实现Interceptor接口来创建自定义插件,并在MyBatis的配置文件中配置插件。 插件的核心是实现拦截器接口中的intercept方法。该方法接收一个Invocation对象作为参数,Invocation对象封装了要执行的SQL语句以及执行该语句的对象。通过拦截器可以对该SQL语句进行修改,或者在执行前后执行一些其他逻辑。 下面是一个简单的插件实现示例:
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class ExamplePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取原始的参数
Object[] args = invocation.getArgs();
// 执行原始的SQL语句
Object result = invocation.proceed();
// 对查询结果进行加工
return result;
}
@Override
public Object plugin(Object target) {
// 使用MyBatis提供的Plugin.wrap方法来生成代理对象
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 可以在这里读取配置文件中的参数
}
}
在配置文件中配置插件非常简单,只需要将插件类的全限定名添加到标签中即可:
<configuration>
<plugins>
<plugin interceptor="com.example.ExamplePlugin">
<!-- 配置插件需要的参数 -->
</plugin>
</plugins>
</configuration>
需要注意的是,插件的拦截器类型和方法需要和被拦截的对象对应。比如上面的示例中,@Signature注解中指定的是Executor类的query方法,那么该插件就只能拦截Executor对象的query方法。
springboot集成mybatis的过程很简单,如下简单的几步。
直接将下面的依赖引入springboot的pom文件中:
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
注意我这个mybatis版本为3.0.1,如果需要选择合适自己的版本可以点击链接跳转选择合适版本,点击跳转 然后点击相应的版本,选择maven,复制依赖粘贴到pom文件即可。
加入依赖之后需要在配置文件中配置数据源和mybatis,在yaml文件或者properties文件中添加如下模板:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #mysql8的驱动
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
username: root
password: root
mybatis:
mapper-locations: classpath:mapper/*.xml
然后需要在启动类添加一个注解@MapperScan("com.example.mapper")
@SpringBootApplication
@MapperScan(basePackages = "com.example.mapper")
public class GdFApplication {
public static void main(String[] args) {
SpringApplication.run(GdFApplication.class, args);
}
}
到此基本的配置已经完成。
对于在springboot中使用mybatis有以下几种方式:
对于我个人来说,我是比较喜欢使用注解方式使用mybatis的,这里两种方式都简单的说一下吧。
定义Mapper接口并使用注解定义SQL语句:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id=#{id}")
User findById(Long id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(User user);
@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
int delete(Long id);
}
在应用程序中使用Mapper接口:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findById(Long id) {
return userMapper.findById(id);
}
public int insert(User user) {
return userMapper.insert(user);
}
public int update(User user) {
return userMapper.update(user);
}
public int delete(Long id) {
return userMapper.delete(id);
}
}
这里推荐使用IDEA
中的一款插件better-mybatis-generator
,使用步骤如下:
注意下载后启用该插件。
按上图步骤点击MySQL之后,按下图所示操作:
注意在点击Test Connection弹出success提示后再点击apply和OK。
前提是你选中的数据库中已有数据表,然后鼠标右键该表,在弹出的内容中,选择mabatis-generate
。然后进入下一步。
这里咱也不知道问什么mybatis-generator插件怎么变成了mabatis-generate了。
在根据自己的需要之后,就可以点击ok进行代码生成,生成前可能会弹出输入数据库的账号密码,输入即可。 注意:如果输入账号密码后出现Failed to connect…则检查一下配置的数据库中的url是否有时区设置,如下图所示。
若没有,则加上?serverTimezone=GMT&useSSL=false
之后重新按照以上步骤生成代码即可,生成成功的代码如下所示。