对于框架和工具的学习,以使用为主,理解原理为辅助。
掌握了我们讲的基础上再去网络上拓展下眼界。
GY-mybatis
持久层框架(ORM对象关系映射框架),对jdbc技术的封装,简化开发代码
持久层技术:jdbc、DButils、mybatis、hibernate、jpa、mybatisplus
orm:对象与对象之间的关系映射,持有关系,聚合关系。 《uml模型设计》
1. mybatis能干什么
是一个持久层框架(ORM对象关系映射框架),是对jdbc技术的封装,简化的开发代码,提高开发效率
持久层技术:jdbc,DBUtils,mybatis,hibernate,jpa,mybatisplus
orm:对象与对象之间的关系映射,持有关系,聚合关系,《uml模型设计》
2. 快速使用mybatis
1.安装mybatis
两个jar包,一个mybatis的核心包,一个mysql数据库驱动包
2.创建mybatis的核心配置文件
在src下创建mybatis-config.xml配置文件
3.创建实体类与xml映射文件
切记把创建的xml映射文件加入到配置文件当中
4.调用mybatis的api来加载xml配置文件
5.执行数据操作
3. 认识下mybatis的核心对象(重要)
1.SqlSessionFactoryBuilder:该对象作用是用来加载并解析xml配置文件,解析配置文件中的各种标签
(properties,settings,typeAliases,environments,mappers),解析完成该对象可销毁。
2.SqlSessionFactory:sql会话工厂对象。该对象只有一个openSession方法,理解成DataSource连接池。
生命周期:全局唯一对象。除非有多个数据库环境
3.sqlSession:sql会话对象,理解成一个Connection连接,做数据库操作,执行完成后关闭会话对象。
生命周期:随用随开,用完即关。
该对象中的几个重要方法:selectOne,selectList,insert,delect,update,update,getMapper
4. 认识mybatis的核心配置文件(不重要)
mybatis-config.xml
<configuration>
<!--数据库环境-->
<environments default="dev">
<!--id是自定义的数据库名称-->
<environment id="dev">
<!--事务管理器
JDBC:开启事务
MANAGED:不开事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--type
UNPOOLED
/POOLED:自动初始化一个连接池
/JNDI:已弃用
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/stage3"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--把映射文件集成到配置文件中,为了在调用build方法时,能够解析映射文件-->
<mappers>
<mapper resource="com/javasm/sys/mapper/sysuserMapper.xml"></mapper>
</mappers>
</configuration>
-
常用标签
加载<properties>文件:<properties> 配置: <settings> <setting name="" value=""> </settings> 一些常用设置: <settings> <!--开启日志--> <setting name="logImpl" value="STDOUT_LOGGING"/> <!--自动驼峰命名转换--> <setting name="mapUnderscoreToCamelCase" value="true"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"></setting> </settings> 别名:要求绝对不能出现同名的类,mybatis(类名首字母小写) <typeAlias> <package name=""> </typeAlias> 例:一些常用设置 <typeAliases> <package name="com.javasm"></package> </typeAliases>
5. 认识mybatis的映射文件(最重要)
1.根标签mapper的namespace属性:
不同的映射文件通过namespace来区别,不能同名.
2.查询语句select标签,id,parameterType,resultType属性:
id:在同一个映射文件中,id必须唯一;
parameterType:可省略,一般都写上,表示在调用selectOne或selectList或insert,delete,update方法时传入的参数类型.
resultType:数据库查询结果的单行记录封装的类型.(一般是实体类或Map,简单类型)
3.sql语句中的#{}与${}表达式获取参数
两者作用是一致的,都是用来获取参数的,
#{} 底层采用sql语句预编译,PrepareStatement
${} 底层采用Statement对象来执行sql操作,适合于用在动态排序.
6. 认识SqlSession对象中常用方法
selectOne("",Object)
selectList("namespace.id",Object)
insert
delete
update
getMapper(Class clz)重要
7. 多参数传递
1.把多个参数封装实体类
2.把多个参数封装到map
3.在映射接口的方法的每个形参上加@Param注解指定名称.#{param注解的名称}
8. 模糊查询
<select id="selectRolesByRoleName" parameterType="String" resultType="Sysrole">
select * from sysrole where rname like "%"#{rname}"%" order by update_time desc
</select>
9. 使用mybatis过程中常见的异常信息
1.实体类没有对应的get方法,错误原因:#{写错}
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'rid22' in 'class com.javasm.sys.entity.Sysrole'
2.映射文件中id重名
Error parsing Mapper XML. The XML location is 'com\javasm\sys\mapper\sysroleMapper2.xml'. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.javasm.sys.mapper.SysroleMapper.selectRolesOrder
3.调用的方法,在映射文件中是不存在的(接口中有方法,映射文件中没有)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.javasm.sys.mapper.SysroleMapper.selectRolesByRoleName2
其他注意点:
date:年月日
datatime:年月日时分秒
timestamp:时间戳字段,能够根据时间戳自动更新值。带毫秒类型字段,类型字段,一般在createTime与uodateTime字段上,能够根据时间戳自动更新。指定默认值 now() CURRENT_TIMESTAMP
切记select列表查询order by update_data desc
以后主键不再使用自增id,为了后续的数据库分库分表,id设计为varchar型,添加数据的时候手工指定id,UUID
数据库字段名不允许a_colmn的名称,实体类的属性名不允许aColumn,不允许is开头
总结
1.配置文件
settings标签中的配置,配置日志,配置驼峰命名映射
typeAlias配置别名
2.代码:
SqlSessionFactoryBuilder:
作用:加载配置文件初始化连接池,解析映射文件到内存
生命周期:new SqlSessionFactoryBuilder().build()完成该对象可销毁
SqlSessionFactroy:
作用:持有了第一步创建出来的连接池与映射文件信息
生命周期:全局唯一.单例
SqlSession:
作用:执行数据库操作,主要方法:selectOne.selectList,getMapper
生命周期:随用随开,用完关闭
3.映射文件(最重要)
根标签mapper的namespace属性值,必须是接口的全名称(包名.类名)
select子标签,属性:id,resultType,parameterType
获取动态参数表达式:#{}