成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java Persistence with MyBatis 3讀書筆記

JinB / 1540人閱讀

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

第一章 mybatis 簡介

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

簡介

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

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

消除大量的JDBC冗余代碼

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

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

接收SQL語句

提供Spring框架集成

提供第三方緩存類庫集成

引入更好的性能

mybatis簡單使用

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文件
  
    
    
  
  //開啟緩存
  
    
  
  
  //別名
  
    
    
    
  
  //類型處理器,注冊自定義類型
  
    
    
  
  
  //支持配置多個(gè)數(shù)據(jù)源,設(shè)置默認(rèn)環(huán)境為開發(fā)環(huán)境
  
    
      
      
        
        
        
        
      
    
     
      
      
        
      
    
  
  
    
    
    
  

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

加載properties 文件

直接默認(rèn)值


      
      

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

通過占位符


  

開啟緩存

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

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

針對不同的數(shù)據(jù)庫創(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ù)庫類型配置

UNPOOLED

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

POOLED

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

JNDI

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

事務(wù)管理

JDBC

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

MANAGED

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

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


      
      
      

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

@Alias("")
public class Student{

}

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

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

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

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));
}
}

別忘了注冊

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


           
           
           
           
           
           
           
           
           
           
           
              
              

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


     
     
    
    

使用Java 配置

通過XML配置形式了解了mybatis中的各個(gè)配置屬性, 通過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;
    }
    
    //通過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中針對日志支持的優(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映射器

通過xml的形式映射有兩種形式:

只有XML映射

定義xml映射文件

        
        
        
            
        

調(diào)用

public Student = findStudentById(Integer id){
    SqlSession session = MybatisUtil.geSqlSession();
    try{
        //通過字符串的形式調(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ù)類型,返回值相對應(yīng)__

mybatis 提供的的映射語句

mybatis 提供多種不同的映射語句:

INSERT

useGeneratedKeys: 設(shè)置自增長

keyProperty: 主鍵屬性

SELECT

UPDATE

DELETE

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

INSERT

通過自增長設(shè)置主鍵


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

針對支持序列生成主鍵值


    
        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ī)則:

對于 List, Collection, Iterable類型,返回 java.util.ArrayList

對于Map 類型,返回 java.util.HashMap

對于Set 類型: 返回 java.util.HashSet

對于SortedSet類型: 返回java.util.TreeSet

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

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

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


  
  
  
  
  
  
  
  
  
  


//使用了左外連接來查詢

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

引入其他文件定義的ResultMap

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

      
      
      



      
      
      
      
查詢語句  

本身內(nèi)部嵌套


      
      
      
      
        
        
        
        
        
        
      

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


     
     


//查詢語句



     
    

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

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

一對多映射

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

使用嵌套對象形式顯示

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

  
  
  
  





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


  
  
  
  
  






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

動(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語句中

choose, when, otherwise

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

where
trim

foreach
mybatis Other 處理枚舉

存儲(chǔ)枚舉名

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

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

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

處理 blob類型

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

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

使用map形式引入


使用參數(shù)替代

緩存

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

所有在映射語句文件定義的