mybatis框架
1. 什么是MyBatis框架?
MyBatis是一个开源的持久层框架,用于将Java对象与数据库进行映射。它提供了简单且直观的编程接口,可以实现自定义SQL查询、存储过程调用和结果映射等功能。MyBatis不是一个全面的ORM(对象关系映射)框架,而是一种半自动化的数据访问层解决方案。
2. 为什么使用MyBatis框架?使用MyBatis框架有以下几个优势:灵活性:Mybatis允许开发人员直接编写SQL语句,利用SQL的强大功能来实现复杂查询操作。
性能控制:Mybatis提供了多种优化技巧来提高数据库访问的性能,如预编译语句、数据库连接池、缓存等。开发人员可以根据具体要求来进行配置和优化。
易于集成:Mybatis可以与各种数据源和框架(如Spring)进行无缝集成,方便与现有的项目进行整合。
可读性:Mybatis提供了清晰的配置文件和注解,使得SQL语句与java代码分离,易于阅读和维护。
3. 快速搭建MyBatis工程,可以按照以下步骤进行操作:
* 创建Maven或Gradle项目,引入MyBatis的依赖。
* 在配置文件(如application.properties或mybatis-config.xml)中配置数据库连接信息和MyBatis相关的配置项。
* 创建数据库表,并编写对应的实体类。
* 创建Mapper接口和对应的XML文件,定义SQL映射关系和操作。
* 根据需要,可在代码中使用SQLSessionFactory和SQLSession执行SQL语句和事务操作。
* 引入Mybatis和Mysql的依赖
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--mysql的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
4. 要使用MyBatis完成CRUD操作(增删改查),可以按照以下步骤进行操作:
- 定义数据库表,并创建对应的实体类。
- 编写Mapper接口,定义与数据库表对应的查询方法(如查询、插入、更新、删除等)。
- 在Mapper接口对应的XML文件中,编写SQL语句以及参数映射配置。
- 在配置文件中配置Mapper接口的位置和其他相关信息。
- 使用SQLSessionFactory获取SQLSession,并使用Mapper接口调用相应的方法进行数据库操作。
5.(1)创建数据库表:上海时区可加可不加

(2)Mybatis的配置文件和把映射文件加入到配置文件中:

(3)Mybatis的映射文件:

(4)测试:

6.要优化MyBatis的代码,可以考虑以下几点:
结果集映射: 使用合适的结果集映射方式可以减少查询操作的数据库访问次数。可以通过使用 resultMap、association、collection 等标签来优化结果集的映射,减少不必要的关联查询或循环嵌套查询。
动态SQL: 使用 MyBatis 的动态 SQL 功能可以根据不同的条件生成不同的 SQL 语句,避免编写大量重复的 SQL。可以使用 if、choose、where等标签来动态构建 SQL 语句,提高代码可读性和维护性。
预编译语句: 使用预处理语句可以减少数据库的解析和编译时间,提高查询效率。在 Mapper 接口中使用 #{参数名} 的方式来定义预处理语句的参数,避免使用字符串拼接的方式。
7. MyBatis注解模式
MyBatis支持两种操作数据库的方式:XML映射文件方式和注解方式。注解方式操作数据库更加简洁直观,可以减少编写映射文件的工作量。在注解模式下,可以使用注解直接在Java代码中标记SQL语句,从而实现数据库操作。
例如,使用注解方式实现一个查询用户信息的SQL语句:
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
这里使用了@Select注解标记了一个查询语句,并通过#{id}方式传递参数。在调用getUserById方法时,MyBatis会自动执行该SQL语句并返回结果。
要把dao接口放入Mybatis配置文件中

8.优化
8.1(1)为了引入数据库的属性文件,可以按照以下步骤进行操作:
在resources目录下创建一个名为db.properties的文件,并在其中定义数据库连接的属性,例如:

上述示例中定义了数据库驱动、数据库连接URL、用户名和密码。
(2)在 MyBatis 的配置文件(通常是 mybatis.xml)中引入该属性文件,添加如下内容:
<properties resource="db.properties" />
上述代码指定使用 db.properties` 文件中的属性作为数据库连接的配置。
(3)在配置文件中使用这些属性,例如:

上述代码使用了 `${}` 语法来引用属性文件中的
属性值,从而实现数据库连接的配置。属性名与属性文件中的键名保持一致。
8.2 MyBatis允许为实体类起别名,以简化在SQL语句中使用实体类的全限定名。可以在 MyBatis 的配置文件中定义别名:
<typeAliases>
<typeAlias type="com.lll.User" alias="User" />
</typeAliases>
为 com.lll.User 类起了一个别名 User。这样,在 SQL 语句中可以使用 User作为实体类的别名。
8.3 添加 MyBatis 的执行日志
(1)引入日志jar[log4j]
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)添加日志文件log4j.properties
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
(3)测试

9. 解决列名和属性名不一致
在MyBatis中,可以使用@Result注解来解决列名和属性名不一致的问题。例如,假设数据库中的列名为user_name,而Java对象的属性名为userName,可以使用以下注解来映射:
@Results({
@Result(column = "user_name", property = "userName")
})
@Select("SELECT user_name FROM users")
List<String> getUserNames();
这样,MyBatis在执行查询时就会将数据库中的user_name列值映射到Java对象的userName属性。
10. 传递多个参数
在MyBatis中,可以使用@Param注解来传递多个参数。例如,假设有一个查询语句需要传递两个参数id和name:
@Select("SELECT * FROM users WHERE id = #{userId} AND name = #{userName}")
User getUserByIdAndName(@Param("userId") int id, @Param("userName") String name);
这里使用了@Param注解对参数进行命名,并在SQL语句中使用对应的名称进行引用。在调用getUserByIdAndName方法时,需要使用参数命名进行传递。
11. 模糊查询
在MyBatis中,可以使用`CONCAT`函数和通配符 `%` 来实现模糊查询。例如,假设需要模糊查询用户名中包含"abc"的用户:
@Select("SELECT * FROM users WHERE name LIKE CONCAT('%', #{keyword}, '%')")
List<User> getUsersByKeyword(String keyword);
这里使用了`CONCAT`函数将通配符 `%` 与查询关键字拼接起来,并在SQL语句中使用`LIKE`进行模糊匹配。调用`getUsersByKeyword`方法时,将需要查询的关键字作为参数传递。
12.解决MyBatis映射文件中的特殊字符
<select id="selectByAge" resultType="com.ykq.entity.User">
<![CDATA[
select * from t_user where age>=#{min} and age<=#{max}
]]>
</select>
13.添加时获取递增主键的值

14.要在 MyBatis 中完成链表查询映射,可以使用 MyBatis 提供的关联映射功能。下面是一个示例:
假设有两个实体类 Order 和User,它们之间存在一对一的关联。在实际数据库表中,订单和用户通过外键进行关联。
首先,在实体类中定义关联关系:
public class Order {
private int id;
private String orderNo;
private int userId;
private User user;
// getter 和 setter
}public class User {
private int id;
private String username;
private String email;
// getter 和 setter
}
然后,在 MyBatis 的映射文件(如 `OrderMapper.xml`)中,使用 `<association>` 元素进行关联映射:
<!-- OrderMapper.xml -->
<select id="getOrderWithUser" resultType="Order">
SELECT o.id, o.order_no, o.user_id, u.id AS user_id, u.username, u.email
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.id = #{id}
</select>
使用 `INNER JOIN` 将订单表和用户表关联起来,并将结果映射到 `Order` 对象中。通过 `AS` 关键字设置别名,以避免列名冲突。
最后,在 Java 代码中调用 MyBatis 的查询方法,获取关联的对象:
Order order = orderMapper.getOrderWithUser(1);User user = order.getUser();
调用 `getOrderWithUser` 方法可以获取到包含关联对象的订单数据,并通过 `getUser` 方法获取到关联的用户对象。
15. MyBatis的动态SQL语句
MyBatis 提供了动态SQL语句的功能,可以根据不同的条件生成不同的SQL语句。以下是一些常用的动态SQL标签:
- <if>:用于条件判断,只有当条件满足时才会包含其中的内容。
- <choose>、<when>、<otherwise>:类似于 Java 的 switch 语句,根据条件选择不同的分支。
- <trim>、<where>、<set>:用于处理一些常用的动态SQL场景,如去掉多余的逗号或AND。
- <foreach>:用于循环遍历集合或数组,并生成对应的SQL语句。
下面是一个示例,展示如何使用动态SQL语句:
<!-- UserMapper.xml -->
<select id="getUsersByCondition" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
上述示例中,使用了 `<where>` 标签来生成动态的 WHERE 子句。根据传入的条件,判断是否包含特定的查询条件。
在 Java 代码中,可以传入不同的条件并调用相应的方法:
List<User> userList = userMapper.getUsersByCondition(null, "example@example.com");
上述示例中,通过调用 `getUsersByCondition` 方法,并传入不同的参数,根据条件生成动态的SQL语句进行查询。
16. 要在 MyBatis 中使用分页插件 PageHelper,可以按照以下步骤进行操作:
(1) 添加 PageHelper 依赖
在 Maven 或者 Gradle 的项目配置文件中添加 PageHelper 的依赖,例如:
<!-- Maven -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本号</version>
</dependency>
(2)添加 PageHelper 的配置
在 MyBatis 的配置文件中添加 PageHelper 的配置项,例如:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql" />
</plugin>
</plugins>
上述示例中,使用了 MySQL 数据库,因此指定了 `dialect` 属性为 `mysql`。如果使用其他数据库,需要根据实际情况进行设置,例如 `oracle`、`postgresql` 等。
(3)使用 PageHelper 实现分页
在进行数据库查询时,简单地调用 `PageHelper.startPage(pageNum, pageSize)` 方法就能实现分页。例如:
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;public class UserDao {
public List<User> getUsersByPage(int pageNum, int pageSize) {
// 开始分页
PageHelper.startPage(pageNum, pageSize);// 执行查询
List<User> userList = userMapper.getUsers();// 封装为 PageInfo 对象
PageInfo<User> pageInfo = new PageInfo<>(userList);// 返回结果
return pageInfo.getList();
}
}
在上述示例中,`pageNum` 表示请求的页码,`pageSize` 表示每页的条目数。通过调用 `PageHelper.startPage(pageNum, pageSize)` 方法,会自动在执行数据库查询时进行分页。
查询结果会被封装为 PageInfo 对象,其中包含了分页信息和查询结果列表。可以通过 `pageInfo.getList()` 方法获取分页结果列表。
这样,就可以使用 PageHelper 实现 MyBatis 的分页功能了。需要注意的是,分页插件只对紧随后面的一条查询语句生效,如果有多次查询需要分页,需要在每次查询前都调用 `PageHelper.startPage(pageNum, pageSize)` 方法。
浙公网安备 33010602011771号