MyBatis是一款优秀的持久层框架,它消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis入门基础
1. MyBatis核心组件
- SqlSessionFactory:MyBatis的核心接口,负责创建SqlSession对象。
- SqlSession:用于执行SQL语句和事务管理。
- Executor:MyBatis的核心执行器,负责执行SQL语句。
- Mapper:接口,用于定义SQL操作。
- SqlSource:SQL来源,用于提供SQL语句。
- BoundSql:用于绑定SQL参数。
2. MyBatis的配置
- XML配置:通过XML文件来配置MyBatis的映射关系和SQL语句。
- 注解配置:通过注解来配置SQL语句和映射关系。
3. MyBatis的基本使用
创建SqlSessionFactory:
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);创建SqlSession:
SqlSession session = sqlSessionFactory.openSession();执行SQL:
User user = (User) session.selectOne("com.mybatis.example.UserMapper.selectById", 1);提交事务:
session.commit();关闭SqlSession:
session.close();
MyBatis高级特性
1. 动态SQL
MyBatis支持动态SQL,可以动态地构造SQL语句。常用的动态SQL包括if、choose、when、otherwise、trim、where、set等。
2. 延迟加载
MyBatis支持延迟加载,可以减少数据库访问次数,提高性能。
3. 缓存
MyBatis支持一级缓存和二级缓存,可以减少数据库访问次数,提高性能。
4. 批处理
MyBatis支持批处理,可以减少数据库访问次数,提高性能。
MyBatis实战案例解析
1. 案例一:CRUD操作
假设有一个User实体类,包含id、username和password三个属性。
User实体类:
public class User { private Integer id; private String username; private String password; // getter和setter方法 }UserMapper接口:
public interface UserMapper { User selectById(Integer id); Integer insert(User user); Integer update(User user); Integer delete(Integer id); }UserMapper.xml:
<mapper namespace="com.mybatis.example.UserMapper"> <resultMap id="userResultMap" type="com.mybatis.example.User"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="password" column="password" /> </resultMap> <select id="selectById" resultMap="userResultMap"> SELECT id, username, password FROM user WHERE id = #{id} </select> <insert id="insert" parameterType="com.mybatis.example.User"> INSERT INTO user(username, password) VALUES (#{username}, #{password}) </insert> <update id="update" parameterType="com.mybatis.example.User"> UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id} </update> <delete id="delete" parameterType="Integer"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
2. 案例二:多表关联查询
假设有两个实体类:User和Role,它们之间存在多对多关系。
User实体类:
public class User { private Integer id; private String username; private List<Role> roles; // getter和setter方法 }Role实体类:
public class Role { private Integer id; private String name; // getter和setter方法 }UserRoleMapper接口:
public interface UserRoleMapper { User selectUserById(Integer id); }UserRoleMapper.xml:
<mapper namespace="com.mybatis.example.UserRoleMapper"> <resultMap id="userResultMap" type="com.mybatis.example.User"> <id property="id" column="id" /> <result property="username" column="username" /> <collection property="roles" ofType="com.mybatis.example.Role"> <id property="id" column="role_id" /> <result property="name" column="role_name" /> </collection> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT u.id, u.username, r.id AS role_id, r.name AS role_name FROM user u LEFT JOIN user_role ur ON u.id = ur.user_id LEFT JOIN role r ON ur.role_id = r.id WHERE u.id = #{id} </select> </mapper>
通过以上案例,可以看出MyBatis在实际开发中的应用非常广泛,它可以大大提高开发效率,减少重复代码。希望本文能帮助你更好地理解MyBatis,将其应用于实际项目中。
