1. 環境準備
-
添加依賴(Maven)
在?pom.xml
?中添加 MyBatis 和數據庫驅動依賴:<dependencies><!-- MyBatis 核心庫 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- MySQL 驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency> </dependencies>
? ? ? 2.創建數據庫表
? ? ? ? 示例用戶表?user
:?
CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,email VARCHAR(100)
);
2. 配置文件
? mybatis-config.xml
? ? ? 配置數據源、事務管理器和映射文件路徑:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
3. 實體類和Mapper接口
-
實體類?
User.java
public class User {private Integer id;private String name;private Integer age;private String email;// Getter和Setter方法省略 }
? ? ? 2.Mapper接口?UserMapper.java
?
public interface UserMapper {User selectUserById(Integer id);void insertUser(User user);void updateUser(User user);void deleteUser(Integer id);List<User> selectUsersByCondition(User user);
}
4. XML映射文件
? UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 結果映射 --><resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><result property="email" column="email"/></resultMap><!-- 查詢用戶 --><select id="selectUserById" resultMap="userResultMap">SELECT * FROM user WHERE id = #{id}</select><!-- 插入用戶 --><insert id="insertUser" parameterType="User">INSERT INTO user (name, age, email)VALUES (#{name}, #{age}, #{email})</insert><!-- 更新用戶 --><update id="updateUser" parameterType="User">UPDATE userSET name = #{name}, age = #{age}, email = #{email}WHERE id = #{id}</update><!-- 刪除用戶 --><delete id="deleteUser">DELETE FROM user WHERE id = #{id}</delete><!-- 動態SQL查詢 --><select id="selectUsersByCondition" resultMap="userResultMap">SELECT * FROM user<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null">AND age = #{age}</if></where></select>
</mapper>
5. 使用MyBatis API執行操作
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.util.List;public class MyBatisDemo {public static void main(String[] args) throws Exception {// 加載配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 獲取SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 獲取Mapper接口實例UserMapper mapper = session.getMapper(UserMapper.class);// 插入用戶User newUser = new User();newUser.setName("張三");newUser.setAge(25);newUser.setEmail("zhangsan@example.com");mapper.insertUser(newUser);session.commit(); // 提交事務// 查詢用戶User user = mapper.selectUserById(1);System.out.println("查詢結果:" + user);// 動態查詢User condition = new User();condition.setName("張");List<User> users = mapper.selectUsersByCondition(condition);System.out.println("動態查詢結果:" + users);// 更新用戶user.setEmail("new_email@example.com");mapper.updateUser(user);session.commit();// 刪除用戶mapper.deleteUser(2);session.commit();}}
}
6. 動態SQL示例解析
-
<where>
?標簽:自動處理條件前的?AND
?或?OR
,避免語法錯誤。 -
<if>
?標簽:根據條件動態拼接 SQL 片段。<select id="selectUsersByCondition" resultMap="userResultMap">SELECT * FROM user<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null">AND age = #{age}</if></where> </select>
7. 緩存配置
-
開啟二級緩存
在?UserMapper.xml
?中添加?<cache/>
?標簽:<mapper namespace="com.example.mapper.UserMapper"><cache/><!-- 其他SQL配置 --> </mapper>
? ? 2.實體類序列化
? ? ? ?確保?User
?類實現?Serializable
?接口:?
public class User implements Serializable {// 屬性和方法
}
8. 與Spring集成
-
添加MyBatis-Spring依賴
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency>
? ? ?2.配置數據源
? ? ? ?在?application.properties
?中配置:?
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
? ? ?3.Mapper掃描
? ? ? ? 在啟動類添加?@MapperScan
:
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
9. 常見問題解決
? ? 1.SQL注入風險
-
使用?
#{}
?占位符代替字符串拼接(${}
)。
? ? 2.字段名與屬性名不一致
-
使用?
<resultMap>
?顯式映射字段和屬性。
? ?3.事務管理
-
在需要事務的方法上添加?
@Transactional
?注解。
總結
通過以上步驟,可以掌握MyBatis的基本使用,包括配置、CRUD操作、動態SQL、緩存及與Spring集成。實際開發中應結合具體需求,合理利用MyBatis的靈活性和強大功能,提升數據庫操作效率和代碼可維護性。