简介
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和参数的手动设置,简化了开发过程。此外,它还提供了对象关系映射工具,可以将普通的 Java 对象自动映射成数据库表中的记录。MyBatis 还提供了插件机制,可以方便地实现自己的功能
官网:https://mybatis.org/mybatis-3/zh/index.htmlhttps://mybatis.org/mybatis-3/zh/index.html
MyBatis的使用主要包括配置依赖、创建实体类、编写映射文件和执行数据库操作等步骤。以下是使用MyBatis的基本步骤:
- 配置依赖:需要在项目中引入MyBatis的依赖,这可以通过Maven或Gradle等构建工具来完成。在Maven项目的pom.xml文件中添加MyBatis相关的依赖项。
- 创建实体类:根据数据库表结构创建相应的Java实体类,这些实体类将与数据库中的记录一一对应。
- 编写映射文件:为每个实体类创建对应的XML映射文件,定义SQL语句和结果映射规则。这些映射文件会被MyBatis用来生成最终的SQL语句并映射执行结果到实体类对象。
- 执行数据库操作:通过MyBatis提供的SqlSession接口执行增删改查等数据库操作。可以使用XML配置文件或者注解的方式来配置SQL语句和参数映射。
- 日志配置:为了方便调试和记录操作信息,可以配置日志工具如Log4j来输出MyBatis的操作日志。
- 测试连接:在完成上述配置后,应该对数据库连接进行测试,确保MyBatis能够正确连接到数据库并执行SQL语句。
- 优化配置:根据实际需求对mybatis.xml配置文件进行优化,以提高性能和效率。
- 封装工具类:可以封装一些工具类来简化数据库连接和操作的过程,提高代码的复用性和可维护性。
配置Mybatis
在springboot项目中,可以编写application.properties文件,配置数据库连接信息。我们要连接数据库,就需要配置数据库连接的基本信息,包括:driver-class-name、url 、username,password。
application.properties:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
编写SQL语句
@Mapper
public interface UserMapper {
//查询所有用户数据
@Select("select id, name, age, gender, phone from user")
public List<User> list();
}
@Mapper注解:表示是mybatis中的Mapper接口
-
程序运行时:框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理
@Select注解:代表的就是select查询,用于书写select查询语句
测试
@SpringBootTest
public class MybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testList(){
List<User> userList = userMapper.list();
for (User user : userList) {
System.out.println(user);
}
}
}
JDBC(了解)
JDBC,全称为Java数据库连接(Java Database Connectivity),是一套为Java程序提供数据库访问的标准API。
JDBC作为Java语言的数据库接口,提供了一系列的接口和类,允许Java应用程序通过SQL语句与各种关系型数据库进行交互。以下是JDBC的一些关键点:
- 标准接口:JDBC定义了一组标准的接口和类,使得Java程序可以以一种统一的方式访问不同的数据库系统。
- 数据库独立性:使用JDBC编写的程序具有很高的可移植性,因为它们不依赖于特定的数据库实现。只要数据库提供了相应的JDBC驱动程序,程序就能够运行。
- SQL执行:JDBC的核心功能是执行SQL语句,包括数据查询、更新、插入和删除等操作。
- 驱动管理:JDBC通过驱动程序管理器来加载和管理数据库驱动,确保应用程序能够与数据库建立连接。
- 连接池:为了提高性能和资源利用率,JDBC支持连接池技术,这允许应用程序重用现有的数据库连接,而不是每次都创建新的连接。
- 事务管理:JDBC提供了事务管理的机制,允许应用程序执行一系列的数据库操作,并确保这些操作要么全部成功,要么全部失败,从而维护数据的一致性。
代码
public class JdbcTest {
@Test
public void testJdbc() throws Exception {
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取数据库连接
String url="jdbc:mysql://127.0.0.1:3306/mybatis";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 执行SQL
Statement statement = connection.createStatement(); //操作SQL的对象
String sql="select id,name,age,gender,phone from user";
ResultSet rs = statement.executeQuery(sql);//SQL查询结果会封装在ResultSet对象中
List<User> userList = new ArrayList<>();//集合对象(用于存储User对象)
//4. 处理SQL执行结果
while (rs.next()){
//取出一行记录中id、name、age、gender、phone下的数据
int id = rs.getInt("id");
String name = rs.getString("name");
short age = rs.getShort("age");
short gender = rs.getShort("gender");
String phone = rs.getString("phone");
//把一行记录中的数据,封装到User对象中
User user = new User(id,name,age,gender,phone);
userList.add(user);//User对象添加到集合
}
//5. 释放资源
statement.close();
connection.close();
rs.close();
//遍历集合
for (User user : userList) {
System.out.println(user);
}
}
}
DriverManager(类):数据库驱动管理类。
-
作用:
-
注册驱动
-
创建java代码和数据库之间的连接,即获取Connection对象
-
Connection(接口):建立数据库连接的对象
-
作用:用于建立java程序和数据库之间的连接
Statement(接口): 数据库操作对象(执行SQL语句的对象)。
-
作用:用于向数据库发送sql语句
ResultSet(接口):结果集对象(一张虚拟表)
-
作用:sql查询语句的执行结果会封装在ResultSet中
数据库连接池
数据库连接池是一种资源池设计模式,它能够有效地管理数据库连接,提高系统性能和稳定性。
数据库连接池的主要作用是负责分配、管理和释放数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是每次都重新建立一个新连接。这样做的好处是显著的,因为数据库连接是一种关键的有限资源,尤其是在多用户的网页应用程序中,频繁地打开和关闭物理连接会导致系统性能低下。通过使用连接池,应用程序可以在启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。
连接池的优势在于:
- 提高性能:避免了频繁建立和关闭连接的开销,使得数据库操作更加迅速。
- 资源复用:连接可以被多个请求复用,减少了资源的浪费。
- 管理便捷:连接池通常提供了监控和管理工具,可以方便地查看连接状态和性能指标。
- 动态调整:应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数,以适应不同的负载需求。
常见的连接池实现方案包括但不限于HikariCP、c3p0和Apache DBCP等。这些连接池实现通常会提供一系列的配置参数,以便根据具体的应用场景进行调整。例如,可以设置最大连接数、最小连接数、连接超时时间等。同时,它们也会有自己的生命周期管理策略,包括如何处理空闲连接和异常连接。
lombok
Lombok 是一个旨在通过注解简化Java代码的库。它可以帮助开发者减少编写样板代码的时间,专注于业务逻辑的实现。
具体来说,Lombok提供了一系列的注解,这些注解可以应用在类、字段和方法上,以自动生成常见的代码,如getter和setter方法、构造函数、equals
和hashCode
方法等。这样,开发者就不需要手动编写这些重复性的代码,从而提高了开发效率。例如:
- @Getter 和 @Setter:用于自动生成getter和setter方法。
- @NoArgsConstructor, @RequiredArgsConstructor 和 @AllArgsConstructor:用于生成构造函数。
- @Data:是一个方便的注解,包含了getter、setter、equals、hashCode和toString方法。
- @ToString:用于自动生成
toString
方法。 - @EqualsAndHashCode:用于自动生成
equals
和hashCode
方法。
值得一提的是,Lombok的使用需要在开发环境中安装对应的插件,如IntelliJ IDEA中的Lombok插件,以确保编辑器能够识别Lombok注解并正确地处理代码。
在pom.xml文件中引入依赖
<!-- 在springboot的父工程中,已经集成了lombok并指定了版本号,故当前引入依赖时不需要指定version -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
添加注释
import lombok.Data;
@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
CRUD
以下是使用Mybatis实现增删改查的示例代码:
- 创建数据库表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 创建User实体类
public class User {
private Integer id;
private String name;
private Integer age;
// getter和setter方法省略
}
- 创建UserMapper接口
import org.apache.ibatis.annotations.*;
@Mapper
public interface UserMapper {
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(User user);
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteById(Integer id);
@Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
int update(User user);
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Integer id);
@Select("SELECT * FROM user")
List<User> selectAll();
}
- 在Mybatis配置文件中添加mapper映射
<configuration>
<!-- ... -->
<mappers>
<mapper class="com.example.mapper.UserMapper"/>
</mappers>
</configuration>
- 测试增删改查操作
public class MybatisDemo {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 插入用户
User user = new User();
user.setName("张三");
user.setAge(20);
userMapper.insert(user);
System.out.println("插入用户:" + user.getId());
// 查询用户
User selectedUser = userMapper.selectById(user.getId());
System.out.println("查询用户:" + selectedUser);
// 更新用户
selectedUser.setName("李四");
selectedUser.setAge(25);
userMapper.update(selectedUser);
System.out.println("更新用户:" + selectedUser);
// 删除用户
userMapper.deleteById(selectedUser.getId());
System.out.println("删除用户:" + selectedUser.getId());
} finally {
sqlSession.close();
}
}
}
xml文件映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
namespace需要mapper接口的全类名
Mybatis动态SQL
基本动态SQL
Mybatis动态SQL是指在XML映射文件中使用动态SQL语句,根据不同的条件生成不同的SQL语句。Mybatis提供了多种动态SQL元素,可以根据需要灵活地构建SQL语句。
以下是一个简单的示例:
UserMapper.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="com.example.mapper.UserMapper">
<select id="selectUsers" parameterType="map" resultType="com.example.entity.User">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
</mapper>
在这个示例中,我们使用了和元素来构建动态的WHERE子句。当传入的参数中name和age不为空时,会生成相应的条件。这样可以根据不同的查询条件生成不同的SQL语句,提高代码的复用性和灵活性。
动态SQL-sql&include
动态SQL中的和元素可以用来复用相同的SQL片段,提高代码的可维护性和可读性。
元素用于定义可重用的SQL片段,可以在多个地方引用。例如:
UserMapper.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="com.example.mapper.UserMapper">
<sql id="userColumns">id, name, age</sql>
<select id="selectUsers" resultType="com.example.entity.User">
SELECT <include refid="userColumns"/> FROM user
</select>
</mapper>
在这个示例中,我们使用元素定义了一个名为userColumns的SQL片段,包含了查询用户所需的列名。然后在元素中使用元素引用了这个SQL片段,实现了代码的复用。
动态SQL-foreach
动态SQL中的元素可以用来遍历集合,生成多个相同的SQL片段。例如:
UserMapper.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="com.example.mapper.UserMapper">
<select id="selectUsersByIds" parameterType="list" resultType="com.example.entity.User">
SELECT * FROM user WHERE id IN
<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>
在这个示例中,我们使用元素遍历传入的id列表,生成一个IN子句,用于查询指定id的用户。其中,item属性表示集合中的每个元素,index属性表示元素的索引,collection属性表示要遍历的集合,open和close属性表示生成的SQL片段的开始和结束标记,separator属性表示元素之间的分隔符。