摘要:Mybatis笔记
前言:对这段时间学习mybatis的一些记录。
介绍
Mybatis的编程步骤
- 获取全局配置文件路径
1 | String resource = "conf/mybatis-config.xml"; |
- 读取配置文件
1 | InputStream inputStream = Resources.getResourceAsStream(resource); |
- 创建SqlSessionFactoryBuilder,通过SqlsesionFactoryBuilder创建sqlSessionFactory
1 | SqlSessionFactory sqlSessionFactory = |
- 通过SqlSessionFactory创建sqlSession
1 | SqlSession sqlSession = sqlSessionFactory.openSession(); |
- 通过sqlSession执行数据库操作
1 |
|
- 调用session.commit()提交事务
1 | sqlSession.commit(); |
- 调用session.close()关闭会话
1 | sqlSession.close(); |
注意:
- SqlSession代表和数据库的一次会话,用完必须关闭。
- SqlSession和connection一样都是非线程安全的。每次使用都应该去获取新的对象,不要放在成员变量中。
- mapper接口没有实现类,但是将接口和xml进行绑定后,mybatis会为这个接口生成一个代理对象。
- 两个重要的配置文件:
- mybatis的全局配置文件(mybatis-config.xml):包含数据库连接池信息,事务管理器等,系统运行环境信息。
- sql映射文件(***Mapper.xml):保存了每个sql语句的映射信息。将sql抽取出来。
全局配置文件常用标签(mybatis-config.xml)
configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
properties标签
mybatis可以使用properties来引用外部的properties配置文件的内容:
- resource:引入类路径下的资源。
- url:引入网络路径或者磁盘路径下的资源。
1 | <properties resource="application.properties"></properties> |
setting标签
setting包含很多重要的设置项:
- setting:用来设置每一个设置项
- name:设置项名
- value:设置项取值
1 | <settings> |
typeAliases标签
typeAliases:别名处理器,可以为我们的java类型起别名,别名不区分大小写
- typeAlias:为某个java类型起别名
- type:指定要起别名的类型全类名,默认别名就是类名小写。
- alias:指定新的别名。
1 |
|
- package:为某个包下的所有类批量起别名
- name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写))
- 批量起别名的情况下,使用@Alias注解为某个类型指定新的别名。
1 |
|
environments标签
environments:mybatis可以配置多种环境,default指定使用某种环境,可以达到快速切换环境。
- environment:配置一个具体的环境
- 必须有transactionManager和dataSource标签。
- transactionManager:事务管理器
- type:事务管理器类型:JDBC(JdbcTransactionFactory.class)或 MANAGED(ManagedTransactionFactory.class)
- 自定义事务管理器:实现TransactionFactory接口,type指定为全类名
- dataSource:数据源
- type:数据源类型:
- UNPOOLED(不使用连接池 UnpooledDataSourceFactory.class)
- POOLED(使用连接池PooledDataSourceFactory.class)
- JNDI(JndiDataSourceFactory.class)
- 自定义数据源:实现DataSourceFactory接口,type是全类名
- type:数据源类型:
1 |
|
databaseIdProvider标签
databaseIdProvider支持多数据库厂商的,type=”DB_VENDOR”(VendorDatabaseIdProvider),作用就是得到数据库厂商的标识(getDatabassProductName()),mybatis就能根据数据库厂商标识来执行不同的sql,例如:MsySQL、Oracle、SQL Server、***等标识。
1 |
|
mappers标签
将我们写好的sql映射文件一定要注册到全局配置文件中。
- sql映射文件:****Mapper.xml
- 全局配置文件:mybatis-config.xml
mappers:将sql映射注册到全局配置中。
- mapper:注册一个sql映射。
- resource:引用类路径下的sql映射文件。
- url:引用网络路径或者磁盘路径下的sql映射文件。
- 注册接口:class:引用(注册)接口:
- 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下。
- 没有sql映射文件,所有的sql都是利用注解写在接口上。
- 推荐:
- 比较重要的、复杂的Dao接口,我们来写sql映射文件。
- 不重要的、简单的Dao接口为了开发快速可以使用注解。
- 批量注册:package
1 |
|
properties文件
1 | jdbc.driver = com.mysql.cj.jdbc.Driver |
xxxMapper.xml文件
namespace:名称空间;指定为接口的全类名
id:唯一标识(接口方法名)
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
1 |
|
主键自增问题
parameterType:参数类型,可以省略。
获取自增主键的值:
mysql支持自增主键,自增主键值的获取,mybatis也是用statement.getGenreatedKeys()。
- useGeneratedKeys=”true”:使用自增主键获取主键值策略。
- keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性。
1 |
|
获取非自增主键的值:
Oracle不支持自增,Oracle使用序列来模拟自增。每次插入的数据的主键是从序列中拿到的值,如何获取到这个值?
keyProperty:查出的主键值封装给javaBean的哪个属性。order=”xxxxxx”(BEFORE | AFTER)
- BEFORE:当前sql在插入sql之前运行。
- AFTER:当前sql在插入sql之后运行。
resultType:查出的数据的返回值类型。
BEFORE运行顺序:
- 先运行selectKey查询id的sql;查出id值封装给javaBean的id属性。 - 再运行插入的sql;就可以取出id属性对应的值。AFTER运行顺序:
- 先运行插入的sql(从序列中取出新值作为id)。 - 再运行selectKey查询id的sql。
1 |
|
mybatis参数处理问题
单个参数:mabatis不会做特殊处理
- #{参数名}:取出参数值
多个参数:mybatis会做特殊处理:
多个参数会被封装成一个map
- key:param1…..paramN,或者参数的索引也可以
- value:传入的参数值
#{}就是从map中获取指定的key的值
3.4.3以前的版本:
- 操作:
- 方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
- 取值:#{id},#{lastName}
- 异常:org.apache.ibatis.binding.BindingException:Parameter ‘id’ not found.Available parameters are [1, 0, param1, param2]。
- 解决:命名参数:
- 明确指定封装参数时map的key,@Param(“id”),多个参数会被封装成一个map:
- key:使用@Param注解指定的值
- value:参数值
- #{指定的key}取出对应的参数值
- POJO:如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo:
- #{属性名}:取出传入的pojo的属性值
- Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map:
- #{key}:取出对应的值。
- TO(Transfer Object)数据传输对象:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象。
- 明确指定封装参数时map的key,@Param(“id”),多个参数会被封装成一个map:
- 操作:
3.4.3及以后的版本:
操作:
- 方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
- 取值:#{id},#{lastName}
结果:可以正常运行,无任何异常,推荐使用。
1 |
|
- 本文作者: th3ee9ine
- 本文链接: https://www.blog.ajie39.top/2021/05/05/Mybatis笔记/
- 版权声明: 本博客所有文章除特别声明外,均采用 LICENSE 下的许可协议。转载请注明出处!