mybatis
1.mybatis有什么用
mybatis是一个orm持久层框架,对jdbc进行轻量级封装,对比hibernate与jpa纯oop的重量级持久层框架,半自动化持久层框架(oop+sql).
开发效率:jpa,hibernate开发效率高;
执行效率:jdbc最高-->mybatis-->jpa
持久层框架叫:orm框架,对象关系映射框架.dao层框架.
orm:实体类与数据库表的一一映射关系通过xml和注解方式进行配置.
2.入门
-
添加mybatis依赖包;mysql驱动包
-
添加mybatis配置文件
-
创建数据库表;创对应的实体类
-
创建mybatis映射文件,并把映射文件配置到mybatis配置文件中
-
测试使用
3.mybatis的核心api(重要)
-
SqlSessionFactoryBuilder:会话工厂构建器对象.加载xml配置文件并解析,一个个标签进行解析,把标签数据统统解析到Configuratin对象中,该对象持有DataSource,持有别名映射关系,持有mybatis内置的27个类型处理器.持有映射文件中的MappedStatement对象的集合.
生命周期:用完即销毁.
方法:build
-
SqlSessionFactory:DefaultSqlSessionFactory,该对象持有Configuration对象.
生命周期:全局唯一的对象.
方法:openSession
-
SqlSession:会话对象,DefaultSqlSession.也持有Configuration对象.Sql执行器对象Executor
生命周期:需要操作数据库时,创建会话对象,操作完成后,关闭会话对象.
方法:selectOne,selectList,insert,update,delete,
getMapper方法最重要.
4.mybatis的配置详解(不重要,了解)
<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://127.0.0.1/ssmdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com\javasm\sys\dao\sysuser-mapper.xml"></mapper>
</mappers>
</configuration>
-
properteis标签:用来加载外部的properteis资源文件
-
-
settings标签:用来修改mybatis的默认运行行为.比如:logImpl,mapUnderscoreToCamelCase
-
-
typeAlias别名标签:指定包,对该包下的所有类起别名,忽略大小写.通过对常用的jdk内的类有默认别名.
-
String-string
-
Integer-int
-
HashMap-map
-
-
-
environments标签:数据库环境标签
-
-
mappers标签:引入映射文件.
-
5.mybatis的映射文件详解(最重要)
-
select:<select id="" parameterType="" resultType="">
-
insert:<insert id="" parameterType="" useGenerateKeys="true" keyProperty="实体的属性名">
-
delete
-
update
parameterType支持:简单类型(String,date,int,double).实体,map
resultType支持:简单类型,实体,map.
sql语句中动态参数表达式#{}.括号中写什么?
parameterType是简单类型,则#{随便}
parameterType是实体,则#{属性名}
parameterType是map,则#{key}
6.mybatis的模糊查询
在sql语句中使用双引号或者mysql拼接函数在#{}左右拼接%.
select * from sysuser where uphone like "%"#{uphone}"%"
7.getMapper方法
-
创建dao接口
-
映射文件的namespace写成dao接口的全名称(包名.类名)
-
映射文件中的curd标签的id名,写成dao接口的方法名
-
通过sqlsession会话对象的getMapper方法得到指定接口的代理对象进行数据库操作.
SysroleDao rd = s.getMapper(SysroleDao.class);
Sysrole sysrole = rd.selectById(1);
8.mybatis多参数传递(重要)
mybatis底层把多个参数都是封装成了map单个参数.
-
封装实体对象
-
封装map对象
-
dao接口形参写多个参数,形参使用@Param注解.
public List<Sysrole> selectArgs(@Param("rname") String rname,@Param("rid") Integer rid);
9.mybatis常见异常
Type interface com.javasm.sys.dao.SysroleDao is not known to the MapperRegistry.(接口对应的映射文件没有添加的配置文件中或者是映射文件中的namespace写错了)
Invalid bound statement (not found): com.javasm.sys.dao.SysroleDao.selectById(接口中有方法,映射文件中没有对应的id)
ReflectionException:There is no getter for property named 'rname2' in 'class com.javasm.sys.entity.Sysrole'(未生成set,get;#{变量名写错})
PersistenceException:### The error may exist in *.xml.(id重复,或者文件结构错误)
配置文件或映射文件中有错
10.#{}与${}的区别
#{}:mybatis解析成了?占位符.安全.
${}:mybatis进行sql拼接,绝对不会应用在条件查询.应用在表格的动态排序上
select * from sysuser order by ${field} ${sort}
注意点:
数据库的日期类型:date,dateTime,timestamp
实体类的变量类型:Date,LocalDatetime,String