1. 程式人生 > >3.尚矽谷_MyBatis_HelloWorld.avi

3.尚矽谷_MyBatis_HelloWorld.avi

sys 管理器 The 就是 eem 網路 mat 最好 編譯

技術分享圖片

CREATE TABLE `tbl_employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(255) DEFAULT NULL,
  `gender` varchar(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

技術分享圖片

建立與之對應的bean文件

package com.atguigu.mybatis.bean;

public
class Employee { private Integer id; private String lastName; private String email; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return
lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; }
public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; } }

編寫的時候最好保證bean對象的屬性值和表名的字段一一對應,這裏 private String lastName;和表字段last_name不對應我們看後面如何處理了這是一個關鍵點

導入所需的jar包

技術分享圖片

mybatis用到了log4j我們需要在src目錄下建立一個log4j.xml

技術分享圖片

我們創建一個source folder文件夾,必須是這個類型的文件夾,該類型下的文件夾和src在同一目錄

source folder文件夾是一種特別的文件夾,如果你用面向對象的思想去看待這個source folder,那麽他是folder的一個子集,作為子集,肯定是有folder的所有功能,而且還有自己特別的功能,他的特別之處,就是在source folder下面的java文件都會被編譯,編譯後的文件會被放在我們設置的某個文件夾下面(一般我們設置成WEB-INF/classes)

技術分享圖片

log4m.xml文件夾的內容如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

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 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="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要註冊到全局配置文件(mybatis-config.xml)中 -->
    <mappers>
        <mapper resource="EmployeeMapper.xml" />
    </mappers>
</configuration>

EmployeeMapper.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.atguigu.mybatis.dao.EmployeeMapper">
<!-- 
namespace:名稱空間;指定為接口的全類名
id:唯一標識
resultType:返回值類型
#{id}:從傳遞過來的參數中取出id值

public Employee getEmpById(Integer id);
 -->
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select id,last_name lastName,email,gender from tbl_employee where id = #{id}
    </select>
</mapper>

上面因為bean的屬性和數據庫表名不一樣,如何解決了在編寫mysql的時候可以使用別名的方式來解決select id,last_name lastName,email,gender from tbl_employee where id = #{id} 這裏起了一個別名,last_name lastName 第一個是bean中的屬性值,第二個是數據庫的列名

否則會出現問題

EmployeeMapper

package com.atguigu.mybatis.dao;

import com.atguigu.mybatis.bean.Employee;

public interface EmployeeMapper {
    
    public Employee getEmpById(Integer id);

}

MyBatisTest.java

package com.atguigu.mybatis.test;

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.Test;

import com.atguigu.mybatis.bean.Employee;
import com.atguigu.mybatis.dao.EmployeeMapper;

/**
 * 1、接口式編程
 *     原生:        Dao        ====>  DaoImpl
 *     mybatis:    Mapper    ====>  xxMapper.xml
 * 
 * 2、SqlSession代表和數據庫的一次會話;用完必須關閉;
 * 3、SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。
 * 4、mapper接口沒有實現類,但是mybatis會為這個接口生成一個代理對象。
 *         (將接口和xml進行綁定)
 *         EmployeeMapper empMapper =    sqlSession.getMapper(EmployeeMapper.class);
 * 5、兩個重要的配置文件:
 *         mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息
 *         sql映射文件:保存了每一個sql語句的映射信息:
 *                     將sql抽取出來。    
 * 
 * 
 * @author lfy
 *
 */
public class MyBatisTest {
    

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 1、根據xml配置文件(全局配置文件)創建一個SqlSessionFactory對象 有數據源一些運行環境信息
     * 2、sql映射文件;配置了每一個sql,以及sql的封裝規則等。 
     * 3、將sql映射文件註冊在全局配置文件中
     * 4、寫代碼:
     *         1)、根據全局配置文件得到SqlSessionFactory;
     *         2)、使用sqlSession工廠,獲取到sqlSession對象使用他來執行增刪改查
     *             一個sqlSession就是代表和數據庫的一次會話,用完關閉
     *         3)、使用sql的唯一標誌來告訴MyBatis執行哪個sql。sql都是保存在sql映射文件中的。
     * 
     * @throws IOException
     */
    @Test
    public void test() throws IOException {

        // 2、獲取sqlSession實例,能直接執行已經映射的sql語句
        // sql的唯一標識:statement Unique identifier matching the statement to use.
        // 執行sql要用的參數:parameter A parameter object to pass to the statement.
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            Employee employee = openSession.selectOne(
                    "com.atguigu.mybatis.dao.EmployeeMapper.getEmpById", 1);
            System.out.println(employee);
        } finally {
            openSession.close();
        }

    }

    @Test
    public void test01() throws IOException {
        // 1、獲取sqlSessionFactory對象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        // 2、獲取sqlSession對象
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            // 3、獲取接口的實現類對象
            //會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee employee = mapper.getEmpById(1);
            System.out.println(mapper.getClass());
            System.out.println(employee);
        } finally {
            openSession.close();
        }

    }

}

4.尚矽谷_MyBatis_接口式編程.avi

註意幾點:

<?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.atguigu.mybatis.dao.EmployeeMapper">
<!-- 
namespace:名稱空間;指定為接口的全類名
id:唯一標識
resultType:返回值類型
#{id}:從傳遞過來的參數中取出id值

public Employee getEmpById(Integer id);
 -->
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select id,last_name lastName,email,gender from tbl_employee where id = #{id}
    </select>
</mapper>
第一點:namespace="com.atguigu.mybatis.dao.EmployeeMapper">對應的是需要訪問的接口的全類名
第二點:<select id="getEmpById"中id的值和接口下的 public Employee getEmpById(Integer id);名字一一對應
在程序中我們就可以采用接口編程了
package com.atguigu.mybatis.test;

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.Test;

import com.atguigu.mybatis.bean.Employee;
import com.atguigu.mybatis.dao.EmployeeMapper;

/**
 * 1、接口式編程
 *     原生:        Dao        ====>  DaoImpl
 *     mybatis:    Mapper    ====>  xxMapper.xml
 * 
 * 2、SqlSession代表和數據庫的一次會話;用完必須關閉;
 * 3、SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。
 * 4、mapper接口沒有實現類,但是mybatis會為這個接口生成一個代理對象。
 *         (將接口和xml進行綁定)
 *         EmployeeMapper empMapper =    sqlSession.getMapper(EmployeeMapper.class);
 * 5、兩個重要的配置文件:
 *         mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息
 *         sql映射文件:保存了每一個sql語句的映射信息:
 *                     將sql抽取出來。    
 * 
 * 
 * @author lfy
 *
 */
public class MyBatisTest {
    

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 1、根據xml配置文件(全局配置文件)創建一個SqlSessionFactory對象 有數據源一些運行環境信息
     * 2、sql映射文件;配置了每一個sql,以及sql的封裝規則等。 
     * 3、將sql映射文件註冊在全局配置文件中
     * 4、寫代碼:
     *         1)、根據全局配置文件得到SqlSessionFactory;
     *         2)、使用sqlSession工廠,獲取到sqlSession對象使用他來執行增刪改查
     *             一個sqlSession就是代表和數據庫的一次會話,用完關閉
     *         3)、使用sql的唯一標誌來告訴MyBatis執行哪個sql。sql都是保存在sql映射文件中的。
     * 
     * @throws IOException
     */
    @Test
    public void test() throws IOException {

        // 2、獲取sqlSession實例,能直接執行已經映射的sql語句
        // sql的唯一標識:statement Unique identifier matching the statement to use.
        // 執行sql要用的參數:parameter A parameter object to pass to the statement.
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            Employee employee = openSession.selectOne(
                    "com.atguigu.mybatis.dao.EmployeeMapper.getEmpById", 1);
            System.out.println(employee);
        } finally {
            openSession.close();
        }

    }

    @Test
    public void test01() throws IOException {
        // 1、獲取sqlSessionFactory對象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        // 2、獲取sqlSession對象
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            // 3、獲取接口的實現類對象
            //會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee employee = mapper.getEmpById(1);
            System.out.println(mapper.getClass());
            System.out.println(employee);
        } finally {
            openSession.close();
        }

    }

}

 上面不在使用session的方法去增刪改查,而使用getMapper將sql與接口對象進行綁定,獲得接口操作的實現類,這樣就可以使用接口的實現對象進行增刪改查的操作了,接口的實現類是mybatis自己創建出來的,該對象是一個代理對象去實現增刪改查操作。

5.尚矽谷_MyBatis_小結(1).avi
SqlSession代表和數據庫的一次會話;用完必須關閉,每一次增刪改查都是一次會話
SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。所以不能定義成一個類的成員變量,各個方法進行共享,而應該每個方法使用都應用區獲得新的對象

* 5、兩個重要的配置文件:
* mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息
* sql映射文件:保存了每一個sql語句的映射信息:
* 將sql抽取出來

6.尚矽谷_MyBatis_全局配置文件_引入dtd約束.avi
技術分享圖片

我們如何在mybatis的全局配置文件中如何能夠引入源文件了
在上面的mybatis-config.xml中我們引入了mybatis的約束文件"http://mybatis.org/dtd/mybatis-3-config.dtd">
EmployeeMapper.xml中引入了"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
,我們如何因為該約束文件的源碼了,第一找到mybatis的jar包將該jar包解壓
找到下面的兩個文件
技術分享圖片




在eclipse中做下面操作

技術分享圖片

技術分享圖片

key type必須是URI

key就是對於的http://mybatis.org/dtd/mybatis-3-mapper.dtd

location就是解壓對於的文件

引入之後在xml中就能夠實現代碼的自動提示了

7.尚矽谷_MyBatis_全局配置文件_properties_引入外部配置文件.avi

技術分享圖片

上面中因為conf是一個source folder文件夾,所以配置文件EmployeeMapper.xml和實體類Employee在同樣的包名com.atguigu.mybatis.bean下,並且xml文件以實體類的類命名

dbconfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456

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

<!--
        1、mybatis可以使用properties來引入外部properties配置文件的內容;
        resource:引入類路徑下的資源
        url:引入網絡路徑或者磁盤路徑下的資源
      -->
    <properties resource="dbconfig.properties"></properties>

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>
    <!--
        1、mybatis可以使用properties來引入外部properties配置文件的內容;
        resource:引入類路徑下的資源
        url:引入網絡路徑或者磁盤路徑下的資源
      -->
    <properties resource="dbconfig.properties"></properties>
    
    
    <!-- 
        2、settings包含很多重要的設置項
        setting:用來設置每一個設置項
            name:設置項名
            value:設置項取值
     -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    
    <!-- 3、typeAliases:別名處理器:可以為我們的java類型起別名 
            別名不區分大小寫
    -->
    <typeAliases>
        <!-- 1、typeAlias:為某個java類型起別名
                type:指定要起別名的類型全類名;默認別名就是類名小寫;employee
                alias:指定新的別名
         -->
        <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> -->
        
        <!-- 2、package:為某個包下的所有類批量起別名 
                name:指定包名(為當前包以及下面所有的後代包的每一個類都起一個默認別名(類名小寫),)
        -->
        <package name="com.atguigu.mybatis.bean"/>
        
        <!-- 3、批量起別名的情況下,使用@Alias註解為某個類型指定新的別名 -->
    </typeAliases>
        
    <!-- 
        4、environments:環境們,mybatis可以配置多種環境 ,default指定使用某種環境。可以達到快速切換環境。
            environment:配置一個具體的環境信息;必須有兩個標簽;id代表當前環境的唯一標識
                transactionManager:事務管理器;
                    type:事務管理器的類型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
                        自定義事務管理器:實現TransactionFactory接口.type指定為全類名
                
                dataSource:數據源;
                    type:數據源類型;UNPOOLED(UnpooledDataSourceFactory)
                                |POOLED(PooledDataSourceFactory)
                                |JNDI(JndiDataSourceFactory)
                    自定義數據源:實現DataSourceFactory接口,type是全類名
         -->
         

         
    <environments default="dev_mysql">
        <environment id="dev_mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    
        <environment id="dev_oracle">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${orcl.driver}" />
                <property name="url" value="${orcl.url}" />
                <property name="username" value="${orcl.username}" />
                <property name="password" value="${orcl.password}" />
            </dataSource>
        </environment>
    </environments>
    
    
    <!-- 5、databaseIdProvider:支持多數據庫廠商的;
         type="DB_VENDOR":VendorDatabaseIdProvider
             作用就是得到數據庫廠商的標識(驅動getDatabaseProductName()),mybatis就能根據數據庫廠商標識來執行不同的sql;
             MySQL,Oracle,SQL Server,xxxx
      -->
    <databaseIdProvider type="DB_VENDOR">
        <!-- 為不同的數據庫廠商起別名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>
    
    
    <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要註冊到全局配置文件(mybatis-config.xml)中 -->
    <!-- 6、mappers:將sql映射註冊到全局配置中 -->
    <mappers>
        <!-- 
            mapper:註冊一個sql映射 
                註冊配置文件
                resource:引用類路徑下的sql映射文件
                    mybatis/mapper/EmployeeMapper.xml
                url:引用網路路徑或者磁盤路徑下的sql映射文件
                    file:///var/mappers/AuthorMapper.xml
                    
                註冊接口
                class:引用(註冊)接口,
                    1、有sql映射文件,映射文件名必須和接口同名,並且放在與接口同一目錄下;
                    2、沒有sql映射文件,所有的sql都是利用註解寫在接口上;
                    推薦:
                        比較重要的,復雜的Dao接口我們來寫sql映射文件
                        不重要,簡單的Dao接口為了開發快速可以使用註解;
        -->
        <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> -->
        <!-- <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/> -->
        
        <!-- 批量註冊: -->
        <package name="com.atguigu.mybatis.dao"/>
    </mappers>
</configuration>

註意點:使用properties 標簽導入外面的dbconfig.properties文件

<setting name="mapUnderscoreToCamelCase" value="true"/>設置向映射下劃線映射成駝峰命名

作用例如數據庫的字段是last_name,實體類的字段是private String lastName;,在mybatis執行查詢

<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>

會把數據庫的last_name的字段轉化成lastName達到一一對應,但是在寫代碼的時候最好數據庫的字段和實體類屬性一一對應。

3.尚矽谷_MyBatis_HelloWorld.avi