MyBatis系列-动态连接数据库

本文介绍如何使用Java代码动态实例化MyBatis对象,包括DataSource、SqlSessionFactoryBean、SqlSessionFactory和SqlSession,实现数据库的动态连接。并通过DynamicMapper接口和对应的XML文件,展示动态SQL语句的执行过程。
部署运行你感兴趣的模型镜像

前言

MyBatis是目前java项目连接数据库的最流行的orm框架了。常用的使用方法是配置datasource,编写dao和mapper,最后通过依赖注入调用dao的方法来操作数据。本篇使用MyBatis来动态生成MyBatis的对象,动态配置数据库连接操作数据库。

动态数据库连接

使用MyBaits常规方式是在xml或者properties来配置MyBatis,但是这样会把配置参数写死。如果想要动态访问数据库,我们能自己手动实例化MyBatis对象。

DataSource对象

还记得我们在经常在xml配置文件中,配置一个Datasource对象,设置数据连接相关参数。这里我们使用代码动态实例化一个PooledDataSource

PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");

mapper路径

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:/mapper/*Mapper.xml");

MybatisSqlSessionFactoryBean对象

MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setDataSource(dataSource);

SqlSessionFactory对象

SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();

SqlSession对象

记住,这里的sqlsession生成后,请保存到一个HashMap就像一个数据库连接池一样,可以反复使用。否则,每次数据库操作都会打开一个新的数据库连接,造成数据库连接超限,导致数据库瘫痪。

SqlSession sqlsession = sqlSessionFactory.openSession();
// 调用数据库操作方法
sqlsession.close()

我们平常使用MyBatis时,会在xml或者properties文件中配置的参数,然后MyBatis会使用这些参数实例化以上对象。

动态sql语句

动态配置了MyBatis的数据库连接,并生成MyBatis对象。接下来,就是常规的利用MyBatis的Mapper模板来实现数据的增删改查了。

DynamicMapper类

public interface DynamicMapper {
    List<Map<String, Object>> selectSql(@Param("tableName") String tableName, @Param("fields") String fields, @Param("whereCondition") String whereCondition, @Param("orderCondition") String orderCondition);

    Integer insertSql(@Param("tableName") String tableName, @Param("result") String result);

    Integer updateSql(@Param("tableName") String tableName, @Param("result") String result, @Param("whereCondition") String whereCondition);

    Integer deleteSql(@Param("tableName") String tableName, @Param("whereCondition") String whereCondition);
}

DynamicMapper.xml

<mapper namespace="com.camellibby.pangu.openapi.mapper.DynamicMapper">
	<select id="selectSql" resultType="java.util.LinkedHashMap">
		select ${fields} from ${tableName}
		<if test="whereCondition != null and whereCondition != ''">
			where ${whereCondition}
		</if>
		<if test="orderCondition != null and orderCondition != ''">
			order by ${orderCondition}
		</if>
	</select>

	<insert id="insertSql">
		insert into ${tableName} ${result}
	</insert>

	<update id="updateSql">
		UPDATE ${tableName} SET ${result} WHERE ${whereCondition}
	</update>

	<delete id="deleteSql">
		delete from ${tableName} WHERE ${whereCondition}
	</delete>
</mapper>

DynamicMapper动态运行sql语句

DynamicMapper dynamicMapper = sqlsession.getMapper(DynamicMapper.class);
List<Map<String, Object>> users = dynamicMapper.selectSql(
		"users",
		"username, password, enabled",
		"enabled=0",
		"username"
);
users.forEach(user ->
        user.keySet().forEach(key ->
			System.out.println(key + ":" + user.get(key))
		)
);

测试

运行测试用例,进行sql查询,输出如下

03:32:46.245 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@68044f4] will not be managed by Spring
03:32:46.260 [main] DEBUG DynamicMapper.selectSql - ==>  Preparing: select username, password, enabled from users where enabled=0 order by username 
03:32:46.338 [main] DEBUG DynamicMapper.selectSql - ==> Parameters: 
03:32:46.385 [main] DEBUG DynamicMapper.selectSql - <==      Total: 6
username:Chandler
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false
username:Joey
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false
username:Monica
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false
username:Phoebe
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false
username:Rachel
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false
username:Ross
password:{bcrypt}$2a$10$/8MMuGgPbNXoiMgvS3uabuQiRMW3f96wLP/ifZ3VcSHo28OuzB8Hu
enabled:false

和数据库查询结果一致,结果如下
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

### MyBatis-Plus 数据库操作使用指南 MyBatis-Plus 是一款强大的 MyBatis 增强工具,能够显著简化开发流程并提升效率。以下是关于如何在 IntelliJ IDEA 中设置并使用 MyBatis-Plus 进行数据库操作的具体说明。 #### 1. 配置环境 为了开始使用 MyBatis-Plus,需先确保项目的依赖已正确引入。可以在 `pom.xml` 文件中添加如下 Maven 依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 接着,在 Spring Boot 的配置文件(通常是 `application.yml` 或 `application.properties`)中定义数据库连接参数[^3]。例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 2. 创建实体类 创建与数据库表对应的实体类,并标注必要的注解以便实现自动映射功能。例如: ```java import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") // 映射到 user 表 public class User { private Long id; // 主键字段 private String name; @TableLogic // 定义逻辑删除字段 private Integer deleted; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getDeleted() { return deleted; } public void setDeleted(Integer deleted) { this.deleted = deleted; } } ``` #### 3. 编写 Mapper 接口 Mapper 接口继承自 MyBatis-Plus 提供的基础接口 `BaseMapper<T>`,从而获得一系列 CRUD 方法的支持。例如: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> {} ``` 无需额外编写 XML 文件即可直接调用方法执行增删改查操作。 #### 4. 启动类扫描配置 确认启动类上是否启用了组件扫描机制,以加载 Mapper 接口实例化所需的必要条件。通常情况下,只需简单声明 `@MapperScan` 注解即可: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; @SpringBootApplication @MapperScan("com.example.mybatisplusjoin.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 5. 功能扩展 除了基本的 CRUD 支持外,MyBatis-Plus 还提供了丰富的高级特性来优化开发体验,比如 SQL 日志打印、主键生成策略、逻辑删除等[^2]。下面列举几个常用场景及其解决方案: - **SQL 执行日志** 只需开启调试模式或将 logLevel 设置为 TRACE 即可查看详细的 SQL 输出信息。 - **主键生成策略** 在实体类属性上方指定合适的主键生成方式,如 UUID 或者自增序列编号。 - **逻辑删除** 利用 `@TableLogic` 注解标记某列作为软删除标志位,配合全局配置启用该行为。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值