mybatis中sqlsession的管理

不结合spring与mybatis,直接用mybatis

首先引入mybatis的依赖   以及druid池和mysql驱动一起加进来

        <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.9</version>
		</dependency>
			<!--mybatis依赖 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.1</version>
		</dependency>
		<!-- mysql连接 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.34</version>
		</dependency>

起初直接用mybatis有个自带的连接池,后来找找看能不能这种方式也用druid性能高点的池,还真有

mybatis-cfg.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>

	<!-- 引入数据库连接配置文件 -->
	<properties resource="db.properties"></properties>
	<environments default="production">
		<!-- 生产环境 -->
		<environment id="production">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="com.jdy.utils.DruidDataSourceFactory">
				<property name="driverClassName" value="com.mysql.jdbc.Driver" />
				 <property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" /> 
				
			</dataSource>
		</environment>
	</environments>

	<!-- 定义映射文件 -->
	<mappers>
		<!-- sql映射文件的路径 -->
		<mapper resource="mapper/TvMapper.xml"/> 
		<!-- 也可以通过配置接口的包扫描,但是xml文件路径要和接口的包路径一样 -->
		<!-- <package name="com.jdy.dao" /> -->
	</mappers>

</configuration>

关键的一行   <dataSource type="com.jdy.utils.DruidDataSourceFactory">

自己找个路径   继承 UnpooledDataSourceFactory  将配置在这DataSource

package com.jdy.utils;

import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

import com.alibaba.druid.pool.DruidDataSource;

public class DruidDataSourceFactory extends UnpooledDataSourceFactory{
	
	public DruidDataSourceFactory() {
		this.dataSource=new DruidDataSource();
	}

}

由此使用到了 durid 连接池

sqlsession的具体使用

public class MybatisUtils {

	private static Logger logger = Logger.getLogger(MybatisUtils.class);

	private static SqlSessionFactory sqlSessionFactory;

	public MybatisUtils() {
		super();
	}

	static {
		

		// 加载mybatis配置文件和映射文件,并获取sqlSession

		String resourse = "mybatis-cfg.xml";
		try {
			InputStream inputStream = Resources.getResourceAsStream(resourse);
				// 本地测试 不引用外部配置文件
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			}
			Configuration configuration = sqlSessionFactory.getConfiguration();
			logger.debug("configuration---->>" + configuration);
			Environment environment = configuration.getEnvironment();
			logger.debug("Environment--->>" + environment);
			DataSource dataSource = environment.getDataSource();
			logger.debug("dataSource--->>" + dataSource);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static SqlSession getSqlSession() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		return sqlSession;
	}

}

具体代码内使用

public static void onLine(Actions action, boolean isOnLine) {
		int result = 0;
		SqlSession sqlSession = MybatisUtils.getSqlSession();
		TvMapper mapper = sqlSession.getMapper(TvMapper.class);
		try {
			 mapper.updateOnLineDouble(action);
			sqlSession.commit();
		} catch (Exception e) {
			sqlSession.rollback();
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
		
	}

opensession得到一个具体的sqlsession      commit提交更改的sql     也可自动提交在open那里设为true    

需要注意的是  增删改都需要手动commit  如果没有设置自动提交的话,默认是false的 

而查的话是不需要commit的,应该说是有自动提交的,   

最最重要的是      finally 中必须一定千万记得  close

以上的话就是使用的一个完整的流程

还有 mapper.xml 中还有一个小知识点

以前不太注意  <where> 标签的用法,这个where 标签的作用是有if这种判断且有or  或者and 连接条件的不确定时候加上,

如果两个都有and   or   没有where 标签的话   会select  XX from XX where and XX=xx

这样显然不是我们想要的,加上之后会自动给你去掉符合规范的。

猜你喜欢

转载自blog.csdn.net/weixin_41086086/article/details/94644386