在此示例中,您将看到如何使用MyBatis创建或定义数据映射器。映射器将把我们的应用程序与存储数据的基础数据库进行通信。MyBatis数据映射器定义为一个interface对象。我们可以使用注释或xml映射器来定义数据库查询。
在第一步中,我们将创建一个域对象,这是一个简单的pojo,用于将数据存储在对象世界中。pojo的属性/字段类似于records数据库中表的结构。
package org.nhooo.example.mybatis.domain; import java.io.Serializable; import java.util.Date; public class Record implements Serializable { private Long id; private String title; private Date releaseDate; private Long artistId; private Long labelId; // Getters & Setters @Override public String toString() { return "Record{" + "id=" + id + ", title='" + title + '\'' + ", releaseDate=" + releaseDate + ", artistId=" + artistId + ", labelId=" + labelId + '}'; } }
接下来,我们定义映射器interface代码,我们将创建一个RecordMapper.java文件,该文件包含一种从表中获取数据的方法。这时interface将如下所示:
package org.nhooo.example.mybatis.persistence; import org.nhooo.example.mybatis.domain.Record; public interface RecordMapper { /** * Get a single Record from the database based on the record * identified. * * @param id record identifier. * @return a record object. */ Record getRecord(Long id); }
创建ResultMapper.java接口后,我们创建一个RecordMapper.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.nhooo.example.mybatis.persistence.RecordMapper"> <resultMap id="recordResultMap" type="record"> <result column="release_date" property="releaseDate"/> <result column="artist_id" property="artistId"/> <result column="label_id" property="labelId"/> </resultMap> <select id="getRecord" parameterType="java.lang.Long" resultMap="recordResultMap"> SELECT id, title, release_date, artist_id, label_id FROM records WHERE id = #{id} </select> </mapper>
要告诉MyBatis我们的映射器,我们需要在MyBatis配置文件(resources/configuration.xml)中定义映射器。我们将映射器注册在<mappers>配置文件的元素内。
<?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> <typeAliases> <typeAlias alias="record" type="org.nhooo.example.mybatis.domain.Record"/> </typeAliases> <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/musicdb"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/nhooo/example/mybatis/mapper/RecordMapper.xml"/> </mappers> </configuration>
最后,我们创建一个简单的应用程序,以使用数据映射器从数据库中获取记录数据。
package org.nhooo.example.mybatis; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.nhooo.example.mybatis.domain.Record; import org.nhooo.example.mybatis.persistence.RecordMapper; import java.io.Reader; public class MusicClient { public static void main(String[] args) throws Exception { Reader reader = Resources.getResourceAsReader("configuration.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(reader); SqlSession session = factory.openSession(); try { RecordMapper mapper = session.getMapper(RecordMapper.class); Record record = mapper.getRecord(1L); System.out.println("Record = " + record); } finally { session.close(); } } }
Maven依赖
<dependencies> <!--https://search.maven.org/remotecontent?filepath=org/mybatis/mybatis/3.5.0/mybatis-3.5.0.jar--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.0</version> </dependency> <!--https://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-dbcp2/2.5.0/commons-dbcp2-2.5.0.jar--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.5.0</version> </dependency> </dependencies>