事务是操作数据库的最小单元,应该保证一个事物中的sql语句要么同时成功,要么同时不成功
MyBatis 中配置了事务管理器,type 属性设置为JDBC.表示MyBatis采用和原生JDBC相同的事务管理机制
一般mybatis 会关闭自动提交,所以在执行DML操作时需要手动提交
这里就涉及到事务管理(ACID)
谈到事务一般都是以下四点
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
提取一个工具类
package com.lin.util; 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 java.io.IOException; public class MyBatisUtil { private static SqlSessionFactory factory = null; static { try { //工厂一个就够了,所以用静态代码块,运行一次就够了 factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession(){ SqlSession session =null; if (factory!=null){//这里openSession默认是false是关闭事务,改为true可开启自动提交 session = factory.openSession(); } return session; } }
新增INSERT
mapper:
<?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"> <!-- namespace: 命名空间, 可以随意定义, 一般情况下要写全限定路径 MyBatis管理SQL语句是通过namespace+id来定位的 --> <mapper namespace="com.lin.mapper.UserMapper"> <!--新增操作 没有返回类型默认返回数字--> <insert id="insUser" parameterType="User"> insert into tb_user values(default,#{username},#{password}) </insert> </mapper>
test类:
package com.lin.test; import com.lin.pojo.User; import com.lin.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class TestMyBatisDML { @Test public void insUser(){ SqlSession session = MyBatisUtil.getSession(); User user = new User(); user.setUsername("小强"); user.setPassword("123"); int flag = session.insert("com.lin.mapper.UserMapper.insUser", user); if (flag>0){ //成功提交事务 session.commit(); System.out.println("SUCCESS"); }else { //失败事务回滚 session.rollback(); System.out.println("FAILED"); } //关闭资源 session.close(); } }
更新
<?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"> <!-- namespace: 命名空间, 可以随意定义, 一般情况下要写全限定路径 MyBatis管理SQL语句是通过namespace+id来定位的 --> <mapper namespace="com.lin.mapper.UserMapper"> <!--更新--> <update id="updUser" parameterType="User"> update tb_user set username=#{username} ,password=#{password} where id= #{id} </update> </mapper>
package com.lin.test; import com.lin.pojo.User; import com.lin.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class TestMyBatisDML { @Test //更新 public void updUser(){ SqlSession session = MyBatisUtil.getSession(); User user = new User(); user.setUsername("小小"); user.setPassword("123"); user.setId(1); int flag = session.update("com.lin.mapper.UserMapper.updUser", user); if (flag>0){ session.commit(); System.out.println("更新成功"); }else { session.rollback(); System.out.println("更新失败"); } session.close(); } }
删除
<?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"> <!-- namespace: 命名空间, 可以随意定义, 一般情况下要写全限定路径 MyBatis管理SQL语句是通过namespace+id来定位的 --> <mapper namespace="com.lin.mapper.UserMapper"> <!--删除--> <delete id="delUser" parameterType="User"> delete from tb_user where id=#{0} </delete> </mapper>
package com.lin.test; import com.lin.pojo.User; import com.lin.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class TestMyBatisDML { @Test //删除 public void delUser(){ SqlSession session = MyBatisUtil.getSession(); int flag = session.delete("com.lin.mapper.UserMapper.delUser", 5); if (flag>0){ session.commit(); System.out.println("删除成功"); }else { session.rollback(); System.out.println("删除失败"); } session.commit(); } }
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
这是一组标签,功能类似于switch...case..用这个标签就要注意了,因为where永远后面只有一个子句,也就是只有一个查询条件mybatis.org//DTDMapper3.0//EN""http://mybatis.o
mybatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。mybatis3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的。要开启二级缓存,你需要在你的SQL映射文件中添加一行:cache;mybatis的一级缓存是session缓存作用到SqlSession对象,二级缓
include这个标签一般是用来实现sql语句复用的比如select*fromtb_user这个*包含了id,username,password*虽然方便了我们,但实际上麻烦都交给了程序,所以面对多次复用的语句可以配合sql标签提取处理来,具体处理为运行sql语句查看
forearch另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的.正常的sql语句中使用in的例子select*fromtb_userwhereidin(1,2,3,4)在mysql中,就将后面的查询的条件(1,2,3,4)封装成一个集合传入,并且用forearch处理接口代码packagecom.lin.mapper;importcom.lin.pojo.User;imp
Trimprefix:前缀,表示向前面添加内容prefixOverrides:从前面删除内容suffix:后缀,表示向后面添加内容suffixOverrides:从后面删除内容先对灵活,实际开发中用于解决where和set做不到的操作的时候使用Bind常用在模糊查询上两个标签name:要用于模糊查询的关键字value:写法"'%'+用于模糊查询的关键字+'%'"使用后后面的查询条件不再使用等号,而
set子句.有如下功能:a)如果有条件满足,会添加set关键字并执行sql语句b)如果第一个条件中有逗号,但后续的条件没有满足的,会自动去尾部逗号。c)如果修改条件都不满足就不生产set语句,出现错误,可以使用在set中添加id=#{id}来避免错误updatetb_userselect*fromtb_userwhereusername=#{use
扫一扫关注公众号
添加我为好友,拉您入交流群!
请使用微信扫一扫!