懒人免费建站模板,上海建设工程造价信息网官网,怎么做快法务类似网站,绍兴cms建站模板Mybatis的事务管理机制
在mybatis-config.xml文件中.可以进行mybatis的事务管理
transactionManager typeJDBC/
type的值有两个
JDBCMANAGED
JDBC事务管理器
mybatis框架自己管理事务#xff0c;自己采用原生的JDBC代码去管理事务
底层创建的事务管…Mybatis的事务管理机制
在mybatis-config.xml文件中.可以进行mybatis的事务管理
transactionManager typeJDBC/
type的值有两个
JDBCMANAGED
JDBC事务管理器
mybatis框架自己管理事务自己采用原生的JDBC代码去管理事务
底层创建的事务管理器对象是JdbcTransaction对象
conn.setAutoCommit(false);开启事务
进行业务处理
conn.commit()手动提交事务
SqlSession sqlSession sqlSessionFactory.openSession();//如果使用事务管理器是JDBC的话实际上会执行:conn.setAutoCommit(false)
sqlSession.commit();//如果使用的事务管理器是JDBC的话实际上会执行:conn.commit()
不建议传入参数true
SqlSession sqlSession sqlSessionFactory.openSession(true);
如果传入了参数true那么底层就不会执行conn.setAutoCommit(false)那么autoCommit就是true
如果autoCommit是true就表示没有开启事务只要执行一条sql语句就提交一次
MANAGED事务管理器
mybatis不再负责事务的管理事务管理交给其他容器来负责
当以后ssm框架进行集成的时候可以用MANAGED
但只有mybatis的框架时如果配置managed那么这块事务是没人管的表示事务没开启 Junit单元测试
先引入单元测试的依赖
然后在test包下创建类起名规范就是要测试的类加Test
测试方法要加注解Test说明这个方法是测试方法
单元测试中有两个重要的概念
实际值被测试的业务方法的真正的执行结果期望值执行了这个业务之后你期望的执行结果是多少
最后加断言进行测试
Assert.assertEquals(expected,actual)
Mybatis的日志信息
Mybatis配置日志信息需要在核心配置文件中进行配置
Mybatis已经对STDOUT_LOGGING进行了实现只需要开启即可
但STDOUT_LOGGING的日志信息不够丰富如果想用丰富的要引入第三方组件
settings
setting namelogImpl valueSTDOUT_LOGGING/
/settings
集成logback日志框架
引入logback的依赖引入logback所必须的xml配置文件
这个配置文件的名字必须叫做logback.xml或者logback-text.xml不能是其他的
这个配置文件必须放到根路径下不能是其他位置
?xml version1.0 encodingUTF-8 ?configuration debugfalseappender nameSTDOUT classch.qos.logback.core.ConsoleAppenderencoder classch.qos.logback.classic.encoder.PatternLayoutEncoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern/encoder/appenderlogger namecom.apache.ibaits levelTRACE/loggerlogger namejava.sql.Connection levelDEBUG/loggerlogger namejava.sql.Statement levelDEBUG/loggerlogger namejava.sql.PreparedStatement levelDEBUG/loggerroot levelDEBUGappend-ref refSTDOUT/append-refappend-ref refFILE/append-ref/root/configuration如果使用的是标准的日志需要配置settings如果使用的第三方组件就不用配置了
Mybatis封装工具类
//一个sqlSessionFactory对应一个environment一般一个environment对应一个数据库
//所以调用openSession的时候不用每次都创建sqlSessionFactory对象
//写在类加载器中即可public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {sqlSessionFactory new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(mybatis-config.xml));} catch (IOException e) {throw new RuntimeException(e);}}private MybatisUtil() {}public static SqlSession openSession() {return sqlSessionFactory.openSession();}
}Mybatis的CRUD
C:Create(增)R:Retrieve(查)U:update(改)D:delete(删)
在mybatis当中的占位符是#{}
Map集合传值
#{}传入的值是map的键
MapString,Object map new HashMap();map.put(k1,1111);map.put(k2,比亚迪汉);map.put(k3,10.0);map.put(k4,2020-12-11);map.put(k5,电车);//第一个参数是sql语句的id//第二个参数是封装数据的对象sqlSession.insert(insertCar,map);insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values (null,#{k1},#{k2},#{k3},#{k4},#{k5})
POJO类传值
#{}传入的值是POJO类的属性值
SqlSession sqlSession SqlSessionUtils.openSession();Car car new Car(null, 1112, 凯的拉克CT6, 55.0, 2023-12-10, 电车);sqlSession.insert(insertCar,car);sqlSession.commit();sqlSession.close();insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})严格意义上来说如果使用POJO类传值的话#{}中实际上是mybatis调用get方法去掉get再把剩下的单词首字母小写
#{name}-#{getName}
mybatis的删除
delete iddeleteCardelete from t_car where id#{id}/deletesqlSession.delete(deleteCar,15);
Mybatis的更新
public void testUpdateCarById(){SqlSession sqlSession SqlSessionUtils.openSession();Car car new Car(5L,9999,凯美瑞,30.0,2023-12-10,燃油车);sqlSession.update(updateCar,car);sqlSession.commit();sqlSession.close();}update idupdateCarupdate t_car setcar_num#{carNum},brand#{brand},guide_price#{guidePrice},produce_time#{produceTime},car_type#{carType}whereid#{id}/update
Mybatis的查询
mybatis中查询的时候mybatis底层执行了select语句之后就一定会返回一个结果集ResultSet
需要在select标签中指定resultType来确定ResultSet封装成什么类型的Java对象 Testpublic void testSelectCarById(){SqlSession sqlSession SqlSessionUtils.openSession();Object o sqlSession.selectOne(selectCar, 1);System.out.println(o);sqlSession.close();}
}select idselectCar resultTypePOJO.Carselect *from t_carwhere id#{id}/select
查询时如果结果中的列名和封装对象中的属性名不对应那么就赋不上值
select idselectCar resultTypePOJO.Car
select id,brand,car_num as carNum,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from t_car
where id#{id}
/select
Mybatis查询所有
//resultType是封装的结果集类型不是指定List的类型是指定List集合中的元素类型
select idselectAll resultTypePOJO.Car
select
id,car_num as carNum, brand ,guide_price as guidePrice, produce_time as produceTime,car_type as carType
from t_car
/selectTestpublic void testSelectAll(){SqlSession sqlSession SqlSessionUtils.openSession();ListObject Cars sqlSession.selectList(selectAll);Cars.forEach(car- System.out.println(car));sqlSession.close();}
Mybatis中的namespace
在sqlMapper.xml文件当中有namespace这个属性是用来指定命名空间的用来防止id重复
本质上mybatis的sql语句的写法是namespace.id为了防止id重复
Mybatis的核心配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatistest/property nameusername valueroot/property namepassword valueabc123//dataSource/environment/environmentsmappersmapper resourceCarMapping.xml//mappers
/configuration
environments是指mybatis的环境mybatis中可以有多个环境一个环境对应一个数据库
一个数据库对应一个SqlSessionFactory对象
default指的是默认使用的环境指定environment的id
当创建SqlSessionFactory的时候没有指定使用哪个环境就是用默认的环境
Mybatis的事务管理器
transactionManager是事务管理器指定mybatis具体用什么方式去管理事务
第一个JDBC使用原生的jdbc代码来管理事务第二个MANAGEDmybatis不再负责事务管理将事务管理交给其他的容器来管理
在Mybatis中提供了事务管理器接口Transaction
接口下有两个实现类JdbcTransactionManagedTransaction
如果typeJdbcTransaction 那么底层会实例化JdbcTransaction对象
如果typeManagedTransaction 那么底层会实例化ManagedTransaction对象
Mybatis的数据源
dataSource被称为数据源
dataSource为程序提供Connection对象但凡是给程序员提供Connection对象的都叫数据源
数据源实际上是一套规范JDK中有这套规范javax.sql.DataSource(这个数据源的规范这套接口实际上是JDK规范的)
我们自己也可以编写数据源组件只要实现javax.sql.DataSource接口就行了实现接口中的所有方法这样就有了自己的数据源
数据库连接池是提供连接对象的所以数据库连接池就是一个数据源组件
type属性是用来指定数据源的类型就是指定具体使用什么方法来获取Connection对象
type的属性值有三个
UNPOOLED不使用数据库连接池技术每一次请求过来之后都是创建新的Connection对象POOLED使用mybatis自己实现的数据库连接池JNDI集成其他第三方的数据库连接池
JNDI是一套规范大部分web容器都实现了JNDI规范
Mybatis的properties标签
java.util.Properties类是一个Map集合key和value都是String类
properties是为了让核心文件的配置更灵活
propety name属性名 value属性值 /
properties resource配置文件名 /