Mybatis是一個著名的輕量級持久層框架。
在這篇文章中,使用Mybatis框架,實現一個簡單的查詢事例。後面的文章中會再詳細介紹其他用法。
首先,需要導入一些使用的jar,包括:mybatis、commons-logging、mysql-connector-java、log4j等。
在pom.xml中添加dependencies(上邊幾個項目的依賴):
<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.vip</groupId> <artifactId>commons-testing</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>commons-testing</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
新建一張表dq_user:
CREATE TABLE `dq_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id', `OA_ID` varchar(100) DEFAULT '' COMMENT '用戶OA登錄ID', `NAME` varchar(60) NOT NULL DEFAULT '' COMMENT '用戶名稱', `EMAIL` varchar(60) NOT NULL DEFAULT '' COMMENT '郵件地址', `PHONE` varchar(60) NOT NULL DEFAULT '' COMMENT '手機號碼', `CREATE_TIME` timestamp NOT NULL DEFAULT '1980-01-01 00:00:00' COMMENT '創建時間', `UPDATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', `IS_DELETED` tinyint(4) NOT NULL DEFAULT '0' COMMENT '刪除標識:0默認,1刪除', `IS_ADMIN` tinyint(4) NOT NULL DEFAULT '0' COMMENT '管理員標識:0默認,1管理員', `IS_ADMIN1` tinyint(4) NOT NULL DEFAULT '0' COMMENT '管理員標識:0默認,1管理員', `WEIXIN` varchar(64) NOT NULL DEFAULT '', PRIMARY KEY (`USER_ID`) ) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COMMENT='用戶表';
建一個和表對應的java bean類,根據反射機制,調用set方法來給對象賦值,所以,要保證屬性名稱和表的列字段都相符。同時,生成對應的getter方法、setter方法,並重寫toString()。
DqUser.java
import java.sql.Timestamp; public class DqUser { //根據反射機制,調用set方法來給對象賦值。 private int user_id; private String oa_id; private String name; private String email; private String phone; private Timestamp create_time; private Timestamp update_time; private int is_deleted; private int is_admin; private int is_admin1; private String weixin; public int getUser_id() { return user_id; } public void setUser_id(int user_id) { this.user_id = user_id; } public String getOa_id() { return oa_id; } public void setOa_id(String oa_id) { this.oa_id = oa_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Timestamp getCreate_time() { return create_time; } public void setCreate_time(Timestamp create_time) { this.create_time = create_time; } public Timestamp getUpdate_time() { return update_time; } public void setUpdate_time(Timestamp update_time) { this.update_time = update_time; } public int getIs_deleted() { return is_deleted; } public void setIs_deleted(int is_deleted) { this.is_deleted = is_deleted; } public int getIs_admin() { return is_admin; } public void setIs_admin(int is_admin) { this.is_admin = is_admin; } public int getIs_admin1() { return is_admin1; } public void setIs_admin1(int is_admin1) { this.is_admin1 = is_admin1; } public String getWeixin() { return weixin; } public void setWeixin(String weixin) { this.weixin = weixin; } @Override public String toString() { return "DqUser [user_id=" + user_id + ", oa_id=" + oa_id + ", name=" + name + ", email=" + email + ", phone=" + phone + ", create_time=" + create_time + ", update_time=" + update_time + ", is_deleted=" + is_deleted + ", is_admin=" + is_admin + ", is_admin1=" + is_admin1 + ", weixin=" + weixin + "]"; } }
建立一個配置文件,在這裏實現2個功能:配置數據源、註冊表的配置文件(xml)。按照規範,命名爲sqlMapConfig.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"> <!-- 在實際項目中,數據庫環境配置,如果和spring整合,就不需要配置,交給spring處理 --> <transactionManager type="JDBC"/> <!-- 事務管理器 --> <dataSource type="POOLED"> <!-- 連接數據庫類型:連接池 、非連接池連接--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://10.199.242.160:3306/vip_ds"/> <property name="username" value="ds"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <!-- 每張表的映射文件,管理每張表的映射文件。 規範:按照表名的駝峯模式,最後加個Mapper --> <!-- resource 引入映射文件,包分割使用/而不是. --> <mappers> <mapper resource="com/vip/mapping/DqUserMapper.xml"/> </mappers> </configuration>
該配置文件需要放置在classpath下,下圖是我的工程的目錄結構,當然也可以做相應調整:
下面是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.vip.mapping.DsqlUserMapper"> <select id="selectUser" parameterType="java.lang.Integer" resultType="com.vip.model.DqUser"> select * from dq_user where user_id = #{id} </select> </mapper>
測試類AppTest.java:
package com.vip.commons_testing; import static org.junit.Assert.*; import java.io.IOException; import java.io.InputStream; 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.junit.Before; import org.junit.Test; import com.vip.model.DqUser; public class AppTest { SqlSessionFactory sqlSessionFactory; @Before public void before() throws IOException { InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } @Test public void test() { SqlSession sqlsession = sqlSessionFactory.openSession(); //第一個參數找到執行的SQL,命名空間.sqlid 第二個參數 DqUser du = sqlsession.selectOne("com.vip.mapping.DsqlUserMapper.selectUser", 80); System.out.println(du); sqlsession.close(); } }
執行結果:
DqUser [user_id=80, oa_id=ere, name=ee, [email protected], phone=wr, create_time=2016-05-10 10:11:32.0, update_time=2016-06-01 11:21:59.0, is_deleted=1, is_admin=0, is_admin1=0, weixin=]