mybatis入门

本文介绍了MyBatis作为持久层框架的基本用法,包括配置porm.xml、创建实体类和DAO接口、配置SqlMapConfig、编写映射配置文件UserDao.xml以及如何操作数据库。此外,还提到了在使用过程中遇到的问题,如查询结果找不到对应的Result Maps,解决方案是在映射文件中指定resultType。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis01

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis示例

1.porm.xml

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2.创建实体类和dao接口

3.创建SqlMapConfig

<!--    配置环境-->
        <environments default="mysql">
    <!--        配置MySQL环境-->
            <environment id="mysql">
    <!--            事务类型-->
                <transactionManager type="JDBC"></transactionManager>
    <!--            连接池-->
                <dataSource type="POOLED">
                    <!--            数据库连接基本信息-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value=""/>
                </dataSource>
            </environment>
        </environments>
    <!--    映射配置文件的位置 -->
        <mappers>
            <mapper resource="com/cc/mybatis/dao/UserDao.xml"></mapper>
        </mappers>
    </configuration>

4.创建映射配置文件UserDao.xml

 <mapper namespace="com.cc.mybatis.dao.UserDao">
    <select id="findAll" resultType="com.cc.mybatis.domain.User">
        select * from user
    </select>
</mapper>

5.操作数据库

 //1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig");
//2.创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SQLSession对象
SqlSession session = factory.openSession();
//创建dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
    System.out.println(user);
}
//释放资源
session.close();
in.close();
查询结果
/* User(id=56, username=cc, birthday=Wed May 22 00:00:00 CST 2019, sex=男, address=中国)
User(id=57, username=cc, birthday=Wed May 22 00:00:00 CST 2019, sex=男, address=中国)
User(id=58, username=cc, birthday=Wed May 22 00:00:00 CST 2019, sex=男, address=中国)
User(id=59, username=cc, birthday=Wed May 22 00:00:00 CST 2019, sex=男, address=中国)
User(id=60, username=cc, birthday=Wed May 22 00:00:00 CST 2019, sex=男, address=中国)*/

mybatis注解方式

删除UserDao.xml
在UserDao添加
@Select("select * from user") 
修改SqlMapperConfig
将
<mappers>
   <mapper resource="com/cc/mybatis/dao/UserDao.xml"></mapper>
</mappers>
替换为
<mappers>
    <mapper class="com.cc.mybatis.dao.UserDao"></mapper>
</mappers>

遇到的问题

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.cc.mybatis.dao.UserDao.findAll'.  It's likely that neither a Result Type nor a Result Map was specified.
### The error may exist in com/cc/mybatis/dao/UserDao.xml
### The error may involve com.cc.mybatis.dao.UserDao.findAll
### The error occurred while handling results
### SQL: select * from user
### Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.cc.mybatis.dao.UserDao.findAll'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy2.findAll(Unknown Source)
	at com.cc.mybatis.test.MyBatisTest.main(MyBatisTest.java:33)
Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.cc.mybatis.dao.UserDao.findAll'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:287)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:189)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	... 6 more

Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘com.cc.mybatis.dao.UserDao.findAll’. It’s likely that neither a Result Type nor a Result Map was specified.

没有找到查询封装的对象的返回类型

UserDao.xml添加resultType=“com.cc.mybatis.domain.User”

### MyBatis入门教程 #### 1. MyBatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects) 映射成数据库中的记录[^1]。 #### 2. 日志输出配置 为了方便调试SQL语句,在`mybatis-config.xml`文件中可以加入如下配置: ```xml <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> ``` 这会使得执行的所有SQL语句都会被打印到控制台,便于开发人员查看和排查问题。 #### 3. 参数传递方式对比 在MyBatis中提供了两种不同的占位符用于构建动态SQL:`#{}` 和 `${}` 。其中 `#{}` 表达式的值会被视为预编译语句的一个参数,并由JDBC驱动自动处理转义字符;而`${}` 则直接替换为变量的实际内容,存在SQL注入风险,因此建议优先使用`#{}` 来防止潜在的安全隐患。 #### 4. 实体类定义 对于每一个要操作的数据表来说都需要创建对应的Java Bean对象即实体类。这里展示了一个基于 Lombok 注解简化后的User实体类例子: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("user") public class User { @TableId(value = "id", type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; } ``` 此段代码利用了Lombok库提供的`@Data`自动生成getter/setter方法,减少了样板代码的数量并提高了可读性和维护效率[^2]。 #### 5. Mapper 接口编写 Mapper接口是用来声明针对特定数据表的操作行为的地方。通常情况下只需要按照一定命名规则定义好相应的方法签名即可完成CRUD功能实现。例如下面是一个典型的UserMapper接口片段: ```java package com.example.mapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { int insert(User user); List<User> selectAll(); void updateById(Long id, User updatedUser); boolean deleteById(Long id); } ``` 上述示例展示了如何简单地定义一些基础性的增删改查函数原型,实际业务逻辑则交给了XML映射文件或者内联注解去具体描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值