MyBatis
ORMapping: Object Relationship Mapping 对象关系映射
对象指⾯向对象
关系指关系型数据库
Java 到 MySQL 的映射,开发者可以以⾯向对象的思想来管理数据库。
如何使用:
- 新建 Maven ⼯程,pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 新建数据库
CREATE TABLE `user` (
`id` bigint(255) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- 新建表对应的实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String address;
}
- 创建mybatis的配置文件mybatis-config ,配置数据库基本信息
<?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>
<!-- 配置MyBatis运⾏环境 -->
<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/test1?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描包下的文件,所有的Mapper.xml-->
<package name="org.youyuan.mapper"/>
</mappers>
</configuration>
使用原生接口
- 新建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="org.youyuan.mapper.UserMapper">
<select id="getAllUsers" resultType="org.youyuan.bean.User">
select * from user where id= #{id};
</select>
</mapper>
测试:
/********************************使⽤原⽣接⼝*******************************/
@org.junit.Test
public void test(){
//读取配置文件
InputStream resourceAsStream = new Test().getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
//加载配置文件,创建SqlSessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
User user = (User) sqlSession.selectOne("org.youyuan.mapper.UserMapper.getAllUsers", 1L);
sqlSession.commit();
sqlSession.close();
System.out.println(user);
}
通过 Mapper 代理实现⾃定义接⼝
自定义接口UserMapper:
public interface UserMapper {
User getAllUsers(Long id);
}
在UserMapper的包下面新建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="org.youyuan.mapper.UserMapper">
<select id="getAllUsers" resultType="org.youyuan.bean.User">
select * from user where id= #{id};
</select>
</mapper>
其中的namespace为UserMapper的全路径(包名+类名),因为在项目当中会有很多的mapper,一个类对应一个mapper,一是为了避免方法冲突,也为了便于管理,每一个Mapper都有自己的命名空间,而且这个命名空间不可以重复。
注意,在 Maven 中,默认情况下,Maven 要求我们将 XML 配置、properties 配置等,都放在 resources 目录下,如果我们强行放在 java 目录下,默认情况下,打包的时候这个配置文件会被自动忽略掉。对于这两个问题,我们有两种解决办法:
- 们可以在 pom.xml 中,添加如下配置,让 Maven 不要忽略我在 java 目录下的 XML 配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
- 在 resources 目录下,创建一个和 UserMapper 接口相同的目录:
测试:
public class Test {
private SqlSession sqlSession;
private UserMapper userMapper;
@Before
public void before(){
//读取配置文件
InputStream resourceAsStream = new Test().getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
//加载配置文件,创建SqlSessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
/*一个 SqlSession 就相当于是我们的一个会话
*类似于 JDBC 中的一个连接
*/
this.sqlSession = build.openSession();
//获取实现接口的代理对象,spring通过class获取bean
this.userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void after(){
sqlSession.commit();
sqlSession.close();
}
/***********************通过 Mapper 代理实现⾃定义接⼝**************************/
@org.junit.Test
public void test1(){
User allUsers = userMapper.getAllUsers(1L);
System.out.println(allUsers);
}
}