mybatis入門配置和調試


歡迎轉載http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的時候有圖片半邊遮擋起來的話,右鍵查看圖片,就可以觀看完整的圖片,具體怎么 回事也不知道,大概是排版的問題吧。

一:Mybatis簡介

1.名稱由來

Mybatis原名叫ibatis.Mybatis一開始屬於Apache,2010年從Apache轉移到了GoogleCode這個組織中.

2.Mybatis概念

Mybatis是一種基於ORM模式的,作用於Dao層的輕量級框架.和Hibernate類似,也支持各種SQL語句,也支持存儲過程和高級映射等操作.

3.Mybatis優點

 Mybatis比Hibernate更為輕量級;

 Mybatis幾乎消除了所有的JDBC代碼和參數的手工設置.

 4.Mybatis特點

  Mybatis具有比較強大的動態語句功能.而且Mybatis在JavaBean和表之間的映射關系建立方面,也更加的便捷靈活.

5.Mybatis的核心API

 ①.SqlSessionFactoryBuilder:

   SqlSessionFactoryBuilder是整個Mybatis框架的入口,提供了一個build()方法,用來創建SqlSessionFactory對象. SqlSessionFactoryBuilder對象一般是在xml文件中通過configuration節點來進行配置.

②.SqlSessionFactory:

  用來創建SqlSession.注意:該對象一般只用創建一個對象就可以,也就是不要重復創建該對象!

③.SqlSession:

 SqlSession用來實現數據庫的各種增刪改查操作.

注意:

 因為SqlSession對象不是線程安全的,所以在使用該對象的時候,要確保該對象不能被多個方法所共享,當用完該對象之后,就要把該對象close()掉.

6.Mybatis和Hibernate對比

  Hibernate相對來說較重,使用和配置起來較麻煩,內存占用和資源消耗較多;Hibernate的查詢效率並不突出;Hibernate的入門門檻較高.Hibernate里面的API方法及功能較多.

Mybatis相對來說較輕,.......;Mybatis學習成本較低.

Mybatis相對於Hibernate來說API較少,比較單薄.

 二:Mybatis的基本使用

1.利用maven工廠導入所需要的jar包

 

      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.0.7</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.2.7</version>
      </dependency>

 

2:創建db.properties.xml文件

該文件用來簡化數據庫的連接配置,以后數據庫有更改,直接在這個文件里面修改即可,可以添加多種不同的數據庫。我的如下

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/sql05
mysql.username=root
mysql.password=123

orcl.driver=oracle.jdbc.driver.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123

3.創建mybatis.xml配置文件

首先引用db.properties.xml文件,

就可以引用db.properties的配置文件了。

如果是mysql的數據庫的話,就加載mysql_conn

管理數據源的時候

                <property name="driver" value="${mysql.driver}" />
                <property name="url" value="${mysql.url}" />
                <property name="username" value="${mysql.username}" />
                <property name="password" value="${mysql.password}" />

mysql.driver一些分別對應着之前寫db.properties配置文件。

接着加載映射文件,加載的映射文件用於配置數據庫鏈接的一些操作

    <!-- 加載映射文件 -->
    <mappers>
        <mapper resource="PersonMapper.xml"/>
    </mappers>

 

4.創建PersonMapper.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">
<!-- namespace:這里的值,可以隨便寫!但是要保證它的值唯一.一般開發過程中,都是JavaBean的全路徑. -->
<mapper namespace="com.syc.dao.domain.Person">

    <!-- type:要操作的JavaBean的全路徑 -->
    <!-- resultMap:建立起JavaBean和表的映射關系 -->
    <!-- 直接引用別名 -->
    <resultMap type="person" id="personMap">
        <!-- id:表示主鍵 -->
        <id column="pid" property="pid" />
        <!-- result:普通列 -->
        <result column="name" property="name" />
        <result column="nickname" property="nickname" />
    </resultMap>

    <!-- insert:添加操作的標簽,id:用來引用該標簽 -->
    <insert id="insertPerson">
        insert into person (name,nickname)
        values('王小二','店小二')
    </insert>

    <!-- 帶參數的標簽 -->
    <insert id="insertPersonWithParams" parameterType="person">
        insert into
        person (name,nickname)
        values(#{name},#{nickname})
    </insert>

    <!-- 查詢標簽 -->
    <!-- resultMap:集合的泛型類 -->
    <select id="findAll" resultMap="personMap">
        select * from person
    </select>

    <select id="findById" resultType="person" parameterType="int">
        select *
        from person
        where pid=#{pid}
    </select>

    <!-- 修改 -->
    <update id="updateById" parameterType="person">
        update person set
        name=#{name},nickname=#{nickname}
        where pid=#{pid}
    </update>
    
    <!-- 刪除 -->
    <delete id="deleteById" parameterType="person">
        delete from person 
        where pid=#{pid}
    </delete>
    
    <!-- 注意:除了查詢之外,其他的操作,增刪改操作的,起始和標簽名稱沒有關系! -->
    <delete id="insertWithDeleteTag" parameterType="person">
        insert into
        person (name,nickname)
        values(#{name},#{nickname})
    </delete>

</mapper>

5.創建MybatisUtil工具類,加載配置文件

package com.syc.dao.utils;

import java.io.IOException;
import java.io.Reader;

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

public class MybatisUtil {

    private static SqlSessionFactory factory;
    // 解決資源爭搶問題.
    private static ThreadLocal<SqlSession> localSessions = new ThreadLocal<SqlSession>();

    static {
        Reader reader = null;
        try {
            // 加載Mybatis的配置文件
            reader = Resources.getResourceAsReader("mybatis.xml");
            // 創建SqlSessionFactory對象.
            factory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 獲取Session對象
    public static SqlSession getSession() {
        SqlSession session = localSessions.get();
        if (session == null) {
            session = factory.openSession();
            localSessions.set(session);
        }
        return session;
    }

    // 關閉session的方法
    public static void closeSession() {
        SqlSession session = localSessions.get();
        if (session != null) {
            session.close();
            localSessions.remove();
        }
    }
}

 

 創建session對象:

6.創建Person類。

 

    private Integer pid; //id
    private String name;  //姓名
    private String nickname;  //稱呼

 

 

 

7.創建PersonDao類,執行具體的CRUD操作

 

 

三: Mybatis配置簡化改造

1.    簡化數據庫連接配置

前面提到了,就是創建一個db.properties.xml配置文件,因為做項目后東西太多,需要一個特定的配置文件去管理,而且數據庫使用可能會運用到多個,修改項目時候,在特定的配置文件中修改會更加便捷。mysql和orcal的配置如下,如果當你要調用什么數據庫的時候,就加載哪個

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/sql05
mysql.username=root
mysql.password=123

orcl.driver=oracle.jdbc.driver.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123

2.設置類型別名

3.簡化id的引用

因為做項目的時候,有時候包名過多,可能自己填寫的時候難免字母會填寫錯誤,給調試出問題帶來不必要的麻煩。

四.Mybatis利用標簽使用CRUD

 

1.動態添加

 

 

 

2.    查詢操作

    <!-- 查詢標簽 -->
    <!-- resultMap:集合的泛型類 -->
    <select id="findAll" resultMap="personMap">
        select * from person
    </select>

    <select id="findById" resultType="person" parameterType="int">
        select *
        from person
        where pid=#{pid}
    </select>

3.修改操作

    <!-- 修改 -->
    <update id="updateById" parameterType="person">
        update person set
        name=#{name},nickname=#{nickname}
        where pid=#{pid}
    </update>

4.刪除操作

    <!-- 刪除 -->
    <delete id="deleteById" parameterType="person">
        delete from person 
        where pid=#{pid}
    </delete>

5.注意:

真正的增刪改和標簽名沒有關系!只和里面的sql語句有關!

    <!-- 注意:除了查詢之外,其他的操作,增刪改操作的,起始和標簽名稱沒有關系! -->
    <delete id="insertWithDeleteTag" parameterType="person">
        insert into
        person (name,nickname)
        values(#{name},#{nickname})
    </delete>

五:運行測試結果

1.測試數據庫鏈接成功與否

    @Test
    public void test1() {
        SqlSession session = MybatisUtil.getSession();
        Connection conn = session.getConnection();
        // Mybatis中可以執行原生的SQL語句!
        if (conn != null) {
            System.out.println("數據庫已建立連接!");
        } else {
            System.out.println("數據庫未建立連接!");
        }
    }

2.添加數據

    @Test
    public void test2(){
        PersonDao dao = new PersonDao();
        int result = dao.insertPerson();
        if (result>0) {
            System.out.println("添加成功");
        }
    }

PersonMapper.xml對應配置:

    <!-- insert:添加操作的標簽,id:用來引用該標簽 -->
    <insert id="insertPerson">
        insert into person (name,nickname)
        values('王小二','店小二')
    </insert>

查詢數據庫后多了這條數據:

還有一種帶參數的標簽添加數據

    @Test
    public void test3(){
        PersonDao dao = new PersonDao();
        Person p = new Person();
        p.setName("林沖");
        p.setNickname("豹子頭");
        int result = dao.insertPersonWithParams(p);
        if (result>0) {
            System.out.println("添加成功");
        }
    }

測試很多就不一一測試了,DaoTest源碼如下

package com.syc.dao.test;

import java.sql.Connection;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.syc.dao.dao.PersonDao;
import com.syc.dao.domain.Person;
import com.syc.dao.utils.MybatisUtil;

public class DaoTest {
    @Test
    public void test1() {
        SqlSession session = MybatisUtil.getSession();
        Connection conn = session.getConnection();
        // Mybatis中可以執行原生的SQL語句!
        if (conn != null) {
            System.out.println("數據庫已建立連接!");
        } else {
            System.out.println("數據庫未建立連接!");
        }
    }
    @Test
    public void test2(){
        PersonDao dao = new PersonDao();
        int result = dao.insertPerson();
        if (result>0) {
            System.out.println("添加成功");
        }
    } @Test
public void test3() { PersonDao dao = new PersonDao(); Person p = new Person(); p.setName("林沖"); p.setNickname("豹子頭"); int result = dao.insertPersonWithParams(p); if (result > 0) { System.out.println("添加成功!"); } } @Test public void test4(){ PersonDao dao = new PersonDao(); List<Person> persons =dao.findAll(); for (Person p : persons) { System.out.println("name="+p.getName()); } } @Test public void test5() { PersonDao dao = new PersonDao(); Person person = dao.findById(2); System.out.println("name=" + person.getName()); } @Test public void test6(){ PersonDao dao = new PersonDao(); Person person = new Person(); person.setPid(6); person.setName("時遷"); person.setNickname("鼓上蚤"); int result = dao.updateById(person); if (result>0) { System.out.println("修改成功"); } } @Test public void test7(){ PersonDao dao = new PersonDao(); Person p = new Person(); p.setPid(6); int result= dao.deleteById(p); if (result>0) { System.out.println("刪除成功"); } } @Test public void test8(){ PersonDao dao = new PersonDao(); Person p = new Person(); p.setName("宋江"); p.setNickname("及時雨"); int result = dao.insertWithDeleteTag(p); if (result>0) { System.out.println("添加成功"); } } }

PersonDao的CURD操作的代碼如下

package com.syc.dao.dao;


import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.syc.dao.domain.Person;
import com.syc.dao.utils.MybatisUtil;

public class PersonDao {
    public int insertPerson(){
        SqlSession session = null;
        try {
            session = MybatisUtil.getSession();
            //Mybatis中默認自動開啟了事務.
            //命名空間+某個標簽的id!
            //return session.insert("com.syc.dao.domain.Person.insertPerson")
            
            //簡化id的引用
            return session.insert(Person.class.getName()+".insertPerson");
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return 0;
    }
    
    //帶參數的添加操作
    public int insertPersonWithParams(Person person){
        SqlSession session =null;
        try {
            session =MybatisUtil.getSession();
            //簡化id的引用
            return session.insert(Person.class.getName()+".insertPersonWithParams",person);
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return 0;
    }
    //查詢全部
    public List<Person> findAll(){
        SqlSession session =null;
        try {
            session = MybatisUtil.getSession();
            //簡化id的引用
            return session.selectList(Person.class.getName()+".findAll");
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return null;
    }
    public Person findById(int pid){
        SqlSession session = null;
        try {
            session = MybatisUtil.getSession();
            //簡化id的引用
            return session.selectOne(Person.class.getName()+".findById",pid);
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return null;
        
    }
    public int updateById(Person person){
        SqlSession session =null;
        try {
            session = MybatisUtil.getSession();
            //簡化id的引用
            return session.update(Person.class.getName()+".updateById",person);
            
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return 0;
    }
    public int deleteById(Person person){
        SqlSession session =null;
        try {
            session = MybatisUtil.getSession();
            
            //簡化id的引用
            return session.delete(Person.class.getName()+".deleteById",person);
            
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return 0;
        
    }
    public int insertWithDeleteTag(Person person){
        SqlSession session=null;
        try {
            session = MybatisUtil.getSession();
            
            //簡化id的引用
            return session.insert(Person.class.getName()+"insertWithDeleteTag",person);
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally {
            //提交事務
            session.commit();
            MybatisUtil.closeSession();
        }
        return 0;
    }
}

 

這是Mybatis的入門配置和調試。希望能給剛接觸mybatis的初學者一點幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM