笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

关于spring boot中mybatis的基础使用配置

Posted on 2024-03-30 16:43  草妖  阅读(10)  评论(0)    收藏  举报

一、使用xml配置方式(不常用)

1、引用

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

 

2、示例

SqlMapConfig.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="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3307/数据库"/>
                <property name="username" value="账号"/>
                <property name="password" value="密码"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="dao/UserDao.xml"/>
    </mappers>
</configuration>
dao/UserDao.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="com.namejr.MybitsDemo.dao.IUserDao">
    <select id="findAll" resultType="com.namejr.MybitsDemo.bean.UserInfosModel">
        select user_id as id,user_name as name,user_phone as phone,user_type as uType,user_open_status as openStatus from fms_user_infos;
    </select>
</mapper>

UserInfosModel.java文件

public class UserInfosModel implements Serializable{
    private String id;
    private String name;
    private String phone;
    private Integer uType;
    private Integer openStatus;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public Integer getuType() {
        return uType;
    }
    public void setuType(Integer uType) {
        this.uType = uType;
    }
    public Integer getOpenStatus() {
        return openStatus;
    }
    public void setOpenStatus(Integer openStatus) {
        this.openStatus = openStatus;
    }
}

IUserDao.java文件

public interface IUserDao{
    List<UserInfosModel> findAll();
}

使用

try {
            //1.读取配置文件
            InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.创建SqlSessionFactory工厂
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            //3.使用工厂生产SqlSession对象
            SqlSession session = factory.openSession();
            //4.使用SqlSession创建Dao接口的代理对象
            IUserDao userDao = session.getMapper(IUserDao.class);
            //5.使用代理对象执行方法
            List<UserInfosModel> tempUserInfos = userDao.findAll();
            for(UserInfosModel tempUserInfo:tempUserInfos) {
                System.out.println(JSON.toJSONString(tempUserInfo));
            }
            //6.释放资源
            session.close();
            in.close();
        }
        catch(Exception err) {
            System.out.println(err);
        }

 

二、使用注解

pom.xml

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

 

application.properties

# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testDB?characterEncoding=UTF-8&allowMultiQueries=true&&useAffectedRows=true&allowPublicKeyRetrieval=true
#spring.datasource.username=root
#spring.datasource.password=12345
mybatis.type-aliases-package=*.bean
mybatis.mapper-locations=classpath:/dao/*.xml
 

 

dao/Dao.java

package *.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

/*
* Dao
* */
@Repository
public interface DecryptTrainDao {
@Transactional(isolation = Isolation.READ_COMMITTED)
void insertInfos(InfosModel model);
}

 

启动类一定要用@MapperScans进行扫描,具体看:博客后台 - 博客园 (cnblogs.com)如果集成mybit后,没报错也也无法正常运行或者需要进行扫描关于mybit包dao包,请使用@MapperScans

resources/dao/Dao.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="*.dao.DecryptTrainDao">
    <!-- 通用查询resultMap -->
    <resultMap id="publicHashMapf" type="java.util.HashMap"></resultMap>
    <!-- 插入训练包信息 -->
    <insert id="insertInfos" parameterType="*.InfosModel">
        insert into db1(id,uid) value(#{id}, #{uid});
        insert into db2(id,sid) value(#{id}, #{sid});
    </insert>
</mapper>

 注:数据库默认的隔离级别是REPEATABLE_READ,最好修改为READ_COMMITTED。

具体可查看(本文仅作笔记摘抄):MySQL常见面试题总结 | Java学习&面试指南-程序员大彬 (topjavaer.cn)

生产环境大多使用RC。为什么不是RR呢?

可重复读(Repeatable Read),简称为RR 读已提交(Read Commited),简称为RC

缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多! 缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行!

也就是说,RC的并发性高于RR。

并且大部分场景下,不可重复读问题是可以接受的。毕竟数据都已经提交了,读出来本身就没有太大问题!

常见的隔离级别:

READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更。可能会导致脏读、不可重复读和幻读。

READ_COMMITTED:允许读取已经提交的数据。可以避免脏读,但是不可重复读和幻读仍然可能发生。

REPEATABLE_READ:事务保证可以多次从同一个字段中读取相同的数据,在事务处理过程中,会锁定读取到的所有数据,直到事务结束。可以避免脏读和不可重复读,但幻读仍有可能。

SERIALIZABLE:最高的隔离级别,所有的事务都是按序逐个执行。可以避免所有可能的数据并发问题,但性能通常较差。

在实际应用中,根据具体业务需求选择合适的隔离级别。通常,默认的数据库隔离级别(如MySQL的REPEATABLE_READ)就可以满足大多数需求。只有在确定需要更高或更低隔离级别时,才需要手动设置。

 

问题处理:

如果出现unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService

原因:在一台服务器上启动了两个tomcat,两个tomcat都是用druid。

解决方案:

修改Tomcat 下的 catalina.sh:

  增加此句代码:JAVA_OPTS=”-Ddruid.registerToSysProperty=true