Java Mybatis架构设计深入了解
介绍
MyBatis是一种优秀的基于Java的ORM(对象关系映射)框架,具有易于使用、灵活性和高效性等优点。在Java开发中,MyBatis取代了早期的JDBC编程方式,为Java开发者提供了一个更加优雅的解决ORM的方式。
在使用MyBatis时,你需要了解它的架构设计,以便更好地使用和优化你的代码。
MyBatis架构设计
MyBatis的整体架构如下所示:
+----------------------+
| Application |
+----------------------+
| Mapper |
+----------------------+
| SqlSessionFactory|
+----------------------+
| DataSource |
+----------------------+
从上图可以看出,MyBatis的架构分为四个等级:
- 应用程序层:即我们开发的业务逻辑。
- Mapper接口层:该接口定义了SQL语句并将它们与Java接口方法绑定,方便我们调用这个接口时自动生成SQL语句并执行,从而简化了我们的数据访问代码的编写。
- SqlSessionFactory层:这是MyBatis的核心层,主要作用是创建SqlSession对象和管理Mapper接口,同时也负责整个MyBatis框架的启动和关闭。
- 数据源层:这层主要提供JDBC的数据源,MyBatis不负责数据源的管理,数据源的配置也不在MyBatis中进行。
示例
示例1:MyBatis和Spring集成
这个示例我们将介绍如何使用MyBatis和Spring框架进行整合,创建一个简单的Java Web应用程序,我们将使用Spring MVC架构进行开发。
- 首先需要在Maven中添加以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.3</version>
</dependency>
- 创建数据库表和实体类
我们在MySQL数据库中创建一个user
表,然后创建一个对应的Java实体类:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
public class User {
private int id;
private String name;
private int age;
private String address;
// getters and setters
}
- 创建Mapper接口
我们需要创建一个Mapper接口,其中定义了对user
表的CRUD操作:
public interface UserMapper {
List<User> findAll();
User findById(int id);
void addUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
在Mapper接口中,我们使用了注解方式来定义SQL语句(例如@Select、@Update等),Mybatis在运行时自动将这些SQL语句转换为数据库操作命令。
- 创建Mapper XML文件
为了提高SQL语句的可维护性和可重用性,我们可以将SQL语句定义为独立的XML文件,这样我们可以使用诸如条件判断、循环等元素来组装动态SQL查询语句。下面是一个Mapper 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.dao.UserMapper">
<resultMap id="userMap" type="com.example.entity.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
</resultMap>
<select id="findAll" resultMap="userMap">
select * from user
</select>
<select id="findById" parameterType="int" resultMap="userMap">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="com.example.entity.User">
insert into user(name, age, address) values(#{name}, #{age}, #{address})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
update user set name=#{name}, age=#{age}, address=#{address} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
在XML文件中我们使用了<resultMap>
标签来定义结果集的映射关系,也使用了<select>
、<insert>
、<update>
、<delete>
标签来定义对应的SQL执行语句,这样可以使我们更灵活的定义SQL操作。
- 创建SqlSessionFactory
在MyBatis中,SqlSessionFactory是创建SqlSession的工厂类,在Spring中我们可以使用SqlSessionFactoryBean
来定义一个SqlSessionFactory实例。
@Configuration
@MapperScan("com.example.dao")
public class MybatisConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource("jdbc:mysql://localhost:3306/test", "root", "123456");
}
@Bean
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:com/example/dao/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
在上面的示例中,我们使用@MapperScan
注解来指定Mapper接口所在的包路径,并使用SqlSessionFactoryBean
创建SqlSessionFactory实例。
- 使用Mapper接口
我们已经定义了Mapper接口和对应的SQL语句,现在需要使用这些接口来进行数据持久化操作。在Spring中我们可以使用@Autowired
注解将Mapper接口注入到Spring框架中,然后进行调用。
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/users")
public List<User> listUsers() {
return userMapper.findAll();
}
@GetMapping("/user/{id}")
public User getUser(@PathVariable int id) {
return userMapper.findById(id);
}
@PostMapping("/users")
public String addUser(@RequestBody User user) {
userMapper.addUser(user);
return "success";
}
@PutMapping("/users")
public String updateUser(@RequestBody User user) {
userMapper.updateUser(user);
return "success";
}
@DeleteMapping("/user/{id}")
public String deleteUser(@PathVariable int id) {
userMapper.deleteUser(id);
return "success";
}
}
示例2:MyBatis动态SQL
MyBatis的Mapper XML文件提供了SQL语句的定义,在该文件中我们可以使用多种方式来定义动态SQL查询语句,使得这些SQL查询语句在运行时可以根据参数值进行灵活的拼装。
下面是一个示例,我们使用了if和where元素,输入用户名和年龄查询符合条件的用户:
<select id="findUserByAgeAndName" resultType="hashmap">
select * from user where 1=1
<if test="name != null">
and name=#{name}
</if>
<if test="age != null">
and age=#{age}
</if>
</select>
在这个示例中,我们首先使用了<if>
元素来判断这个查询语句何时应该增加一个where条件部分,如果用户名不为空,则增加一个名字的查询条件;如果年龄不为空,则也增加一个年龄的查询条件。
总结:
本文详细解释了MyBatis的架构设计并给出了两个示例,其中第一个示例是MyBatis和Spring进行整合,第二个示例是使用MyBatis的动态SQL查询语句。通过学习这些内容,相信读者可以更好的使用并优化自己的代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Mybatis架构设计深入了解 - Python技术站