优秀的持久层框架
MyBatis 是一款优秀的持久层框架,支持自定义 SQL、存储过程和高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。
MyBatis 更灵活,适合复杂 SQL;Hibernate 更自动化,适合标准 CRUD。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency><!-- mybatis-config.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//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/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- 映射器 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>public class User {
private Long id;
private String username;
private String email;
private Integer age;
// getter/setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}public interface UserMapper {
User findById(Long id);
List<User> findAll();
int insert(User user);
int update(User user);
int delete(Long id);
}<!-- 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="findById" resultType="com.example.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.example.entity.User">
SELECT * FROM users
</select>
<!-- 插入用户 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(username, email, age)
VALUES(#{username}, #{email}, #{age})
</insert>
<!-- 更新用户 -->
<update id="update">
UPDATE users
SET username = #{username}, email = #{email}, age = #{age}
WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="delete">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>public class MyBatisDemo {
public static void main(String[] args) throws IOException {
// 读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// 获取 SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 获取 Mapper
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询用户
User user = mapper.findById(1L);
System.out.println(user.getUsername());
// 插入用户
User newUser = new User();
newUser.setUsername("张三");
newUser.setEmail("zhangsan@example.com");
newUser.setAge(25);
mapper.insert(newUser);
// 提交事务
session.commit();
}
}
}除了 XML,MyBatis 也支持注解方式。
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
@Select("SELECT * FROM users")
List<User> findAll();
@Insert("INSERT INTO users(username, email, age) VALUES(#{username}, #{email}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE users SET username=#{username}, email=#{email}, age=#{age} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
int delete(Long id);
}