国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java Persistence with MyBatis 3讀書(shū)筆記

JinB / 1532人閱讀

摘要:內(nèi)部將通過(guò)創(chuàng)建事務(wù)管理應(yīng)用服務(wù)器負(fù)責(zé)管理數(shù)據(jù)庫(kù)連接生命周期使用。對(duì)于大型數(shù)據(jù)庫(kù)而言這會(huì)導(dǎo)致很差的性能問(wèn)題。這是指檢索出的對(duì)象不會(huì)被共享并且可以被調(diào)用者安全地修改不會(huì)其他潛在的調(diào)用者或者線程的潛在修改干擾。

第一章 mybatis 簡(jiǎn)介

以下內(nèi)容是自己在看本書(shū)時(shí)覺(jué)得重要的地方記錄下來(lái),一方面自己做個(gè)筆記也希望對(duì)其他同行有幫助

簡(jiǎn)介

mybatis: 是一個(gè)簡(jiǎn)化和實(shí)現(xiàn)了Java數(shù)據(jù)持久層的開(kāi)源框架愛(ài),抽象和大量的jdbc冗余代碼,提供簡(jiǎn)單的API和數(shù)據(jù)庫(kù)加護(hù)

mybatis優(yōu)點(diǎn)

消除大量的JDBC冗余代碼

低的學(xué)習(xí)曲線

很好的域傳統(tǒng)數(shù)據(jù)庫(kù)協(xié)作

接收SQL語(yǔ)句

提供Spring框架集成

提供第三方緩存類庫(kù)集成

引入更好的性能

mybatis簡(jiǎn)單使用

mybatis 配置




  

  
  

  
  
    
    
    
    
  

  
  

  

0.1. 創(chuàng)建session Factory 類

package com.mybatis3.util;
import java.io.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
public class MyBatisSqlSessionFactory
{
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory()
{
    if(sqlSessionFactory == null)
    {
        InputStream inputStream;
try
        {
            inputStream = Resources.
                          getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new
            SqlSessionFactoryBuilder().build(inputStream);
        }
        catch (IOException e)
        {
            throw new RuntimeException(e.getCause());
         }
    }
    return sqlSessionFactory;
}
public static SqlSession openSession()
{
    return getSqlSessionFactory().openSession();
}
}

創(chuàng)建xml映射



INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)
    VALUES(#{studId},#{name},#{email},#{dob})

創(chuàng)建mapper接口

public interface StudentMapper
{
    Student findStudentById(Integer id);
    void insertStudent(Student student);
}

創(chuàng)建會(huì)話使用接口

SqlSession session = getSqlSessionFactory().openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
// Select Student by Id
Student student = mapper.selectStudentById(1);
//To insert a Student record
mapper.insertStudent(student);

第二章 mybatis 配置 使用XML配置



    //加載properties文件
  
    
    
  
  //開(kāi)啟緩存
  
    
  
  
  //別名
  
    
    
    
  
  //類型處理器,注冊(cè)自定義類型
  
    
    
  
  
  //支持配置多個(gè)數(shù)據(jù)源,設(shè)置默認(rèn)環(huán)境為開(kāi)發(fā)環(huán)境
  
    
      
      
        
        
        
        
      
    
     
      
      
        
      
    
  
  
    
    
    
  

以上是一個(gè)簡(jiǎn)單的基于XML的配置
通過(guò)以上XML可以到所有的配置:

加載properties 文件

直接默認(rèn)值


      
      

如果文件中定義了jdbc.username,以上配置中的默認(rèn)值會(huì)被覆蓋掉

通過(guò)占位符


  

開(kāi)啟緩存

配置environments default="development" 實(shí)現(xiàn)默認(rèn)環(huán)境 ,可以配置不同環(huán)境

配置多數(shù)據(jù)庫(kù)實(shí)現(xiàn)

針對(duì)不同的數(shù)據(jù)庫(kù)創(chuàng)建不同sessionFactory

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory defaultSqlSessionFactory = new SqlSessionFactoryBuilder().
build(inputStream);
SqlSessionFactory cartSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStre
    am, "shoppingcart");
reportSqlSessionFactory = new SqlSessionFactoryBuilder().
build(inputStream, "reports");

如果不指定環(huán)境id,則使用默認(rèn)的環(huán)境創(chuàng)建

數(shù)據(jù)庫(kù)類型配置

UNPOOLED

mybatis會(huì)為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建錯(cuò)誤一個(gè)新的連接,并關(guān)閉它。__只適用于小閨蜜數(shù)據(jù)并發(fā)__

POOLED

mybatis創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接池,__開(kāi)發(fā)環(huán)境經(jīng)常使用__  
默認(rèn)的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)是通過(guò)`org.apache.ibatis.datasource.pooled.PooledDataSource`

JNDI

mybatis從應(yīng)用服務(wù)器配置好的JNDI數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)連接  

事務(wù)管理

JDBC

是由JDBC事務(wù)管理器管理事務(wù)。 內(nèi)部將通過(guò)JDBCTransactionFactory創(chuàng)建事務(wù)管理  

MANAGED

應(yīng)用服務(wù)器負(fù)責(zé)管理數(shù)據(jù)庫(kù)連接生命周期使用。內(nèi)部使用`ManagedTranscationFactory`類來(lái)創(chuàng)建事務(wù)管理器

設(shè)置別名
由于在* mapper.xml 文件中resultTypeparameterType屬性設(shè)置要使用全限定名,可以使用別名的形式簡(jiǎn)化


      
      
      

也可以不用直接設(shè)定別名,可以設(shè)定包,然后系統(tǒng)自動(dòng)掃描設(shè)置一個(gè)以類首字母小寫(xiě)的別名
通過(guò)實(shí)體類添加注解形式實(shí)現(xiàn)

@Alias("")
public class Student{

}

類型處理器
mubatis對(duì)一下類型實(shí)現(xiàn)內(nèi)建處理器 :

所有基本數(shù)據(jù)類型

基本類型的包裹類型(裝箱操作對(duì)象類型)

byte[]

java.util.Date

java.sql.Date

java.sql.Time

java.sql.Timestamp

java枚舉類型

創(chuàng)建自定義的類型處理器,處理自定義類型

//PhoneNumber 自定義的類
public class PhoneTypeHandler extends BaseTypeHandler
{
     @Override
public void setNonNullParameter(PreparedStatement ps, int i,
                                PhoneNumber parameter, JdbcType jdbcType) throws SQLException
{
    ps.setString(i, parameter.getAsString());
}

public PhoneNumber getNullableResult(ResultSet rs, String columnName)  throws SQLException
{
     return new PhoneNumber(rs.getString(columnName));
}

public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException
{
     return new PhoneNumber(rs.getString(columnIndex));
}
}

別忘了注冊(cè)

全局參數(shù)設(shè)定(一下是默認(rèn)的,)


           
           
           
           
           
           
           
           
           
           
           
              
              

配置mappers映射xml文件路徑
多種配置形式


     
     
    
    

使用Java 配置

通過(guò)XML配置形式了解了mybatis中的各個(gè)配置屬性, 通過(guò)Java API 的配置形式也可以實(shí)現(xiàn)

public class MybatisConfig{
    public static SqlSessionFactory getSqlSessionFactory()
    {
      SqlSessionFactory sqlSessionFactory = null;
    try
    {
        DataSource dataSource = DataSourceFactory.getDataSource();
        TransactionFactory transactionFactory = new
        JdbcTransactionFactory();
        Environment environment = new Environment("development",
                transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.getTypeAliasRegistry().registerAlias("student",
                Student.class);
        configuration.getTypeHandlerRegistry().register(PhoneNumber.
                class, PhoneTypeHandler.class);
        configuration.addMapper(StudentMapper.class);
        //創(chuàng)建
        sqlSessionFactory = new SqlSessionFactoryBuilder().
        build(configuration);
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
    return sqlSessionFactory;
}
}

創(chuàng)建datasource

public class DataSourceFactory
{
    public static DataSource getDataSource(){
       String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/mybatisdemo";
        String username = "root";
        String password = "admin";
        PooledDataSource dataSource = new PooledDataSource(driver, url,
        username, password);
        return dataSource;
    }
    
    //通過(guò)JNDI創(chuàng)建  
    public static DataSource getDataSource(){
        String jndiName = "java:comp/env/jdbc/MyBatisDemoDS";
        try{
                 InitialContext ctx = new InitialContext();
                DataSource dataSource = (DataSource) ctx.lookup(jndiName);
                return dataSource;
        }catch(NamingException e){
            throw new RuntimeException(e);
        }
    }
    
     
}
自定義mybatis日志 mybatis 日志支持

mybatis中針對(duì)日志支持的優(yōu)先級(jí):

SLF4J

Apache Commons Logging

Log4j 2

Log4j

JDK logging

mybatis 設(shè)置日志

調(diào)用一下方式實(shí)現(xiàn)

org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); 
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); 
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging(); 
org.apache.ibatis.logging.LogFactory.useStdOutLogging();
第三章 XML配置SQL映射器

通過(guò)xml的形式映射有兩種形式:

只有XML映射

定義xml映射文件

        
        
        
            
        

調(diào)用

public Student = findStudentById(Integer id){
    SqlSession session = MybatisUtil.geSqlSession();
    try{
        //通過(guò)字符串的形式調(diào)用
        Student student = sqlSession.selectOne("com.mybatis3.mappers.StudentMapper.findStudentById",id);
    }
}

帶有mapper接口類形式

需要注意的點(diǎn): __其名空間namespace 應(yīng)該跟StudentMapper接口的完全限定名保持一至__, __ id,parameterType,returnType 應(yīng)該分別和 StudentMapper 接口中的方法名, 參數(shù)類型,返回值相對(duì)應(yīng)__

mybatis 提供的的映射語(yǔ)句

mybatis 提供多種不同的映射語(yǔ)句:

INSERT

useGeneratedKeys: 設(shè)置自增長(zhǎng)

keyProperty: 主鍵屬性

SELECT

UPDATE

DELETE

mybatis 不同映射語(yǔ)句實(shí)例:

INSERT

通過(guò)自增長(zhǎng)設(shè)置主鍵


    INSERT INTO STUDENTS(NAME, EMAIL, PHONE)
    VALUES(#{name},#{email},#{phone})

針對(duì)支持序列生成主鍵值


    
        SELECT ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL
    
    INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
    VALUES(#{studId},#{name},#{email},#{phone})


//使用觸發(fā)器  

    INSERT INTO STUDENTS(NAME,EMAIL, PHONE)
    VALUES(#{name},#{email},#{phone})
    
        SELECT ELEARNING.STUD_ID_SEQ.CURRVAL FROM DUAL
    

mybatis結(jié)果集映射規(guī)則:

對(duì)于 List, Collection, Iterable類型,返回 java.util.ArrayList

對(duì)于Map 類型,返回 java.util.HashMap

對(duì)于Set 類型: 返回 java.util.HashSet

對(duì)于SortedSet類型: 返回java.util.TreeSet

mybatis 映射關(guān)系 一對(duì)一映射

方式1: 使用點(diǎn)語(yǔ)法進(jìn)行映射

public class Student
{
   private Integer studId;
   private String name;
   private String email;
   private Address address;        //一個(gè)地址對(duì)象, 每個(gè)學(xué)生對(duì)應(yīng)一個(gè)地址  
}


  
  
  
  
  
  
  
  
  
  


//使用了左外連接來(lái)查詢

方式2: 使用嵌套結(jié)果 ResultMap進(jìn)行映射

引入其他文件定義的ResultMap

__使用標(biāo)簽`association` 引入__  

      
      
      



      
      
      
      
查詢語(yǔ)句  

本身內(nèi)部嵌套


      
      
      
      
        
        
        
        
        
        
      

方式3: 使用其那套select查詢語(yǔ)句
每一個(gè)對(duì)應(yīng)的對(duì)象實(shí)現(xiàn)自己的查詢語(yǔ)句


     
     


//查詢語(yǔ)句



     
    

注意嵌套查詢:通過(guò)association 將另一個(gè)對(duì)象的查詢語(yǔ)句嵌套進(jìn)入, 并且此標(biāo)簽好像只能用于查詢

一對(duì)一查詢中內(nèi)部的對(duì)象在數(shù)據(jù)庫(kù)中對(duì)應(yīng)的都是一個(gè)Id或者唯一標(biāo)識(shí)值,所以此處底部的嵌套xml中的值都是id屬性的

一對(duì)多映射

使用元素將 一對(duì)多類型的結(jié)果 映射到 一個(gè)對(duì)象集合上

使用嵌套對(duì)象形式顯示

public class Tutor
{
    private Integer tutorId;
    private String name;
    private String email;
    private Address address;
    private List courses;
    / setters & getters
}

  
  
  
  





使用嵌套語(yǔ)句實(shí)現(xiàn)


  
  
  
  
  






注意: 嵌套 Select 語(yǔ)句查詢會(huì)導(dǎo)致 N+1 選擇問(wèn). 首先,主查詢將會(huì)執(zhí)行(1 次),對(duì)于主 查詢返回的每一行,另外一個(gè)查詢將會(huì)被執(zhí)行(主查詢 N 行,則此查詢 N 次)。對(duì)于 大型數(shù)據(jù)庫(kù)而言,這會(huì)導(dǎo)致很差的性能問(wèn)題。

動(dòng)態(tài)SQL

mybatis 提供: ,,,, 進(jìn)行構(gòu)造動(dòng)態(tài)SQL

1. if

    SELECT * FROM COURSES
        WHERE TUTOR_ID= #{tutorId}
    
    AND NAME LIKE #{courseName}
    

當(dāng)if中test條件成立時(shí), 才會(huì)添加if中的內(nèi)容到SQL語(yǔ)句中

choose, when, otherwise

__mybatis計(jì)算 測(cè)試條件的值,且使用第一個(gè)值為true的子句, 如果沒(méi)有條件為true,則使用 內(nèi)的子句。

where
trim

foreach
mybatis Other 處理枚舉

存儲(chǔ)枚舉名

默認(rèn)情況下mybatis支持開(kāi)箱方式持久化枚舉類型屬性, 其通過(guò)`EnumTypeHandler`來(lái)處理枚舉類型與Java類型對(duì)應(yīng)  
默認(rèn)是使用字符串進(jìn)行存儲(chǔ)的,數(shù)據(jù)表中對(duì)應(yīng)的是枚舉對(duì)應(yīng)的字符串  

存儲(chǔ)枚舉對(duì)應(yīng)的int類型值

需要將枚舉對(duì)應(yīng)的handler修改為以下類  
__還是建議使用默認(rèn)的形式的,使用順序的如果改變了枚舉對(duì)應(yīng)的順序,數(shù)據(jù)庫(kù)中值就無(wú)法對(duì)應(yīng)上了__  

處理 blob類型

默認(rèn)情況下,mybatis將CLOB類型的列映射到 java.lang.String類型上,
將BLOB 映射到byte[]類型上

多個(gè)參數(shù)

使用map形式引入


使用參數(shù)替代

緩存

默認(rèn)情況下,mybatis開(kāi)啟一級(jí)緩存,對(duì)select進(jìn)行緩存支持。 可以通過(guò)開(kāi)啟二級(jí)緩存
開(kāi)啟耳機(jī)緩存的同時(shí)引發(fā)的問(wèn)題:

所有在映射語(yǔ)句文件定義的

<strike id="4kk02"><input id="4kk02"></input></strike>
  • <strike id="4kk02"></strike>
    <strike id="4kk02"></strike>
    <ul id="4kk02"></ul><strike id="4kk02"><menu id="4kk02"></menu></strike>
    <del id="4kk02"><dfn id="4kk02"></dfn></del>
      <