(三)mybatis之通过接口加载映射配置文件
1.1 需求
- 通过(二)在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件
- 以前的做法:
- 改进做法:使用 mapper 接口来加载映射文件
1.2.2 引包
- 本例中使用maven构造项目,所以只需配置依赖即可引相应的包。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.shyrolk</groupId> <artifactId>firstMybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>firstMybatis</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> </dependencies> </project>
1.2 编写mybatis总配置文件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.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="" /> </dataSource> </environment> </environments> </configuration>
1.3 创建数据库和实体
1.3.1 创建数据库
1.3.2 创建实体对象
package com.shyroke.entity; public class User { private int id; private String userName; private String passWord; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } @Override public String toString() { return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + "]"; } }
1.4 定义UserMapper.java接口
-
在myabtis中的mapper接口相当于dao层,调用mapper接口的方法即可实现对数据库的增删改查操作。
package com.shyroke.mapper; import org.apache.ibatis.annotations.Param; import com.shyroke.entity.User; public interface UserMapper { public User findUserById(@Param("id")int id); }
1.5 编写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.shyroke.mapper.UserMapper"> <!-- 根据 id 查询 user 表中的数据 id:唯一标识符,此文件中的id值不能重复 resultType:返回值类型,一条数据库记录也就对应实体类的一个对象 parameterType:参数类型,也就是查询条件的类型 --> <select id="findUserById" resultType="com.shyroke.entity.User" parameterType="int"> <!-- 这里和普通的sql 查询语句差不多,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着 --> select * from user where id = #{id} </select> </mapper>
- <select>标签表示这是一条查询sql,id必须和UserMapper.java接口中的方法一致,这样当我们调用UserMapper.java接口中的方法时,通过namespace="com.shyroke.mapper.UserMapper" 将接口和配置文件联系在了一起。
-
UserMapper.xml和UserMapper.java两个文件的文件名要一致且要处于同一个目录。
1.6 加载UserMapper接口
- 在mybatis的总配置文件mybatis-config.xml中添加
<mappers> <mapper class="com.shyroke.mapper.UserMapper"/> </mappers>
1.7 测试
package com.shyrolk.firstMybatis; import java.awt.image.ImageProducer; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.shyroke.entity.User; import com.shyroke.mapper.UserMapper; /** * Hello world! * */ public class App { public static void main( String[] args ) { InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user= userMapper.findUserById(1); System.out.println(user); sqlSession.close(); } }
结果:
1.8 注意
- UserMapper 接口必须要和 UserMapper.xml 文件同名且在同一个包下,也就是说 UserMapper.xml 文件中的namespace是UserMapper接口的全类名
- UserMapper接口中的方法名和 UserMapper.xml 文件中定义的 id 一致
- UserMapper接口输入参数类型要和 UserMapper.xml 中定义的 parameterType 一致
- UserMapper接口返回数据类型要和 UserMapper.xml 中定义的 resultType 一致