Mybatis执行sqlSession.insert()和sqlSession.update()需要commit

1 篇文章 0 订阅
1 篇文章 0 订阅
Mybatis执行sqlSession.insert()和sqlSession.update()

在执行sqlSession.insert()和sqlSession.update()后需要进行 sqlSession.commit(),否则数据库不会插入数据,而且自增长id的情况下,在下一次成功的时候,会将未commit的数据id跳过。

@Test
 public void testUpdate(){
     //mybatis配置文件
     String resource = "conf.xml";
     //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
     InputStream is = MyTest1.class.getClassLoader().getResourceAsStream(resource);
     //构建sqlSession的工厂
     SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
     //创建能执行映射文件中sql的sqlSession
     SqlSession sqlSession = factory.openSession();
     String statement1 = "com.test.my.mapping.userMapper.updateUser";
     User user1 = new User();
     user1.setId(1);
     user1.setName("马超");
     user1.setAge(60);
     int update = sqlSession.update(statement1, user1);
     //如果没有commit,数据库是不会插入数据的
     sqlSession.commit();
     sqlSession.close();
 }
 
   @Test
	 public void testAdd(){
     //mybatis配置文件
     String resource = "conf.xml";
     //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
     InputStream is = MyTest1.class.getClassLoader().getResourceAsStream(resource);
     //构建sqlSession的工厂
     SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
     //创建能执行映射文件中sql的sqlSession
     SqlSession sqlSession = factory.openSession();
     String statement1 = "com.test.my.mapping.userMapper.insertOne";
     User user1 = new User();
     user1.setId(1);
     user1.setName("马超");
     user1.setAge(60);
     sqlSession.insert(statement1, user1);
     sqlSession.commit();
     sqlSession.close();
 }

userMapper.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.test.my.mapping.userMapper">
    <sql id="Base_Column_List">
        id,name,age
    </sql>

    <!--根据id获取-->
    <select id="getUserById" parameterType="int" resultType="com.test.my.domain.User">
    SELECT
     <include refid="Base_Column_List"/>
    FROM users WHERE id=#{id}
    </select>
    <!--新增-->
    <insert id="insertOne" parameterType="com.test.my.domain.User">
        insert into users(`name`,age) values (#{name},#{age})
    </insert>
    <!--删除-->
    <delete id="deleteOne" parameterType="com.test.my.domain.User">
        delete from users where id=#{id}

    </delete>
    <!--更新-->
    <update id="updateUser" parameterType="com.test.my.domain.User">
        update users set name = #{name},age = #{age} where id=#{id}
    </update>
    <!--查询所有-->
    <select id="selectAll" parameterType="com.test.my.domain.User">
        select <include refid="Base_Column_List"/> from users
    </select>
</mapper>

conf.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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>

记录学习

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
这个错误提示说明你正在使用 Spring 事务管理器,并且在使用 `SqlSession` 时没有使用 Spring 提供的 `DataSourceTransactionManager`。 你需要在 Spring 配置文件中配置一个 `DataSourceTransactionManager` bean,并使用它来实例化 `TransactionTemplate`。然后在执行 SQL 操作时,使用 Spring 提供的 `TransactionTemplate.execute()` 方法来执行数据库操作。 在执行数据库操作时,你需要使用 Spring 提供的 `DataSourceUtils.getConnection()` 方法来获取连接,而不是直接使用 `dataSource.getConnection()`。这是因为 Spring 的事务管理器需要控制事务的提交和回滚,如果你直接使用 `dataSource.getConnection()`,那么 Spring 将无法控制事务的提交和回滚。 请注意,如果你想要使用 MyBatis,你也需要将 `SqlSession` 实例化为 Spring Bean,并在 Spring 配置文件中配置。否则,你需要手动关闭 `SqlSession`,否则会导致连接池资源泄漏。 以下是一个示例配置文件: ```xml <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 配置 MyBatis SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="mapperLocations" value="classpath*:com/example/mappers/**/*.xml" /> </bean> <!-- 配置 MyBatis SqlSessionTemplate --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <!-- 配置 Spring 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置 Spring 事务模板 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager" /> </bean> ``` 在使用 `TransactionTemplate` 执行数据库操作时,你可以这样写: ```java return transactionTemplate.execute(status -> { try (SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(true)) { // 执行数据库操作 return sqlSession.selectList("com.example.mappers.MyMapper.selectSomething"); } catch (Exception e) { // 操作失败,回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new RuntimeException(e); } }); ``` 在这个示例中,我们使用了 `SqlSessionTemplate` 来获取 `SqlSession`。这个 `SqlSession` 实例也是一个 Spring Bean,因此 Spring 将负责它的生命周期管理。在使用 `SqlSession` 时,我们使用了 try-with-resources 语句来确保它被正确关闭。如果数据库操作失败,我们通过 `TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()` 将事务标记为回滚状态,以确保事务回滚。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值