文章目录
==几个注意点==mybatis概述使用mybatis:mybatis核心对象resultType类型SqlSession的getMapper方法:mybatis多参数传递${}与#{}、模糊查询date操作mybatis执行流程(源码分析)mybatis几个非常规操作${}在in语句查询时的用法模糊查询sql返回值类型封装为map
几个注意点
框架调错:必须必须看红色的错误信息。最上面或最下面.映射文件:不准出现形参名.命名:不允许出现单个单词给实体类命名,属性名不允许单个单词.在框架中方法的形参,实体的属性,返回值类型不允许写基本类型,写对应的包装类。在数据库设计表,一般必须有createTime,uptTime,version字段。
mybatis概述
是一个orm(Object Relational Mapping)对象关系映射框架。机制:通过xml配置或注解的方式把实体类与数据库表之间做一一映射,为了能够以oop的方式来操作数据库表的记录,自动生成sql语句。目的:提高开发效率。DButils:不是一个orm框架,是一个jdbc的封装组件。执行效率上: JDBC->DButils->mybatis->hibernate.jpa.mybatis-plusmybatis是一套半自动的orm框架,做了orm,但sql语句需要手工写。
使用mybatis:
加核心jar包添加mybatis的核心配置文件(数据源,映射文件)创建数据库表,创建实体类,创建映射文件,添加映射文件到配置文件加载配置文件;执行数据库操作 5.1 打开会话 5.2 执行查询操作。
mybatis核心对象
new SqlSessionFactoryBuilder().build() 加载配置文件,解析映射文件(排错.创建Configuration,创建MappedStatement) 生命周期:加载完成配置文件,该对象可销毁。SqlSessionFactory(接口)->DefaultSqlSessionFactory(实现类) 需要数据源;需要mapper映射文件 openSession() 从连接池中得到一个数据库连接对象。 生命周期:全局唯一. 持有了Configuration对象,该对象中包含数据源,映射信息(MappedStatement集合)SqlSession->DefaultSqlSession 获取MappedStatement对象 selectOne(“namespace.id”,参数) selectList(“namespace.id”,参数) 每次数据库操作都临时打开会话对象,操作完成后关闭 持有了Configuration对象,还持有Executor执行器对象。
resultType类型
实体类String、包装类Map没有List
SqlSession的getMapper方法:
定义dao接口(映射器类接口)通过sqlSession的getMapper方法得到dao接口的代理对象注意点:映射文件中namespace时dao接口的全名;select标签的id是方法名,parameterType,resultType都与方法对照。
mybatis多参数传递
封装实体类对象封装map;任何复杂情况都可以使用@Param注解形参;适合于参数复杂,多个参数属于多个对象 mybatis仍然把@Param注解的参数封装为map,@Param的值是map的key
${}与#{}、模糊查询
#{} mybatis会使用PreparedStatement对象对sql语句预编译,避免sql注入式攻击。
${} 把获取到的参数直接拼接到sql语句中,适合做排序等.
模糊查询:
在mapper映射文件中使用双引号括起来的% select
* from blog where bcontent like
"%"#
{bcontent
}"%"
在调用方法时,传入的参数中带%模糊
date操作
数据库:datetime,timestamp(如果数据库日期字段需要自动更新)实体类:String(建议String),Date(如果实体类中使用Date类型,在用springMVC这些控制层框架时,产生麻烦事)
mybatis执行流程(源码分析)
XMLConfigBuilder:解析配置文件XMLMapperBuilder:解析映射文件XMLStatementBuilder:解析select|insert|delete|updateSqlCommandType:SELECT|INSERT|DELETE|UPDATESqlSource:sql语句,?占位符MappedStatement:把一个select标签的所有内容封装对象。Executor:执行器对象,执行sql语句Configuration配置对象
typeAliasRegistry:默认加载72个内建别名。mappedStatements:默认大小为0variables:解析Properties标签,保存数据
总结:
SqlSessionFactoryBuilder的build方法来加载配置文件,
XmlConfigBuilder解析配置文件中的settings,properties,typeAlias,environments,mappers,把解析的内容保存到Configuration对象XmlMapperBuilder解析mapper.xml文件,创建了MappedStatement对象来封装的select标签,并保存到Configuration对象SqlSessionFactory f = new DefaultSqlSessionFactory(Configuration) openSession:
创建Executor执行器对象,持有ConfigurationSqlSession session = new DefaultSqlSession() selectList(selectOne底层也是调用selectList进行判断):
取Configuration对象中获取到对应的MappedStatement对象。调用Executor对象的query方法,从DateSource中获取Connection,创建PreparedStatement,执行execute方法。进行ResultSet的解析封装。 getMapper:
MapperProxy implements InvocationHandlerreturn Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
mybatis几个非常规操作
${}在in语句查询时的用法
<select id
="selectMenuByPower" resultType
="adminmenu">
SELECT sp
.pid
,sp
.pname
,sp
.fid
,sp
.isshow
,sp
.url
,sp
.glyphicon FROM system_power sp WHERE sp
.isshow
=1 AND sp
.pid IN
($
{menuId
})
</select
>
List
<AdminMenu> selectMenuByPower(@Param("menuId") String menuId
);
@Test
public void selectMenuByPower(){
SqlSession sqlSession
= sqlSessionFactory
.openSession();
LoginMapper mapper
= sqlSession
.getMapper(LoginMapper
.class);
List
<AdminMenu> adminMenuList
= mapper
.selectMenuByPower("1,2,3");
System
.out
.println(adminMenuList
);
sqlSession
.close();
}
¥{}解析传过来的参数值不带单引号,#{}解析传过来参数带单引号。此处用in关键字查询,参数不应该带引号,所以使用${}进行占位。
原因分析:源码分析 There is no getter for property named ‘*’ in 'class java.lang.String 正如开始说的,映射文件不允许出现形参名
模糊查询sql
<select id
="selectAdminLikeAname" resultType
="adminuser" parameterType
="string">
SELECT sa
.aid
,sa
.aname
,sa
.apwd
,sa
.aimg
,sa
.role_id
,sa
.reg_time
,sa
.login_time
,sa
.isvalid
,sa
.menu_id
,sa
.remark FROM system_admin sa WHERE sa
.isvalid
=1 AND sa
.aname like
"%"#
{aname
}"%"
</select
>
返回值类型封装为map
<select id
="selectAdminByAid" resultType
="map">
SELECT sa
.aid
,sa
.aname
,sa
.apwd
,sa
.aimg
,sa
.role_id
,sa
.reg_time
,sa
.login_time
,sa
.isvalid
,sa
.menu_id
,sa
.remark FROM system_admin sa WHERE sa
.isvalid
=1 AND sa
.aid
= #
{aid
}
</select
>
Map
<String,Object> selectAdminByAid(Integer aid
);