Mybatis基本使用

過久沒用Mybatis了,基本都忘了,整理一下基本用法,其它高級的使用方法,用到的時候再看。 java

注意:本文代碼還未測試驗證。 mysql

1. Maven工程POM文件添加的依賴(JUNIT依賴未列出) git

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.2.2</version>
</dependency>

2. Mybatis三個必備元素和一個輔助元素 github

(1) Mybatis環境配置文件:主要設置鏈接數據庫所須要的信息(如:鏈接方式、驅動、數據庫URL、用戶名和密碼等),同時也放了一些其它的信息,方便開發;(對應Demo文件:mybatis-config.xml) sql

(2) SQL映射文件:主要存放本身編輯的SQL語句及一些表與類的映射關係;(對應Demo文件:UserMapper.xml) 數據庫

(3) 接口類:接口類的方法主要與SQL映射文件中對應ID的SQL語句進行映射(映射方式有兩種,具體在Demo後有說明),實如今調用接口類對應方法時,方法會調相應SQL語句,並根據配置返回相應結果;(對應Demo文件:UserDao.java) apache

(4) 接口實現類:這是一個輔助元素,主要是爲了自主地配置接口類中方法與SQL映射文件中SQL語句的映射關係。(對應Demo文件:UserDaoImpl.java) session

工程文件結構: mybatis

紅框部分爲本文內容相關的文件。 app

3. Demo代碼

(1) 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前面 -->
	<typeAliases>
		<typeAlias alias="User" type="tutorial.demo.database.User"/>
	</typeAliases>
	
	<!-- 若是沒有在調用的時候 沒有指定數據庫環境時,默認建立鏈接id=development數據庫環境的session -->
	<environments default="development">
		<!-- 開發環境數據  -->
		<environment id="development">
			<transactionManager type="jdbc"></transactionManager>
			<dataSource type="pooled">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/demo"/>
				<property name="username" value="root"/>
				<property name="password" value="cdyanfa"/>
			</dataSource>
		</environment>
		
		<!-- 生產環境數據  -->
		<environment id="product">
			<transactionManager type="jdbc"></transactionManager>
			<dataSource type="pooled">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/demo"/>
				<property name="username" value="root"/>
				<property name="password" value="cdyanfa"/>
			</dataSource>
		</environment>
		
		<!-- 備用環境數據  -->
		<environment id="other">
			<transactionManager type="jdbc"></transactionManager>
			<dataSource type="pooled">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://110.110.110.110:3306/demo"/>
				<property name="username" value="root"/>
				<property name="password" value="cdyanfa"/>
			</dataSource>
		</environment>
	</environments>

	<!-- SQL映射文件 -->
	<mappers>
		<mapper resource="resources/mybatis/UserMapper.xml"/>
	</mappers>
</configuration>
(2) 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="userDao">
	<!-- type映射的類名,id後面設置resultMap時用到,表示結果對應哪一個類型的映射關係 -->
	<!-- 注:若是表中列名與類的屬性名一致,且類按javaBean規範構造,映射關係可省略,具體緣由可參考java的反射原理 -->
	<resultMap type="User" id="UserMapper">
		<id column="id" property="userId" jdbcType="INTEGER"/>
		<result column="username" property="username" jdbcType="VARCHAR"/>
		<result column="password" property="password" jdbcType="VARCHAR"/>
	</resultMap>
	
	<select id="selectAllUser" resultMap="UserMapper">
		select * from user;
	</select>
	
	<select id="selectUserById" parameterType="int" resultMap="UserMapper">
		select * from user where id = #{userId, jdbcType=INTEGER} limit 0, 1;
	</select>
	
	<!-- useGeneratedKeys="true" keyProperty="id" 將生成的主鍵 值返回 -->
	<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
		insert into user(username, password) values(#{username, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR});
		<!-- 第二種返回主鍵的方式 -->
		<!--
		<selectKey resultType="long" order="AFTER" keyProperty="id" >  
			SELECT LAST_INSERT_ID()
        </selectKey>
        -->
	</insert>
	
	<update id="update" parameterType="User">
		update user
		<set>
			<if test="username != null">
				username = #{username,jdbcType=VARCHAR},
			</if>
			
			<if test="password != null">
				password = #{password,jdbcType=VARCHAR},
			</if>
		</set>
		where id = #{userId, jdbcType=INTEGER};
	</update>
	
	<delete id="delete" parameterType="int">
		delete from user where id = #{userId, jdbcType=INTEGER};
	</delete>
</mapper>
(3)  UserDao.java文件:

package tutorial.demo.database;

import java.util.List;

public interface UserDao {
	public long insert(User user);
	public long update(User user);
	public long delete(long userId);
	public List<User> selectAllUser();
	public User selectUserById(long userId);
}


(4) UserDaoImpl.java文件:

package tutorial.demo.database;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class UserDaoImpl implements UserDao {
	SqlSessionFactory factory = null;
	
	public UserDaoImpl() {
	}
	
	public UserDaoImpl(SqlSessionFactory factory) {
		this.factory = factory;
	}

	public SqlSessionFactory getFactory() {
		return factory;
	}

	public void setFactory(SqlSessionFactory factory) {
		this.factory = factory;
	}

	public long insert(User user) {
		SqlSession session = factory.openSession();
		
		session.insert("insert", user);
		
		return user.getUserId();
	}

	public long update(User user) {
		SqlSession session = factory.openSession();
		
		session.update("update", user);
		
		return user.getUserId();
	}

	public long delete(long userId) {
		SqlSession session = factory.openSession();
		
		session.delete("delete", userId);
		
		return userId;
	}

	public List<User> selectAllUser() {
		SqlSession session = factory.openSession();
		
		List<User> userList = session.selectList("selectAllUser");
		
		return userList;
	}

	public User selectUserById(long userId) {
		SqlSession session = factory.openSession();
		
		User user = session.selectOne("selectUserById", userId);
		
		return user;
	}

}
(5) MybatisTest.java文件(這個是一個基於JUNIT的測試類):

package tutorial.demo.database.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

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 tutorial.demo.database.User;
import tutorial.demo.database.UserDao;
import tutorial.demo.database.UserDaoImpl;

public class MybatisTest {
	SqlSessionFactory factory;

	// 在測試用例執行前執行
	@Before
	public void init() throws IOException {
		// 在使用數據時,加載數據配置文件,在需時與數據庫通訊時,根據配置建立會話。
        String resource = "classpath:resources/mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        factory = builder.build(reader);
	}
	
	// 直接使用接口的測試用例:由mybatis相關功能建立方法與對應SQL操做id的映射
	@Test
	public void testDao() {
		// 建立會話
		SqlSession session = factory.openSession();
		// 創建UserMapper.xml定義的SQL語句與UserDao接口中方法的映射關係
        UserDao userDao = session.getMapper(UserDao.class);
        
        User user = new User();
        user.setUserName("fengfeng");
        user.setPassword("123456");
        
        userDao.insert(user);
        // 輸出返回的用戶ID
        System.out.println("The user id is: " + user.getUserId());
	}
	
	// 使用接口實現的測試用例:開發人員自定義方法與SQL操做id的映射關係
	@Test
	public void testDaoImpl() {
		UserDao userDao = new UserDaoImpl(factory);
		
        User user = new User();
        user.setUserName("tiantian");
        user.setPassword("654321");
        
        userDao.insert(user);
        
        List<User> userList = userDao.selectAllUser();
        for (User u: userList) {
        	System.out.println(u.getUserId() + "\t\t" + u.getUserName() + "\t\t" + u.getPassword());
        }
	}
}

4. 說明

在上面的測試類中,咱們能夠看到有兩種方式的調用方式:使用接口類的調用方式和使用接口實現類的調用方式,其中,

(1) 接口類的調用方式

接口類的調用方式使用

UserDao userDao = session.getMapper(UserDao.class);
這一句使得接口類中的方法與SQL映射文件中 同名ID的SQL語句構成一個映射關係,當調用接口方法時,自動去執行相應的SQL語句,SQL語句執行結果以接口返回類型返回。

(2) 接口實現類的調用方式

對使用接口實現類調用方式中,咱們沒有使用到上述的方法,由於在實現類中,咱們已經在方法實現裏映射的SQL語句,因此再也不須要調用SqlSession.getMapper()進行映射。

官方文檔:http://mybatis.github.io/mybatis-3/

相關文章
相關標籤/搜索