day61_mybatis

别再只记>和<了!MyBatis XML中所有需要转义的特殊字符清单与避坑指南 本文详细解析了MyBatis XML中特殊字符的转义原理与实战技巧,涵盖五大核心字符的转义规则、CDATA区块的最佳实践以及JSON查询的特殊处理。通过具体案例和调试技巧,帮助开发者避免常见错误,提升SQLMyBatis映射文件中的正确性和可读性。 阅读详情

Mybatis 第一天课堂笔记

Mybatis课程安排:

第一天:
Jdbc编程中的问题?
Mybatis的框架原理(重点)
Mybatis的第一个程序:
    实现用户信息的增、删、改、查。
Mybatis如何解决jdbc编程的问题。
与hibernate不同。

mybatis开发dao两种方法:(重点)
原始的dao开发方法(接口和接口实现)
    Mapper动态代码方法

Mybatis的配置文件:
    SqlMapConfig.xml(全局配置文件)
    XXXXXMapper.xml(映射文件,重点)

Mybatis动态Sql(重点)

resultType(重点掌握)和resultMap区别。


第二天:

Mybatis关联查询:
    一对一查询
    一对多
    多对多

Mybatis的缓存
    一级缓存
    二级缓存
延迟加载

Mybatis和springmvc整合(重点)
原始的dao开发方法(接口和接口实现)
    Mapper动态代码方法


Mybatis逆向工程(由数据库表生成类文件和映射文件)

1 Jdbc编程中的问题

1.1写一个程序
目标:
1、通过jdbc程序找出当中的问题
2、重视jdbc编程,企业在技术选型时对于小型的项目或性能要求较高的项目,优先选用jdbc开发。

准备开发环境:
Jdk1.7.72
Eclipse indigo(3.7)
Mysql5.1

运行环境:
Mysql5.1数据库驱动
这里写图片描述

创建mysql数据库:
这里写图片描述

代码如下:



public class JdbcTest {

    //定义sql语句,根据名称查询用户表的记录
    private static String sql = "SELECT * FROM USER WHERE username =  ?";

    public static void main(String[] args) throws SQLException {

        //数据库连接
        Connection connection = null;
        //预编译statement
        //好处:防止 sql注入,提高数据的性能
        PreparedStatement preparedStatement = null;
        //结果集
        ResultSet resultSet = null;

        try {

            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //连接数据库
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "mysql");

            //构造preparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //向preparedStatement中占位符的位置设置参数
            preparedStatement.setString(1, "张三");

            //发起数据库查询请求,得到结果集
            resultSet = preparedStatement.executeQuery();
            //遍历查询结果

            while(resultSet.next()){
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                Date birthday = resultSet.getDate("birthday");
                System.out.println(id+"   "+username+"  "+birthday);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if(resultSet!=null){
                resultSet.close();
            }
            if(preparedStatement!=null){
                preparedStatement.close();
            }
            if(connection!=null){
                connection.close();
            }
        }


    }

}

1.2总结问题

1、将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译。系统可维护性不高。
设想如何解决?
能否将sql单独 配置在配置文件中。

2、数据库连接频繁开启和释放,对数据库的资源是一种浪费。
设想如何解决?
使用数据库连接池管理数据库连接。

3、向preparedStatement中占位符的位置设置参数时,存在硬编码(占位符的位置,设置的变量值)
设想如何解决?
能否也通过配置的方式,配置设置的参数,自动进行设置参数。


4、解析结果集时存在硬编码(表的字段名、字段的类型)
设想如何解决?
能否将查询结果集映射成java对象。

2 Mybatis框架

2.1Mybatis是什么?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

2.2 Mybatis框架图

这里写图片描述

1、mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

3 mybatis第一程序

3.1 准备环境:

Mybatis运行环境:

去mybatis官方网站下载Mybatis3.2.3。
这里写图片描述

mybatis-3.2.3.jar:mybatis核心包
mybaits的依赖包:
这里写图片描述

准备开发环境:
Jdk1.7.72
Eclipse indigo(3.7)
Mysql5.1

数据库运行环境:
Mysql5.1数据库驱动
这里写图片描述
创建mysql数据库:
这里写图片描述

3.2 用户查询开发

需求:
根据用户id查询一条记录(返回单条记录)
查询用户列表(返回list集合)

3.2.1创建java工程
这里写图片描述

3.2.2加入mybatis的jar包
加入 :mybatis核心包、mybatis依赖包、数据驱动包
这里写图片描述

3.2.3 配置log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

注意:开发阶段使用DEBUG

3.2.4 配置mybatis全局配置文件
全局配置文件:SqlMapConfig.xml(名称不是固定的)
这里写图片描述

配置的内容包括:
数据库运行环境(和spring整合废除了)
Mapper映射文件
这里写图片描述

3.2.5 创建po类

这里写图片描述

建议po类名和表名一致,属性名和表字段名一致。
这里写图片描述

3.2.6 配置mybatis的mapper映射文件
这里写图片描述

User.xml(mybatis推荐的命名方式是XXXXMapper.xml)
这里写图片描述

这里写图片描述

#{}:用于占位符
${}:用于sql拼接

在全局配置文件SqlMapConfig.xml中配置User.xml。

这里写图片描述

3.2.7 编写用户查询程序
这里写图片描述

第一步:根据mytais的配置创建SqlSessionFactory
这里写图片描述

第二步:根据SqlSessionFactory创建SqlSession
这里写图片描述

第三步:通过SqlSession操作数据库(根据用户id查询一条记录)

1、selectOne,查询单条记录
这里写图片描述

2、selectList,查询集合

这里写图片描述

第四步:遍历查询结果
这里写图片描述

第五步:SqlSession关闭
这里写图片描述

3.3 用户添加

3.3.1编写mapper.xml映射文件
在User.xml中定义添加用户的statement。
这里写图片描述

3.3.2编写用户添加程序
这里写图片描述

3.3.3主键返回问题

需求 :对于新增的记录,需要将主键返回到pojo中,就可以从pojo中获取新添加的记录id。

自增主键生成 Uuid主键生成时机区别:
自增主键在insert语句执行后生成 的。

Uuid主键在insert语句执行前生成 的。

3.3.3.1Mysql自增主键获取:

在insertUser的statement中添加selectKey
这里写图片描述

3.3.3.2Uuid主键获取
Uuid主键在insert语句执行前生成 的

如果使用uuid获取主键,定义selectkey

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

    <!-- 
    keyProperty:将主键设置到pojo中哪个属性中
    order:selectKey中sql执行的时机
    resultType:selectKey中sql执行的结果类型
    LAST_INSERT_ID:是insert后获取自增主键值 
     -->
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
         select uuid()
    </selectKey>
    insert into user(id,username,birthday,sex,address,detail,score)
     values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})
    </insert>

如果不用selectKey,也可以在调用SqlSession.insert()前,在输入参数设置id值 (生成uuid,设置到user的id属性中。)。

3.3.3.3Oracle主键返回
Oracle没有自增主键,使用oracle的序列(可以生成流水号,类似 自增主键)生成主键。

通过序列获取流水号方法:
Select 序列名.next.val from dual

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

    <!-- 
    keyProperty:将主键设置到pojo中哪个属性中
    order:selectKey中sql执行的时机
    resultType:selectKey中sql执行的结果类型
    LAST_INSERT_ID:是insert后获取自增主键值 
     -->
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
         Select 序列名.next.val from dual
    </selectKey>
    insert into user(id,username,birthday,sex,address,detail,score)
     values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})
    </insert>

3.4 用户删除

3.4.1Mapper.xml映射文件
这里写图片描述

3.4.2编写删除程序
这里写图片描述

3.5 用户更新

3.5.1Mapper.xml映射文件
这里写图片描述

3.5.2编写更新程序
这里写图片描述

3.6 小结

Mybatis开发:

第一步:编写SqlMapConfig.xml全局配置文件(重点配置mapper)
第二步:编写mapper.xml映射文件(重点)
定义statement(包括sql语句,输入和输出 参数类型)
在SqlMapConfig.xml全局配置文件配置mapper.xml(此配置可以通过规则省略)
第三步:编写程序(重点)
获取SqlSessionFactory
通过SqlSessionFactory获取SqlSession
通过SqlSession操作数据库(调用上边定义的statement)
得到statement的输出映射java对象

4 Mybatis解决jdbc编程的问题

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

5 与hibernate不同

Orm:mybatis不是一个完全的orm框架,hibernate是一个完全的orm框架。Mybatis需要程序员自己写sql,但是也存在映射(输入参数映射,输出结果映射)

学习门槛:mybatis比hibernate低。

应用的领域:
对于中小型项目,且需求固定,关系模型相对固定建议使用hibernate。适用传统项目,比如ERP。
对于需求不固定的项目,比如:互联网项目,建议使用mybatis,可以灵活去编写sql语句。

6 SqlSession使用方法

SqlSessionFactoryBuilder:用于创建SqlSessionFactory,将SqlSessionFactoryBuilder当成工具类使用。

SqlSessionFactory:会话工厂,用于创建SqlSession,SqlSessionFactory一旦创建成功,不用每次创建工厂,建议单例模式使用工厂。如果和spring整合后,由spring来管理SqlSessionFactory,在spring容器中SqlSessionFactory是一个单例对象。

SqlSession:(重点)是一个面向用户的接口,通过SqlSessionFactory获取SqlSession,每次数据操作都需要创建新的SqlSession,SqlSession 不是线程安全,最佳应用场合是方法体内,在方法中定义一个SqlSession局部变量。

7 使用mybatis开发原始dao

程序员需要开发dao接口和dao的实现类。

编写User.xml映射文件:
这里写图片描述

Dao接口和实现类:
这里写图片描述

总结问题:

在每一个dao方法中在调用 sqlSession的接口方法时需要对statement的id进行硬编码。
在调用 sqlSession的接口方法时,向statement传入参数,由于sqlSession接口方法参数是object,如果类型设置错误,在编译阶段没有报错。

8 Mapper动态代理方法

Mapper动态代理方法:程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。可以调用代理对象方法。

Mybatis官方建议:将dao接口叫做mapper。

目标:通过一些规则让mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象
mybatis将以下代码自动在代理对象实现:
User user = sqlSession.selectOne(“test.findUserById”, id);

如何让mapper接口找到mapper.xml中statement的id。

8.1第一步:开发mapper.xml映射文件

这里写图片描述

mapper.xml映射文件命名规则:XXXXMapper.xml

<!-- 根据用户id查询一条记录(返回单条记录) -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">

        SELECT * FROM USER WHERE id = #{id}

    </select>

为了让mapper.xml和mapper.java对应起来,将mapper.xml中的namespace设置为mapper.java的全限定名。
这里写图片描述

8.2第二步:开发mapper.java接口

这里写图片描述
mapper.java接口文件命名规则:XXXXMapper.java
这里写图片描述

Mybatis生成代理对象时,根据statement的标签决定调用 SqlSession的方法(select、insert、update..)
根据上边接口方法返回值 类型来决定 是调用 selectOne还是selectList,如果返回的是单个对象,动态代理调用selectOne(),如果返回的是集合对象,动态代理调用selectList()。

8.3Mapper开发规则

1、在mapper.xml中将namespace设置为mapper.java的全限定名
2、将mapper.java接口的方法名和mapper.xml中statement的id保持一致。
3、将mapper.java接口的方法输入参数类型和mapper.xml中statement的parameterType保持一致
4、将mapper.java接口的方法输出 结果类型和mapper.xml中statement的resultType保持一致

8.4小结

在企业中使用原始dao开发仍然的是很多的,主要是由于前期使用ibatis。
建议使用mybatis动态代理方法,好处不用写实现类,开发快捷。使用动态代码方法需要遵循上边四点规范。

9 SqlMapConfig.xml内容

SqlMapConfig.xml作为mybatis的全局配置文件,配置内容包括:数据库环境、mapper定义、全局参数设置。。。。

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)

9.1 properties

将数据库连接参数单独在一个properties文件中配置,好处是:方便系统升级维护。

db.properties
这里写图片描述

此文件中的内容会通过SqlMapConfig.xml去加载 。
这里写图片描述

使用db.properties
这里写图片描述

注意:由于mapper.xml中也可以引用属性文件中的内容,所以建议属性文件中key定义要有一定的规则,建议使用 前缀.XXX=XXXXX

9.2 settings(全局配置参数)

mybaits框架运行设置一些全局配置参数,比如:开启二级缓存 ,开启延迟载。。。

详细参考:
在ibatis中有一些设置性能参数(最大线程数、最大请求数。。),在mybatis中没有这些性能参数。
注意:设置全局参数会影响mybatis框架运行,谨慎设置。

9.3 typeAliases(类型别名)

在parameterType和resultType设置时,为了方便编码,定义别名代替pojo的全路径。

框架默认支持别名

别名  映射的类型
_byte       byte 
_long       long 
_short      short 
_int        int 
_integer    int 
_double         double 
_float      float 
_boolean    boolean 
string      String 
byte        Byte 
long        Long 
short       Short 
int             Integer 
integer         Integer 
double      Double 
float       Float 
boolean         Boolean 
date        Date 
decimal         BigDecimal 
bigdecimal  BigDecimal 

定义别名:

主要定义pojo的别名。
这里写图片描述

这里写图片描述

使用别名:
这里写图片描述

9.4t ypeHandlers(类型处理器)

类型处理器用于java类型和jdbc类型映射:

Mybatis提供 的类型处理器满足日常需要。

9.5 mappers(映射器)重点掌握
<mapper resource=" " />

使用相对于类路径的资源
如:<mapper resource="sqlmap/user.xml" />

这里写图片描述

这里写图片描述

这里写图片描述

常用批量扫描方式。

10 mapper- parameterType(输入类型)

parameterType:用于设置输入参数的类型。

10.1 #{}与${}
#{}:表示占位符,如果获取简单类型,#{}中可以使用value或其它名称 。有效防止sql注入。使用#{}设置参数无需考虑参数的类型。


如果使用#{}比较日期字段,select * from tablename where birthday >=#{birthday}

${}:表示sql拼接,如果获取简单类型,#{}中只能使用value 。无法防止sql注入。使用${}设置参数必须考虑参数的类型,比如:使用oracle查询条件是日期类型,如果使用${},必须人为将${}两边加单引号通过to_date转日期。
Select * from table where birthday >=to_date(‘${birthday}’,’yyyy-MM-dd’)

在没有特殊要求的情况下,建议使用#{}占位符
有些情况必须使用,Selectfrom{tablename}
动态拼接排序字段:select * from tablename order by ${username} desc

10.2 传递pojo对象

parameterType指定 输入参数为pojo自定义对象时,在sql中使用${}和#{}获取pojo的属性。

10.2.1包装对象使用
开发中使用pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(是另一个pojo),使用包装对象传递输入参数。

定义包装对象将查询条件(pojo)以类组合的方式包装起来。

parameterType使用包装对象:

包装对象:
这里写图片描述

mapper.xml
这里写图片描述

10.3 传递hashmap

parameterType指定 hashmap传递输入参数,#{}和${}中引用map的key。

Sql映射文件定义如下:

<!-- 传递hashmap综合查询用户信息 -->
    <select id="selectUserByHashmap" parameterType="hashmap" resultType="user">
       select * from user where id=#{id} and username like '%${username}%'
    </select>
10.4 小结:

如果使用动态代理方式,mapper接口的输入参数只有一个,是否有局限性?
Mapper就是dao,dao不是service,dao中没有业务逻辑,编写的dao具有公用的特性,被service公用 。
即使mapper接口方法输入参数只有一个,建议使用包装对象(注意不要使用map),使用组合 方式将pojo包装进来。

对于parameterMap已经过期不建议使用。

11 resultType

11.1 返回pojo

resultType:将sql查询结果集映射为java对象。要求sql查询的字段名和resultType指定pojo的属性名一致,才能映射成功。
如果全部字段和pojo的属性名不一致,映射生成 的java对象为空,只要有一个字段和pojo属性名一致,映射生成 的java对象不为空。

结论:sql查询字段名和pojo的属性名一致才能映射成功。

不管select返回的是单个 对象还是集合对象,resultType要指定单条记录映射的java对象。

11.2 返回简单类型

如果 sql查询的结果集只有一行且一列,resultType可以返回简单类型。
这里写图片描述

11.3返回 hashmap

输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。
Mapper.xml

<select id="findUserListReturnMap" parameterType="queryVo"  resultType="hashmap">
        select id,username username_ from user where username = #{user.username} and sex=#{user.sex}
     </select>

Mapper.java

Public Map  findUserListReturnMap(QueryVo queryVo);

建议不使用map作为返回值 ,因为需要对key在代码中硬编码。

11.4 小结

1、如果返回pojo,要求sql查询字段名和pojo的属性名一致。
2、不管select返回的是单个 对象还是集合对象,resultType指定相同的映射类型(单条记录映射的java对象类型。)

企业中常用resultType,针对sql查询结果定义pojo即可 。

12 动态 sql

Mybatis提供 了很多标签,用于拼接sql语句。

12.1 if

判断,如果条件满足,进行sql拼接。
这里写图片描述

12.2 sql片段

sql片段:可以将一些sql定义成一个片段,可以被其它statement引用。

Sql片段定义:
这里写图片描述

开发经验 :
建议以单表抽取sql,sql片段的可重用性才高。

Sql片段使用:
这里写图片描述

12.3 foreach

需求 :传入多个id查询用户

Sql语句:
两个方法:

SELECT * FROM USER WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)

SELECT * FROM USER WHERE username LIKE '%张%'  id IN (10,89,16)

传入参数:使用整型数组存储多个id值,通过QueryVo传递整型数组 。
这里写图片描述

Mapper.xml:
这里写图片描述

测试 代码:
这里写图片描述

13 resultMap

resultMap:如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 。

mapper.xml

定义resultMap:
这里写图片描述

这里写图片描述

Mapper.java
这里写图片描述

14 resultType和resultMap区别

resultType:sql查询结果集使用resultType映射,要求sql查询字段名和pojo的属性名一致,才能映射成功。
resultMap: 如果sql查询结果集的字段名和pojo的属性名不一致,使用resultMap将sql查询字段名和pojo的属性作一个对应关系 ,首先需要定义resultMap,最终要使用pojo作为结果集映射对象。

建议:一般情况下建议使用resultType,因为简单方便。
针对一对多查询或要使用延迟加载 ,必须使用resultMap。

15 问题

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'usernam' in 'class cn.itcast.mybatis.po.User'
### The error may exist in cn/itcast/mybatis/mapper/UserMapperCustom.xml
### The error may involve cn.itcast.mybatis.mapper.UserMapperCustom.findUserList-Inline
### The error occurred while setting parameters
### SQL: select * from user where username = ? and sex=?
### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'usernam' in 'class cn.itcast.mybatis.po.User'

原因是:

![这里写图片描述](https://img-blog.csdn.net/20170416170106257?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1NETl9BRg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#{username},mybatis进行输入参数映射时,调用parameterType指定 的pojo的get方法。如果属性写错了,报上边的错误 。




org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in cn/itcast/mybatis/mapper/UserMapperCustom.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'use'.  Cause: java.lang.ClassNotFoundException: Cannot find class: use
    ... 25 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'use'.  Cause: java.lang.ClassNotFoundException: Cannot find class: use

原因是:
这里写图片描述

无法解析上边的”use”别名。

Mybatis中表达大于等于或小于等于的正确书写 直接将SQL语句导入报错 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; n... 阅读详情

相关推荐

Stata:手动安装ivreghdfe包的完整指南与常见问题解决

本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。

weixin_29251131的博客 884

Mybatis XML文件转换SQL

Mybatis 动态XML转换SQL

JAVA菜鸟 2868

OPTEE v4.4.0 qemu_v8环境搭建(支持Hafnium)

一、前提条件 二、拉取代码 三、下载工具链 四、修改代码 五、编译 六、运行

AI-安全-功耗 854

mybatis如何生成和执行动态sql

include> 标签由XMLIncludeTransformer.applyIncludes()处理,同时还会处理 标签下的标签和“${}"占位符。作用是引入由标签定义的sql片段,实际在XMLMapperBuilder.sqlElement()解析。在CachingExecutor.query()生成真正待执行的sql。进入getBoundSql(),

tobebetter9527的博客 1401

通用mapper生成sqlmybatis使用过程

  sql装配,自己实现一个,通用mapper和mybatis-generator是两个东西各自功能不同,结合使用而已 通用mapper: 1,省略单表操作的xml 2,不必写实现类(用通用mapper的单表操作方法不用,用xml中sqlmybatis)也不用)    mybaits      VS         hibernate mybatis-generator对应hibe...

yuhui666666的博客 1298

pojo、entity、vo三种类的区别

pojo,entity,vo三种类的区别 pojo(Plain Ordinary Java Object):普通的Java对象,其实就是简单的JavaBean实体类。对应数据库里的某一张表,pojo里的每一个属性都和该表中的字段一 一对应。 vo(value object):值对象,又称表现层对象,对应展示界面的数据对象。比如一个前台展示的数据列表,这个列表中的姓名和用户名分别是存在于两个表中的数据,此时数据显示时查询语句用到了多表查询sql,查询出来的数据包含了两个表的字段,此时使用一个JavaBean实

你来看我啦! 2万+

概念POJO、DTO、DAO、PO、BO、VO、QO、ENTITY详解

在java开发过程中,新手总是被DAO、PO、BO、VO等等概念弄得晕头转向。 下面我查找了很多资料,总结如下: POJO(Plain Ordinary Java Object 简单Java对象) 实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。 POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。它包括PO、DTO、VO、BO等。 POJO持久化-》PO POJO传递-》 DTO POJO在表示层-》VO PO(persistence o

晓风残月淡的博客 4万+

Day61 Mybatis框架入门

开发前的准备 开发工具的更换:eclipseEE+MySQL+tomcat7.0+jre1.7 开发工具由Myeclipse换成eclipse. Myeclipse和eclipse开发Web项目的区别: 编码准备:在eclipse的dropins文件夹下集成io.emmet.eclipse_1.0.0.201304090013.jar 实现前端代码 提示功能,如果需要SVN集成,需要在此文件...

新世界的大门 237

day61 JavaWeb框架阶段——Mybatis多表查询(一对一查询 ,一对多查询 ,多对多查询)

1.Mybatis多表查询 今日源码: 链接:https://pan.baidu.com/s/1ntCbe-v4yYtKgqt2MplmQw 提取码:evwm 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 1.1.2一对一查询的语句 对应的sql语句:sele...

qq_38454176的博客 569

黑马MyBatis入门day1

1 package com.itheima.domain; 2 3 /* 4 CREATE TABLE `user` ( 5 `id` int(11) NOT NULL AUTO_INCREMENT, 6 `username` varchar(50) DEFAULT NULL, 7 `password` varchar(50) DEFAUL...

diaopitian0181的博客 148

mybatis学习笔记 day02

帮助程序猿将数据存入到数据库中。方便传统的JDBC代码太复杂了。简化。框架。自动化。不用Mybatis也可以。更容易上手。技术没有高低之分优点:1.简单易学2.灵活3.sql和代码的分离,提高了可维护性。4.提供映射标签,支持对象与数据库的orm字段关系映射5.提供对象关系映射标签,支持对象关系组建维护6.提供xml标签,支持编写动态sql。...

vengu733的博客 193

day61_SSM+自定义注解实现日志记录

ssm,aop,自定义注解实现操作日志记录

沐沐 487

MyBatis之TypeHandler

    转载自:http://www.cnblogs.com/yulinfeng/p/5991170.html           在大学写web应用的时候经常会遇到这么个问题,当我要插入一条数据,某个数据是Date类型,数据库中却是VARCHAR类型,这个时候可能会傻乎乎的先把这个数据自己手动转换成String类型再插入到数据库中,其实大可不必。MyBatis为我们提供了更好的方法即TypeH...

hchhan的博客 2370

【2020-09-03】day03:Mybatis分页联表查询基于SQL语句与collection映射嵌入的简单性能优化

个人知识碎片的体系化理解与整理,缓慢更新,理解不到位与错漏之处望见谅与指正。 day03摘要思想:mybatis的mapper工具类提供了一整套的简单增删改查逻辑解决方案,在代码层直接使用可满足大部分需求,但若涉及联表而采用了for循环反复调用mybatis的现成方法,则将造成一定的效率浪费问题;可以采用一种在mapper.xml中定义实体映射规则并直接嵌入SQL语句的方式避免这种效率浪费 开发环境:Intellij IDEA 2017.2.6 1.用户-用户角色-角色实体类定义 相关实体类定义如下

Index_Summer的博客 432

day47,品优购电商,Maven依赖结构,Dubbox+SSM搭建,mybatis逆向工程,搭建zookeeper分布框架,向页面返回json数据,前端框架AngularJS入门

第2章 项目搭建 课程目标 目标1:能够说出项目的Maven依赖结构 目标2:能够运用Dubbox+SSM搭建分布式应用 目标3:搭建工程框架,完成品牌列表后端代码 目标4:理解AngularJS前端框架的常用指令 1.品优购-框架搭建 1.1工程结构分析与设计 最终完整的工程结构如下: 工程说明: pinyougou-parent 聚合工程 pinyougou-pojo 通用实体类层 pin...

qq847196660的博客 253

mybatis sql解析问题(JSQLParserException)

mybatis sql解析问题(JSQLParserException)

RAXCL的博客 3110

Mybatis学习三(动态sql语句)

动态sql语句主要为以下语句 1、动态SQL:if 语句2、动态SQL:if+where 语句3、动态SQL:if+set 语句4、动态SQL:choose(when,otherwise) 语句5、动态SQL:trim 语句6、动态SQL: SQL 片段7、动态SQL: foreach 语句 之前的几篇学习博客我用mybatis对一张表进行的CRUD操作,但是 SQL 语句都比较简单...

banfhty655060的博客 185

H3C认证云计算工程师(H3CNE-Cloud)-官方教材-考试用书

H3C认证云计算工程师(H3CNE-Cloud)-官方教材-考试用书、华三认证考试,官方教材,正版材料,pdf

上一篇: day60_springMVC
下一篇: day62_mybatis_springMVC_spring整合
csdn_AF
博客等级 码龄9年 161粉丝 122原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值