Mybatis-proxy: 非Spring环境快速配置使用mybatis
一、概述
Mybatis本身并不是为Spring环境而生,但Spring对mybatis得调用做了很好得封装,通过Spring,我们可以方便调用Mapper进行CRUD操作。
然而,我们也可能面临这种情况: 我们的项目无法使用Spring,或者没必要使用。这时,我们将怎样操作数据库呢?
对,我们可以通过JDBC操作数据库。也可以用Mybatis拿到SqlSession去操作数据库。
Mybatis-proxy就是为了简化非Spring环境下Mybatis的使用。通过一次调用并搭配注解实现有/无事务的Mybatis操作。
Mybatis-proxy官方地址:https://www.pomit.cn/mybatis-proxy
Mybatis-proxy的Demo项目:
项目地址:
品茗IT-同步发布
品茗IT 提供在线支持:
二、配置
2.1 Maven依赖
下面是我的项目的完整依赖:
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.pomit</groupId>
<artifactId>mybatis-proxy-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-proxy-test</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.40</version>
</dependency>
<dependency>
<groupId>cn.pomit</groupId>
<artifactId>mybatis-proxy</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.pomit.mybatisproxy.MybatisApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
主要依赖就是:
<dependency>
<groupId>cn.pomit</groupId>
<artifactId>mybatis-proxy</artifactId>
<version>1.1</version>
</dependency>
这个依赖将mybatis和mybatis-proxy都依赖进去。
2.2 配置文件
加入这里的配置文件是application.properties.
mybatis.mapper.scan=cn.pomit.mybatisproxy.mapper
mybatis.datasource.type=POOLED
mybatis.datasource.driver=com.mysql.jdbc.Driver
mybatis.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
mybatis.datasource.username=cff
mybatis.datasource.password=123456
三、测试执行
下面是一个main方法MybatisApp,方法里先读取配置文件,然后调用MybatisConfiguration.initConfiguration(properties )
对mybatis进行初始化。
然后就是调用service,如果不添加事务支持,可以直接new 一个service即可。
MybatisApp:
package cn.pomit.mybatisproxy;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import cn.pomit.mybatis.ProxyHandlerFactory;
import cn.pomit.mybatis.configuration.MybatisConfiguration;
import cn.pomit.mybatisproxy.domain.UserInfo;
import cn.pomit.mybatisproxy.service.UserInfoService;
import cn.pomit.mybatisproxy.service.UserInfoServiceImp;
public class MybatisApp {
public static String PropertiesFile = "application.properties";
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
//也可以直接写在代码里。
// properties.put("mybatis.mapper.scan", "cn.pomit.mybatisproxy.mapper");
// properties.put("mybatis.datasource.type", "POOLED");
// properties.put("mybatis.datasource.driver", "com.mysql.jdbc.Driver");
// properties.put("mybatis.datasource.url", "jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
// properties.put("mybatis.datasource.username", "cff");
// properties.put("mybatis.datasource.password", "123456");
//读取配置文件
InputStream resource = MybatisApp.class.getClassLoader().getResourceAsStream(PropertiesFile);
if(resource == null){
throw new IOException(PropertiesFile + "文件不存在!");
}
properties.load(resource);
resource.close();
MybatisConfiguration.initConfiguration(properties );
// UserInfoService userInfoService = ProxyHandlerFactory.getTransaction(UserInfoServiceImp.class);
UserInfoService userInfoService = new UserInfoServiceImp();
UserInfo userInfo = userInfoService.findUser("cff");
System.out.println(userInfo.toString());
}
}
事务支持
如果需要事务支持,在需要事务支持的类上,添加@Transactional注解,该注解是cn.pomit注解,非javax注解,只能用于类上,不能在方法上使用。
添加@Transactional注解的类,不能使用new来创建对象,否则无法开启事务。
要使用下面的方式,上述代码中注掉的这部分。
UserInfoService userInfoService = ProxyHandlerFactory.getTransaction(UserInfoServiceImp.class);
执行结果:
四、业务逻辑层
UserInfoService接口:
package cn.pomit.mybatisproxy.service;
import cn.pomit.mybatisproxy.domain.UserInfo;
public interface UserInfoService {
public UserInfo findUser(String userName);
public int save(UserInfo user) throws Exception;
}
UserInfoServiceImp实现类,这个之所以要定义接口,是因为要支持事务,在实现类上加上@Transactional注解即可开启事务。如果不需要支持事务,接口是否定义都可:
package cn.pomit.mybatisproxy.service;
import cn.pomit.mybatis.ProxyHandlerFactory;
import cn.pomit.mybatis.annotation.Transactional;
import cn.pomit.mybatisproxy.domain.UserInfo;
import cn.pomit.mybatisproxy.mapper.UserInfoMapper;
@Transactional
public class UserInfoServiceImp implements UserInfoService{
UserInfoMapper userInfoMapper = ProxyHandlerFactory.getMapper(UserInfoMapper.class);
public UserInfo findUser(String userName) {
return userInfoMapper.selectByUserName(userName);
}
public int save(UserInfo user) throws Exception{
UserInfo test = userInfoMapper.selectByUserName(user.getUserName());
System.out.println(test);
if(test == null){
int ret = userInfoMapper.save(user);
System.out.println(ret);
return ret;
}
return -1;
}
}
五、Mapper
mapper书写方式无任何变化,如果用注解写mybatis的sql,可保持不变,如果用xml写sql,需要注意的是,xml文件要和java文件放在同一个包下面,同时,xml和java文件的名称一致。
UserInfoMapper:
package cn.pomit.mybatisproxy.mapper;
import org.apache.ibatis.annotations.Mapper;
import cn.pomit.mybatisproxy.domain.UserInfo;
@Mapper
public interface UserInfoMapper {
UserInfo selectByUserName(String userName);
int save(UserInfo userInfo);
}
UserInfoMapper.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="cn.pomit.mybatisproxy.mapper.UserInfoMapper">
<resultMap id="baseResultMap" type="cn.pomit.mybatisproxy.domain.UserInfo">
<id column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="passwd" jdbcType="VARCHAR" property="passwd" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="mobile" jdbcType="VARCHAR" property="mobile" />
<result column="valid" jdbcType="VARCHAR" property="valid" />
</resultMap>
<select id="selectByUserName" resultMap="baseResultMap">
select user_name,passwd,name,mobile,valid from user_info where user_name = #{userName}
</select>
<insert id="save">
insert into user_info (user_name,passwd,name,mobile,valid)
values (#{userName},#{passwd},#{name},#{mobile},#{valid})
</insert>
</mapper>
六、实体
UserInfo:
详细完整的实体,可以访问品茗IT-博客《Mybatis-proxy: 非Spring环境快速配置使用mybatis》进行查看
快速构建项目
喜欢这篇文章么,喜欢就加入我们一起讨论Mybatis-Proxy技术吧!