mybatis_1

几个注意点

  • 框架调错:必须必须看红色的错误信息。最上面或最下面.
  • 映射文件:不准出现形参名.
  • 命名:不允许出现单个单词给实体类命名,属性名不允许单个单词.
  • 在框架中方法的形参,实体的属性,返回值类型不允许写基本类型,写对应的包装类。
  • 在数据库设计表,一般必须有createTime,uptTime,version字段。

mybatis概述

  • 是一个orm(Object Relational Mapping)对象关系映射框架。
  • 机制:通过xml配置或注解的方式把实体类与数据库表之间做一一映射,为了能够以oop的方式来操作数据库表的记录,自动生成sql语句。
  • 目的:提高开发效率。
  • DButils:不是一个orm框架,是一个jdbc的封装组件。
  • 执行效率上: JDBC->DButils->mybatis->hibernate.jpa.mybatis-plus
  • mybatis是一套半自动的orm框架,做了orm,但sql语句需要手工写。

使用mybatis:

  1. 加核心jar包
  2. 添加mybatis的核心配置文件(数据源,映射文件)
  3. 创建数据库表,创建实体类,创建映射文件,添加映射文件到配置文件
  4. 加载配置文件;
  5. 执行数据库操作
    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|update
  • SqlCommandType:SELECT|INSERT|DELETE|UPDATE
  • SqlSource:sql语句,?占位符
  • MappedStatement:把一个select标签的所有内容封装对象。
  • Executor:执行器对象,执行sql语句
  • Configuration配置对象
    • typeAliasRegistry:默认加载72个内建别名。
    • mappedStatements:默认大小为0
    • variables:解析Properties标签,保存数据

总结:

  • SqlSessionFactoryBuilder的build方法来加载配置文件,
    • XmlConfigBuilder解析配置文件中的settings,properties,typeAlias,environments,mappers,把解析的内容保存到Configuration对象
    • XmlMapperBuilder解析mapper.xml文件,创建了MappedStatement对象来封装的select标签,并保存到Configuration对象
    • SqlSessionFactory f = new DefaultSqlSessionFactory(Configuration)
  • openSession:
    • 创建Executor执行器对象,持有Configuration
    • SqlSession session = new DefaultSqlSession()
  • selectList(selectOne底层也是调用selectList进行判断):
    • 取Configuration对象中获取到对应的MappedStatement对象。
    • 调用Executor对象的query方法,从DateSource中获取Connection,创建PreparedStatement,执行execute方法。
    • 进行ResultSet的解析封装。
  • getMapper:
    • MapperProxy implements InvocationHandler
    • return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);

mybatis几个非常规操作

${}在in语句查询时的用法

// mapper.xml 的语句
<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>

// dao接口的方法定义
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

// 返回值类型写为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>

// dao接口
Map<String,Object> selectAdminByAid(Integer aid);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值