MyBatis入門學習教程 MyBatis快速入門1-8(2)

上一章http://my.oschina.net/u/2608629/admin/edit-blog?blog=715422java

上一篇MyBatis學習總結(一)——MyBatis快速入門中咱們講了如何使用Mybatis查詢users表中的數據,算是對MyBatis有一個初步的入門了,今天講解一下如何使用MyBatis對users表執行CRUD操做。本文中使用到的測試環境是上一篇博文中的測試環境。mysql

1、使用MyBatis對錶執行CRUD操做——基於XML的實現sql

一、定義sql映射xml文件數據庫

  userMapper.xml文件的內容以下:apache

<?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,namespace的值習慣上設置成包名+sql映射文件名,這樣就可以保證namespace的值是惟一的
例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除後綴)
 -->
<mapper namespace="me.gacl.mapping.userMapper">
   <!-- 在select標籤中編寫查詢的SQL語句, 設置select標籤的id屬性爲getUser,id屬性值必須是惟一的,不可以重複
   使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型
   resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的對象返回
   User類就是users表所對應的實體類
   -->
   <!-- 
       根據id查詢獲得一個user對象
     -->
   <select id="getUser" parameterType="int" 
       resultType="me.gacl.domain.User">
       select * from users where id=#{id}
   </select>
   
   <!-- 建立用戶(Create) -->
   <insert id="addUser" parameterType="me.gacl.domain.User">
       insert into users(name,age) values(#{name},#{age})
   </insert>
   
   <!-- 刪除用戶(Remove) -->
   <delete id="deleteUser" parameterType="int">
       delete from users where id=#{id}
   </delete>
   
   <!-- 修改用戶(Update) -->
   <update id="updateUser" parameterType="me.gacl.domain.User">
       update users set name=#{name},age=#{age} where id=#{id}
   </update>
   
   <!-- 查詢所有用戶-->
   <select id="getAllUsers" resultType="me.gacl.domain.User">
       select * from users
   </select>
   
</mapper>

 

  單元測試類代碼以下:session

package me.gacl.test;

import java.util.List;
import me.gacl.domain.User;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class TestCRUDByXmlMapper {

   @Test
   public void testAdd(){
       //SqlSession sqlSession = MyBatisUtil.getSqlSession(false);
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       /**
         * 映射sql的標識字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標籤的namespace屬性的值,
         * addUser是insert標籤的id屬性值,經過insert標籤的id屬性值就能夠找到要執行的SQL
         */
       String statement = "me.gacl.mapping.userMapper.addUser";//映射sql的標識字符串
       User user = new User();
       user.setName("用戶孤傲蒼狼");
       user.setAge(20);
       //執行插入操做
       int retResult = sqlSession.insert(statement,user);
       //手動提交事務
       //sqlSession.commit();
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(retResult);
   }
   
   @Test
   public void testUpdate(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       /**
         * 映射sql的標識字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標籤的namespace屬性的值,
         * updateUser是update標籤的id屬性值,經過update標籤的id屬性值就能夠找到要執行的SQL
         */
       String statement = "me.gacl.mapping.userMapper.updateUser";//映射sql的標識字符串
       User user = new User();
       user.setId(3);
       user.setName("孤傲蒼狼");
       user.setAge(25);
       //執行修改操做
       int retResult = sqlSession.update(statement,user);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(retResult);
   }
   
   @Test
   public void testDelete(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       /**
         * 映射sql的標識字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標籤的namespace屬性的值,
         * deleteUser是delete標籤的id屬性值,經過delete標籤的id屬性值就能夠找到要執行的SQL
         */
       String statement = "me.gacl.mapping.userMapper.deleteUser";//映射sql的標識字符串
       //執行刪除操做
       int retResult = sqlSession.delete(statement,5);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(retResult);
   }
   
   @Test
   public void testGetAll(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession();
       /**
         * 映射sql的標識字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標籤的namespace屬性的值,
         * getAllUsers是select標籤的id屬性值,經過select標籤的id屬性值就能夠找到要執行的SQL
         */
       String statement = "me.gacl.mapping.userMapper.getAllUsers";//映射sql的標識字符串
       //執行查詢操做,將查詢結果自動封裝成List<User>返回
       List<User> lstUsers = sqlSession.selectList(statement);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(lstUsers);
   }
}

 

2、使用MyBatis對錶執行CRUD操做——基於註解的實現mybatis

  一、定義sql映射的接口app

  UserMapperI接口的代碼以下:dom

package me.gacl.mapping;

import java.util.List;
import me.gacl.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

/**
 * @author gacl
 * 定義sql映射的接口,使用註解指明方法要執行的SQL
 */
public interface UserMapperI {

   //使用@Insert註解指明add方法要執行的SQL
   @Insert("insert into users(name, age) values(#{name}, #{age})")
   public int add(User user);
   
   //使用@Delete註解指明deleteById方法要執行的SQL
   @Delete("delete from users where id=#{id}")
   public int deleteById(int id);
   
   //使用@Update註解指明update方法要執行的SQL
   @Update("update users set name=#{name},age=#{age} where id=#{id}")
   public int update(User user);
   
   //使用@Select註解指明getById方法要執行的SQL
   @Select("select * from users where id=#{id}")
   public User getById(int id);
   
   //使用@Select註解指明getAll方法要執行的SQL
   @Select("select * from users")
   public List<User> getAll();
}

 

  須要說明的是,咱們不須要針對UserMapperI接口去編寫具體的實現類代碼,這個具體的實現類由MyBatis幫咱們動態構建出來,咱們只須要直接拿來使用便可。工具

  二、在conf.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/mybatis" />
               <property name="username" value="root" />
               <property name="password" value="XDP" />
           </dataSource>
       </environment>
   </environments>
   
   <mappers>
       <!-- 註冊userMapper.xml文件, 
       userMapper.xml位於me.gacl.mapping這個包下,因此resource寫成me/gacl/mapping/userMapper.xml-->
       <mapper resource="me/gacl/mapping/userMapper.xml"/>
       <!-- 註冊UserMapper映射接口-->
       <mapper class="me.gacl.mapping.UserMapperI"/>
   </mappers>
   
</configuration>

 

  單元測試類的代碼以下:

package me.gacl.test;

import java.util.List;
import me.gacl.domain.User;
import me.gacl.mapping.UserMapperI;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class TestCRUDByAnnotationMapper {

   @Test
   public void testAdd(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       //獲得UserMapperI接口的實現類對象,UserMapperI接口的實現類對象由sqlSession.getMapper(UserMapperI.class)動態構建出來
       UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
       User user = new User();
       user.setName("用戶xdp");
       user.setAge(20);
       int add = mapper.add(user);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(add);
   }
   
   @Test
   public void testUpdate(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       //獲得UserMapperI接口的實現類對象,UserMapperI接口的實現類對象由sqlSession.getMapper(UserMapperI.class)動態構建出來
       UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
       User user = new User();
       user.setId(3);
       user.setName("孤傲蒼狼_xdp");
       user.setAge(26);
       //執行修改操做
       int retResult = mapper.update(user);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(retResult);
   }
   
   @Test
   public void testDelete(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
       //獲得UserMapperI接口的實現類對象,UserMapperI接口的實現類對象由sqlSession.getMapper(UserMapperI.class)動態構建出來
       UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
       //執行刪除操做
       int retResult = mapper.deleteById(7);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(retResult);
   }
   
   @Test
   public void testGetUser(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession();
       //獲得UserMapperI接口的實現類對象,UserMapperI接口的實現類對象由sqlSession.getMapper(UserMapperI.class)動態構建出來
       UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
       //執行查詢操做,將查詢結果自動封裝成User返回
       User user = mapper.getById(8);
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(user);
   }
   
   @Test
   public void testGetAll(){
       SqlSession sqlSession = MyBatisUtil.getSqlSession();
       //獲得UserMapperI接口的實現類對象,UserMapperI接口的實現類對象由sqlSession.getMapper(UserMapperI.class)動態構建出來
       UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
       //執行查詢操做,將查詢結果自動封裝成List<User>返回
       List<User> lstUsers = mapper.getAll();
       //使用SqlSession執行完SQL以後須要關閉SqlSession
       sqlSession.close();
       System.out.println(lstUsers);
   }
}

 

  用到的MyBatisUtil工具類代碼以下:

package me.gacl.util;

import java.io.InputStream;

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

public class MyBatisUtil {

   /**
     * 獲取SqlSessionFactory
     * @return SqlSessionFactory
     */
   public static SqlSessionFactory getSqlSessionFactory() {
       String resource = "conf.xml";
       InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
       SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
       return factory;
   }
   
   /**
     * 獲取SqlSession
     * @return SqlSession
     */
   public static SqlSession getSqlSession() {
       return getSqlSessionFactory().openSession();
   }
   
   /**
     * 獲取SqlSession
     * @param isAutoCommit 
     *        true 表示建立的SqlSession對象在執行完SQL以後會自動提交事務
     *        false 表示建立的SqlSession對象在執行完SQL以後不會自動提交事務,這時就須要咱們手動調用sqlSession.commit()提交事務
     * @return SqlSession
     */
   public static SqlSession getSqlSession(boolean isAutoCommit) {
       return getSqlSessionFactory().openSession(isAutoCommit);
   }
}

 

   以上的相關代碼是所有測試經過的,關於使用MyBatis對錶執行CRUD操做的內容就這麼多。

相關文章
相關標籤/搜索