Mybaits初识

Mybaits是为了可以方便管理数据库而产生的,本次根据慕课网的来入门学习
Mybatis与其他框架其实相差无多,也是利用配置文件来达到与数据库连接的目的
其中最重要的是就是两个配置文件,两个文件的模板都在这个文件夹下
mybatis / src / test / java/ o rg / apache / ibatis / submitted / complex_property
第一个是Configuration.xml
第二个是User.xml
文件的命名并无意义,这里采取官方名称,只要在加载的时候写清楚路径即可,
我们直接在项目根目录下建立即可,如果把配置文件分明的话,在后面加载我们输入我们建立xml的路径即可
(1)首先是configuration.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
  <settings>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="useColumnLabel" value="true"/>
  </settings>

  <typeAliases>
    <typeAlias alias="UserAlias" type="org.apache.ibatis.submitted.complex_property.User"/>
  </typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC">
        <property name="" value=""/>
      </transactionManager>
      <!-- 在这里配置驱动 -->
      <dataSource type="UNPOOLED">
        <property name="driver" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:complexprop"/>
        <property name="username" value="sa"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml"/>
  </mappers>

</configuration>

其他的先不管,首先是,在这里配置驱动,而后是这里配置sql。
我们现在java里面连接驱动

        Reader reader=Resources.getResourceAsReader("Configuration.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

在这里用Resources来加载写好的Configuration.xml文件,以Sql
SessionFactoryBuilder来获取一个SqlSessionFactory。
在以后想用的时候

SqlSession session=factory.openSession();

即可
(2)接下来就是User.xml了,
当获取到一个SqlSession后,我们怎么使用它呢,就需要User.xml了,User.xml官方模板如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="User">

  <resultMap type="UserAlias" id="UserResult">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="username" jdbcType="VARCHAR" property="username"/>
    <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>
    <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>
  </resultMap>

  <select id="find" parameterType="long" resultMap="UserResult">
    SELECT * FROM user WHERE id = #{id:INTEGER}
  </select>

  <select id="version" parameterType="long" resultType="int">
    SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
  </select>

  <delete id="delete" parameterType="UserAlias">
    DELETE FROM user WHERE id = #{id:INTEGER}
  </delete>

  <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
    INSERT INTO user
    ( id,
    username,
    password,
    administrator
    )
    VALUES
    ( #{id},
    #{username,jdbcType=VARCHAR},
    #{password.encrypted:VARCHAR},
    #{administrator,jdbcType=BOOLEAN}
    )
  </insert>

  <update id="update" parameterType="UserAlias">
    UPDATE user SET
    username = #{username,jdbcType=VARCHAR},
    password = #{password.encrypted,jdbcType=VARCHAR},
    administrator = #{administrator,jdbcType=BOOLEAN}
    WHERE
    id = #{id,jdbcType=INTEGER}
  </update>

  <!--   Unique constraint check -->
  <select id="isUniqueUsername" parameterType="map" resultType="boolean">
    SELECT (count(*) = 0)
    FROM user
    WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
    NULL)  <!-- other than me -->
    AND (username = #{username,jdbcType=VARCHAR})
  </select>
</mapper>
04-10
<think>好的,我需要处理用户关于MyBatis的技术资料和常见问题解决的查询。首先,用户提到的引用内容涵盖了MyBatis返回行数、动态SQL、参数传递、依赖配置以及MyBatis-Plus的功能。根据这些内容,我应该整理出MyBatis的主要使用指南和常见问题。 第一步,确认用户的需求是查找使用指南或常见问题解决,可能需要分点回答。引用中有提到返回行数的问题,默认情况下MySQL返回的是匹配行数而非受影响行数,这可能导致误判。需要说明如何通过配置useAffectedRows=true来解决,或者在无法配置时的其他方法,比如检查更新内容的变化。 接下来是动态SQL部分,用户可能想知道如何正确使用if、choose等标签,避免逻辑错误。需要引用动态SQL的示例,比如在XML中如何使用<if>标签,并注意条件判断的准确性。 参数传递方面,引用中提到多参数必须使用@Param注解,否则MyBatis无法识别参数名称。需要给出示例代码,并说明在XML中如何引用参数名称,比如#{age}和#{name}。 依赖配置部分,用户可能遇到启动器或分页插件的问题。需要列出正确的依赖配置,包括MyBatis的Spring Boot启动器和PageHelper的版本,确保兼容性。 MyBatis-Plus的功能如全局ID生成策略和逻辑删除也是常见内容,需要简要说明配置方法,比如在application.properties中设置id-type和logic-delete-field。 常见问题方面,返回行数的误判、动态SQL的条件错误、参数绑定异常、依赖冲突以及逻辑删除配置都是需要强调的点。每个问题需要对应解决方案,并引用相关文献支持。 最后,生成相关问题时要覆盖用户可能进一步询问的方向,比如返回行数的具体配置步骤、动态SQL的复杂用法、参数传递的替代方法、分页插件的使用以及逻辑删除的实现细节。 需要确保回答结构清晰,分点列出使用指南和常见问题,每个部分都有对应的引用标注,并且语言简洁明了。同时,检查是否有遗漏的引用内容,确保覆盖用户提供的所有信息。</think>### MyBatis 使用指南与常见问题解决方案 #### 一、核心配置与依赖管理 1. **依赖配置** Spring Boot 中需手动添加 MyBatis 官方启动器,并注意分页插件版本兼容性: ```xml <!-- MyBatis 启动器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!-- PageHelper 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> ``` 若出现依赖冲突,需排查 JDBC 或其他 ORM 框架的版本[^4]。 2. **全局配置** MyBatis-Plus 支持全局 ID 生成策略和逻辑删除配置: ```properties # 指定 UUID 为主键生成策略 mybatis-plus.global-config.db-config.id-type=assign_uuid # 启用逻辑删除(字段名为 deleted) mybatis-plus.global-config.db-config.logic-delete-field=deleted ``` 逻辑删除需在实体类字段添加 `@TableLogic` 注解[^5]。 --- #### 二、动态 SQL 与参数绑定 1. **动态 SQL 编写** 使用 OGNL 表达式实现条件查询,避免 SQL 拼接错误: ```xml <select id="findUser" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age > 0">AND age = #{age}</if> </where> </select> ``` 注意:`<if>` 条件需严格校验空值和范围[^2]。 2. **多参数传递** 必须通过 `@Param` 注解声明参数名称,否则 MyBatis 无法正确映射: ```java public List<User> findByAgeAndName( @Param("age") int age, @Param("name") String name ); ``` XML 中引用参数时需使用 `#{age}` 而非 `#{param1}`[^3]。 --- #### 三、常见问题与解决方案 1. **返回行数误判** - **问题**:MySQL 默认返回匹配行数(如 UPDATE 未实际修改数据时返回 0)。 - **解决**:在 JDBC URL 添加 `useAffectedRows=true`,强制返回受影响行数: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useAffectedRows=true ``` 若无法修改配置,需在代码中额外校验数据变更[^1]。 2. **参数绑定异常** - **问题**:未使用 `@Param` 导致参数名称为 `arg0`、`arg1`,与 XML 不匹配。 - **解决**:显式声明参数名或改用 `Map` 封装参数[^3]。 3. **动态 SQL 条件失效** - **问题**:`<if test="status">` 误判为 `false`(当 `status=0` 时)。 - **解决**:使用 `!= null` 或明确判断值范围,如 `<if test="status != null">`[^2]。 --- #### 四、性能优化技巧 1. **批量操作** 使用 `SqlSession` 的 `BATCH` 执行模式提升插入/更新效率: ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper mapper = sqlSession.getMapper(UserMapper.class); for (User user : userList) { mapper.insert(user); } sqlSession.commit(); ``` 2. **缓存配置** 启用二级缓存减少数据库查询: ```xml <cache eviction="LRU" flushInterval="60000" size="512"/> ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值