前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis-proxy: 非Spring环境快速配置使用mybatis

Mybatis-proxy: 非Spring环境快速配置使用mybatis

作者头像
品茗IT
发布2019-09-12 09:49:20
1K0
发布2019-09-12 09:49:20
举报
文章被收录于专栏:品茗IT品茗IT

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项目:

Gitee-Mybatis-proxy-test

Github-Mybatis-proxy-test

二、配置

2.1 Maven依赖

下面是我的项目的完整依赖:

代码语言:javascript
复制
<?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>

主要依赖就是:

代码语言:javascript
复制
		<dependency>
			<groupId>cn.pomit</groupId>
			<artifactId>mybatis-proxy</artifactId>
			<version>1.1</version>
		</dependency>

这个依赖将mybatis和mybatis-proxy都依赖进去。

2.2 配置文件

加入这里的配置文件是application.properties.

代码语言:javascript
复制
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:

代码语言:javascript
复制
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来创建对象,否则无法开启事务。

要使用下面的方式,上述代码中注掉的这部分。

代码语言:javascript
复制
UserInfoService userInfoService = ProxyHandlerFactory.getTransaction(UserInfoServiceImp.class);

执行结果:

在这里插入图片描述

四、业务逻辑层

UserInfoService接口:

代码语言:javascript
复制
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注解即可开启事务。如果不需要支持事务,接口是否定义都可:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
package cn.pomit.mybatisproxy.domain;

import java.io.Serializable;

/**
 * The persistent class for the user_info database table.
 * 
 */
public class UserInfo implements Serializable {
	private static final long serialVersionUID = 1L;

	private String userName;

	private String mobile;

	private String name;

	private String passwd;

	private String valid;

	public UserInfo() {
	}

	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getMobile() {
		return this.mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPasswd() {
		return this.passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getValid() {
		return this.valid;
	}

	public void setValid(String valid) {
		this.valid = valid;
	}

	@Override
	public String toString() {
		return "UserInfo [userName=" + userName + ", mobile=" + mobile + ", name=" + name + ", passwd=" + passwd
				+ ", valid=" + valid + "]";
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mybatis-proxy: 非Spring环境快速配置使用mybatis
    • 一、概述
      • 二、配置
        • 2.1 Maven依赖
        • 2.2 配置文件
      • 三、测试执行
        • 四、业务逻辑层
          • 五、Mapper
            • 六、实体
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档