mybatis--1

    科技2025-04-02  19

    文章目录

    ==几个注意点==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语句查询时的用法

    // 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);
    Processed: 0.009, SQL: 8