java-springBoot使用mybaties Demo(看这一篇就够了)

本文详细介绍了如何在SpringBoot项目中集成MyBatis-Plus,配置数据库连接,编写映射XML,使用if标签处理空值,以及实现动态数据源切换。涵盖了从环境配置到实际操作的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

配置

流程

查询

循环插入以及插入(只含.xml sql)

mybatis if标签(.xml中)

mybaits开启java类驼峰命名自动映射mybaits中的下划线


配置

首先创建springBoot项目,jdk选择1.8

然后倒入mybaties的相关依赖

我们用的springBoot,当然spring全家桶里面含有mybaties,所以我们直接使用升级版的mybaties-plus。

引入这3个

lombok省的我每次创建对象,都需要get、set方法,以及toString

(IDEA里面也要安装lombok插件-》file->setting->plugin->搜索lombok安装,完后重启idea,这样lombok在idea中不报错)

mybatis-plus,mybaties的相关jar

mysql-connector-java 基本的jdbc驱动链接mysql,mybatis也要依赖他

	<properties>
		<java.version>1.8</java.version>
		<mybatis-plus.version>3.4.2</mybatis-plus.version>
	</properties>

    <dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-boot-starter</artifactId>
		<version>${mybatis-plus.version}</version>
	</dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.4</version>
			<scope>provided</scope>
		</dependency>

然后像我这样,假设我们要搭建一个非常2的大工程,建立这几个目录和文件

controller->TestController.java(class)

mapper->TestMapper.java(interface)

service->impl->TestServiceImpl.java(class)

service->TestService.java(interface)

resources->mapper->TestMapper.xml(映射xml)

接下来我们需要一个SqlSessionFactory,去解析一个个sql.xml。

而sqlSessionFactory,由SqlSessionFactoryBuilder 构建,构建一个SqlSessionFactoryBuilder ,需要链接mysql的账号密码地址。所以要读取你的账号密码,那在resource目录下创建一个xml用于他去读取。

我在resources下的mapper里面创建一个mybaties-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">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="192.168.19.88"/>
                <property name="username" value="m11"/>
                <property name="password" value="m11@2022"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/TestMapper.xml"/>
    </mappers>
</configuration>

创建一个domain包,用来与mysql做相关映射,我在里面创建了一个实体类,与数据库做映射

@Data的就是我第一次导入的那个包,能够自动通过@Data注解,生成这个实体类的get、set方法以及toString方法。


package com.example.demo.domain;

import lombok.Data;

@Data
public class BZGG {
    String req_date;
    String stock_code;
    String stock_name;
    double fNextIncrease;
    double fNextAvgIncrease;
    String updatetime;

    public BZGG(String req_date, String stock_code, String stock_name, double fNextIncrease, double fNextAvgIncrease, String updatetime) {
        this.req_date = req_date;
        this.stock_code = stock_code;
        this.stock_name = stock_name;
        this.fNextIncrease = fNextIncrease;
        this.fNextAvgIncrease = fNextAvgIncrease;
        this.updatetime = updatetime;
    }

    public BZGG() {
    }
}

在mapper中的TestMapper中编写一个地址,并且加上Mapper映射

package com.example.demo.mapper;

import com.example.demo.domain.BZGG;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface TestMapper {
    List<BZGG> getBZGGonTime(String req_date);

}

流程

mybaties的代码流程图

 resources中的sql配置(TestMapper.xml)

namespace命名空间指向你的mapper接口(interface)

查询

<?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="com.example.demo.mapper.TestMapper">
    <select id="getBZGGonTime" resultType="com.example.demo.domain.BZGG">
        select * from   db_guoyuan.t_longhubang_stock_bzgg where req_date = #{req_date}
    </select>
</mapper>

controller层代码(你到时候可以自己分离service),为了突出mybaties暂时写到一起了

package com.example.demo.controller;



import com.example.demo.domain.BZGG;
import com.example.demo.mapper.TestMapper;
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.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


@RestController
public class TestController {
    @RequestMapping(value = "/Test", method = RequestMethod.GET)
    @ResponseBody
    public String getDemo(@RequestParam("num") int i) {
        String resource = "mapper/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        TestMapper mapper = sqlSession.getMapper(TestMapper.class);
        List<BZGG> bzgGonTime = mapper.getBZGGonTime("2022-04-08");

        return bzgGonTime.toString();
    }
}

另外SpringApplication启动类,因为导入了mybaties,所以要启动时加载某个类,否则会出现url找不到等错误。

将@springBootApplication改成下面的

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class })
package com.example.demo;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;

//在启动类的@SpringBootApplication加上
//避免冲突,加入exclude
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class })

public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);


	}

}

测试:

循环插入以及插入(只含.xml sql)

<insert id="addHotEventTagsDes">
    insert into etf_hot_event_fund_tag4des
        (hotEventId,tag,etf_type,code)
    values
    <foreach collection="etfTagsDes" item="etfTagsDe" separator =",">
        (#{hotEventId},#{etfTagsDe.tag},#{etfTagsDe.etfType},#{etfTagsDe.code})
    </foreach>
</insert>

mybatis if标签(.xml中)

有时候为空的情况,就不执行这条语句,避免获取不到对应字段,而报错

其中test代表true表示执行if中的语句,为fasle不执行

    <if test="etfHotEventTags.size() > 0">
    insert into etf_hot_event_tag(hot_event_id,tag,etf_type,name)
    values
    <foreach collection="etfHotEventTags" item="etfHotEventTag" separator =",">
        (#{hotEventId},#{etfHotEventTag.tag},#{etfHotEventTag.etfType},#{etfHotEventTag.name})
    </foreach>;
    </if>

mybaits开启java类驼峰命名自动映射mybaits中的下划线

在mybatis-config.xml中配置

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

mybaties读取外部配置文件(正式环境-数据迁移必备)

你是否痛恨于切换数据源要频繁修改代码?重新打包?

那你来对了,俺教你,能够非常轻量的解决这个问题

 通过定义外部配置文件与jar包分离,每次启动jar包,mybaties就会动态从某个磁盘的位置加载数据库连接,当你要切换数据源,只要修改外部文件,重启jar包就可以释放双手。

经查阅官方文档,发现,构造sqlSession时,传入外部properties文件就可以达到此目的

下面创建一个外部文件

将mybaites.config写成动态的

连接类的方法

private static SqlSessionFactory sqlSessionFactory;
private static final Class CLASS_LOCK = DBCPUtil.class;
public static SqlSession getMybaiteSession(){
    if (sqlSessionFactory == null){
        initSqlSessionFactory();
    }

    SqlSession sqlSession = sqlSessionFactory.openSession();
    return sqlSession;
}

public static SqlSessionFactory initSqlSessionFactory(){
    String resource = "mapper/mybaties-config.xml";
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
        e.printStackTrace();
    }
    synchronized (CLASS_LOCK){
        if(sqlSessionFactory == null){
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,DBproperties);
        }
    }

    return sqlSessionFactory;
}

每次使用完毕,记得要关闭链接(红色部分是需要被改的内容,如果是写入,记得commit)

SqlSession mybaiteSession=null;
try {
    if(dataSource.equals("mysql")){
        //拼接字段,将jsonObj转换为sql字符串拼接的字段
        filedsRs = SqlTools.transStringFiled(fieldName);
        newsId2Name=newsId2Name+"_tmp";

        mybaiteSession = DBCPUtil.getMybaiteSession();
        readMapper = mybaiteSession.getMapper(ReadDataMapper.class);

        readMapper.readData(
                new ReadParamer(stepName, dataSource, tableName,
                        conditions, fieldName, newsId2Name, filedsRs));

        }else{
    return new RsJsonBean(0,"数据源名称不存在");
    }
}catch (Exception  e){

    e.printStackTrace();

    return new RsJsonBean(0,e.toString());
}finally {
    if(mybaiteSession!=null){
        mybaiteSession.close();
    }
}

配置druid连接池(原版的mybaits连接池不好用,可配置内容太少了)

<?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">

<configuration>


    <settings>
        <!-- 打印查询语句 -->    <!--调试使用-->
<!--        <setting name="logImpl" value="STDOUT_LOGGING" />-->

        <!--驼峰自动转换数据库下划线-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--3、环境 使用哪个数据源-->
    <environments default="druid">
        <environment id="druid">
            <transactionManager type="jdbc"/>
            <!--            配置druid数据连接池-->
            <dataSource type="com.dahua.utils.DuridDataSourceFactory">
                <property name="jdbcUrl" value="${mysql.URL}"/>
                <property name="driverClass" value="${mysql.Driver}"/>
                <property name="username" value="${mysql.USER}"/>
                <property name="password" value="${mysql.PASSWORD}"/>
                <!-- 初始连接数,默认为0 -->
                <property name="initialSize" value="30"/>
                <!-- 最大连接数,默认为8 -->
                <property name="maxActive" value="100"/>
                <!-- 最小闲置数 -->
                <property name="minIdle" value="10"/>
                <!-- 获取连接的最大等待时间,单位为毫秒 -->
                <property name="maxWait" value="20000"/>
                <!-- 缓存PreparedStatement,默认为false
                <property name="poolPreparedStatements" value="true"/>-->
                <!-- 缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置 -->
                <property name="maxOpenPreparedStatements" value="20"/>


                <property name="removeAbandoned" value="true" />
                <property name="removeAbandonedTimeout" value="300" />
                <!--<property name="logAbandoned" value="true" />-->
                <!--上面那个为日志调试-->

            </dataSource>
        </environment>
    </environments>
<!--    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.Driver}"/>
                <property name="url" value="${mysql.URL}"/>
                <property name="username" value="${mysql.USER}"/>
                <property name="password" value="${mysql.PASSWORD}"/>
            </dataSource>
        </environment>
    </environments>-->

    <mappers>
        <mapper resource="mapper/RunMapper.xml"/>
        <mapper resource="mapper/ReadDataMapper.xml"/>
        <mapper resource="mapper/WriteDataMapper.xml"/>
        <mapper resource="mapper/CalcDataMapper.xml"/>
        <mapper resource="mapper/MergeDataMapper.xml" />
        <mapper resource="mapper/InfoMapper.xml" />
        <mapper resource="mapper/UploadMapper.xml" />
        <mapper resource="mapper/BaseObjectMapper.xml"/>
        <mapper resource="mapper/IfMapper.xml" />
        <mapper resource="mapper/FieldCalcMapper.xml" />

    </mappers>
</configuration>

噢,差点忘记了,你们要的druid依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
</dependency>

 DBproperties的构造方法,请参考这篇

java程序加载外部配置(含单独jar以及springBoot)_我要用代码向我喜欢的女孩表白的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值