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

資訊專欄INFORMATION COLUMN

Mybatis初體驗(yàn)

flyer_dev / 3084人閱讀

摘要:是支持普通查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。其中,標(biāo)簽內(nèi)指定的是你定義的實(shí)體類的別名,方便之后使用。如果有問(wèn)題會(huì)輸出相應(yīng)的提示。結(jié)果根據(jù)配置,我們生成了三個(gè)文件。

MyBatis 是支持普通 SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。

以前都是用Hibernate比較多,項(xiàng)目中使用到的Mybatis封裝的Dao也是別人封裝好的。今天第一次看Mybatis文檔,寫一個(gè)簡(jiǎn)單的demo加深印象。

Mybatis入門 開(kāi)發(fā)環(huán)境配置

新建一個(gè)maven項(xiàng)目:

加入mysql-connector-javamybatis,還有Lombok(Lombok不是必須的)的依賴:


    4.0.0
    com.fengyuan
    mybatis-demo
    0.0.1-SNAPSHOT

    
        
            org.projectlombok
            lombok
            1.14.4
        
        
            mysql
            mysql-connector-java
            5.1.38
        
        
            org.mybatis
            mybatis
            3.2.8
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    

建表

在mysql中新建數(shù)據(jù)庫(kù)mybatisdemo,并創(chuàng)建student表:

表中有兩條記錄:

創(chuàng)建實(shí)體類

創(chuàng)建表對(duì)應(yīng)的Model,Student類:

package com.fengyuan.domain;

import lombok.Data;

public @Data class Student {
    private int id;
    private String name;
    private int age;
}
添加配置文件

在項(xiàng)目中新建mybatis文件夾,在其中添加Mybatis的配置文件mybatis-conf.xml,在其中配置數(shù)據(jù)源。




    
        
    
    
    
        
            
            
                
                
                
                
            
        
    

其中,標(biāo)簽內(nèi)指定的是你定義的實(shí)體類的別名,方便之后使用。

定義映射文件

在mybatis文件夾底下新建一個(gè)mapper文件夾,存放映射文件,在其中新建student表對(duì)應(yīng)的映射文件studentMapper.xml




    

namespace是唯一的,namespace有點(diǎn)像包名+類名,id像是方法名。parameterType是方法的參數(shù)類型,resultType中的"Student"就是前面定義的別名,是方法的返回類型。
定義完映射文件,將其注冊(cè)到配置文件中:




    
        
    
    
    
        
            
            
                
                
                
                
            
        
    

    
    
        
    
測(cè)試

完成以上步驟,就可以開(kāi)始測(cè)試了。
測(cè)試類:

package com.fengyuan.client;

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;

import com.fengyuan.domain.Student;

public class Main {
    public static void main(String[] args) {
        Reader reader = null;
        try {
            // 加載配置文件
            reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 構(gòu)建SqlSession工廠,并從工廠里打開(kāi)一個(gè)SqlSession
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        try {
             // 找到對(duì)應(yīng)的sql
            String statement = "com.fengyuan.domain.StudentMapper.getStudentById";
            // 傳入?yún)?shù)id=1,執(zhí)行sql,返回查詢結(jié)果
            Student student = sqlSession.selectOne(statement, 1);
            System.out.println(student);
        } finally {
            sqlSession.close();
        }
    }
}

執(zhí)行結(jié)果:

Student(id=1, name=Can Liu, age=40)

表中id為1的記錄已經(jīng)取出來(lái)了。

項(xiàng)目結(jié)構(gòu):

另一種映射方式

前面的這種映射方式,雖然可以用,但是要用字符串來(lái)找對(duì)應(yīng)的sql很不方便,還有可能出錯(cuò)。mybatis提供了注解的方式,更簡(jiǎn)單也更直觀。

定義接口

在項(xiàng)目中創(chuàng)建一個(gè)Dao接口StudentDao.java

package com.fengyuan.dao;

import org.apache.ibatis.annotations.Select;

import com.fengyuan.domain.Student;

public interface StudentDao {
    @Select("select * from student where id = #{id}")
    public Student getStudentById(int id);
}

把剛才寫在映射文件中的sql語(yǔ)句寫在@Select注解中即可,這樣一來(lái)映射文件studentMappper.xml就不用了。

當(dāng)然,如果要用xml來(lái)映射也是可以的,接口中只寫方法,不要加注解。此時(shí)要求namespace必須與對(duì)應(yīng)的接口全類名一致,id必須與對(duì)應(yīng)接口的某個(gè)對(duì)應(yīng)的方法名一致,如下:




    
注冊(cè)接口



    
    
        
    
    
    
    
        
            
            
                
                
                
                
            
        
    

    
    
    
    
    
        
    
    
測(cè)試
package com.fengyuan.client;

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;

import com.fengyuan.dao.StudentDao;
import com.fengyuan.domain.Student;

public class Main {
    public static void main(String[] args) {
        Reader reader = null;
        try {
            // 加載配置文件
            reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 構(gòu)建SqlSession工廠,并從工廠里打開(kāi)一個(gè)SqlSession
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 如果配置文件中沒(méi)有注冊(cè)接口,可以在代碼里注冊(cè)
        //sqlSession.getConfiguration().addMapper(StudentDao.class);
        
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            // 直接調(diào)用接口的方法,傳入?yún)?shù)id=1,返回Student對(duì)象
            Student student = studentDao.getStudentById(1);
            System.out.println(student);
        } finally {
            sqlSession.close();
        }
    }
}

如代碼中的注釋,除了在配置文件中注冊(cè)接口,也可以在代碼中用
sqlSession.getConfiguration().addMapper(StudentDao.class);來(lái)注冊(cè)。
然后就可以直接調(diào)用接口的方法來(lái)執(zhí)行對(duì)應(yīng)的sql語(yǔ)句,比第一種方式要直觀、而且“面向?qū)ο蟆绷撕芏唷?/p>

此時(shí)的項(xiàng)目結(jié)構(gòu):

CURD

除了前面演示的select語(yǔ)句,這邊補(bǔ)充一下其他的示例。

使用注解映射

在接口studentDao.java中定義相應(yīng)的方法,并在注解中寫上對(duì)應(yīng)的sql:

package com.fengyuan.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.fengyuan.domain.Student;

public interface StudentDao {
    @Select("select * from student where id= #{id}")
    public Student getStudentById(int id);
    
    @Insert("insert into student(name, age) values(#{name}, #{age})")
    public int addStudent(Student student);
    
    @Delete("delete from student where name = #{name}")
    public int removeStudentByName(String name);
    
    @Update("update student set age = #{age} where id = #{id}")
    public int updateStudent(Student student);
    
    @Select("select * from student")
    public List listAllStudents();
}
使用XML文件映射

如果是用XML文件,接口中只要定義好方法:

package com.fengyuan.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.fengyuan.domain.Student;

public interface StudentDao {
    public Student getStudentById(int id);
    
    public int addStudent(Student student);
    
    public int removeStudentByName(String name);
    
    public int updateStudent(Student student);
    
    public List listAllStudents();
}

然后,在XML文件中,定義好對(duì)應(yīng)的sql:




    
    
    
        insert into student(name, age) values(#{name}, #{age})
    
    
    
        delete from student where name = #{name}
    
    
    
        update student set age = #{age} where id = #{id}
    
    
    

注意namespace與id要與接口中一一對(duì)應(yīng)。

注冊(cè)到配置文件中

    

或者


    
測(cè)試
package com.fengyuan.client;

import java.io.Reader;
import java.util.List;

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 com.fengyuan.dao.StudentDao;
import com.fengyuan.domain.Student;

public class Main {
    private static Reader reader;
    private static SqlSessionFactory sqlSessionFactory;
    
    static {
        try {
            reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 獲取sqlSession
     * @return
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
    
    /**
     * 查詢
     */
    public static void testQuery() {
        SqlSession sqlSession = getSqlSession();
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            
            // 根據(jù)id返回Student對(duì)象
            Student student = studentDao.getStudentById(1);
            System.out.println(student);
            
        } finally {
            sqlSession.close();
        }
    }
    
    /**
     * 新增
     */
    public static void testInsert() {
        SqlSession sqlSession = getSqlSession();
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            
            // 新建一個(gè)student對(duì)象
            Student student = new Student();
            student.setName("Aaron");
            student.setAge(24);
            
            // 插入到表中
            studentDao.addStudent(student);
            // 提交事務(wù)
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
    
    /**
     * 更新
     */
    public static void testUpdate() {
        SqlSession sqlSession = getSqlSession();
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            
            // 取出student記錄,修改年齡,再更新到數(shù)據(jù)庫(kù)
            Student student = studentDao.getStudentById(2);
            student.setAge(44);
            studentDao.updateStudent(student);
            
            // 提交事務(wù)
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
    
    /**
     * 刪除
     */
    public static void testRemove() {
        SqlSession sqlSession = getSqlSession();
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            
            studentDao.removeStudentByName("cly");
            
            // 提交事務(wù)
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
    
    /**
     * 以List返回student表中所有記錄
     */
    public static void testGetAll() {
        SqlSession sqlSession = getSqlSession();
        try {
            // 獲取映射類
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            
            List students = studentDao.listAllStudents();
            System.out.println(students);
            
            // 提交事務(wù)
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
    
    
    public static void main(String[] args) {
        
    }
}
Mybatis-Generator

手動(dòng)書(shū)寫Mapping映射文件不僅繁瑣而且容易出錯(cuò),通過(guò)Mybatis-Generator,可以幫我們自動(dòng)生成相關(guān)的文件。以下內(nèi)容是從這篇博客中學(xué)習(xí)的,感謝博主。

準(zhǔn)備

建表
這邊我們還是用前面的student表來(lái)作為示例。

mybatis-generator-core
我這邊用的是mybatis-generator-core-1.3.2.jar。

數(shù)據(jù)庫(kù)驅(qū)動(dòng)
同樣,數(shù)據(jù)庫(kù)用的是mysql,所以用了mysql-connector-java-5.1.25.jar。

配置文件
generatorConfig.xml:




    
    
    
        
            
            
        
        
        
        
        
            
        
        
        
            
            
        
        
        
            
        
        
        
            
        
        
        

相關(guān)文件截圖:

執(zhí)行

在命令行執(zhí)行命令:

java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite

輸出Mybatis Generator finished successfully.,表示執(zhí)行成功,在指定的路徑生成了相應(yīng)文件。如果有問(wèn)題會(huì)輸出相應(yīng)的提示。

結(jié)果

根據(jù)配置,我們生成了三個(gè)文件。

在src/main/java中com.fengyuan.model中生成了Student.java:

package com.fengyuan.model;

public class Student {
    private Integer id;

    private String name;

    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

在src/main/java中com.fengyuan.mapping中生成了StudentMapper.xml:




  



  
  
id, name, age
  
  
  
delete from student
where id = #{id,jdbcType=INTEGER}
  
  
insert into student (id, name, age
  )
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
  )
  
  
insert into student

  
    id,
  
  
    name,
  
  
    age,
  


  
    #{id,jdbcType=INTEGER},
  
  
    #{name,jdbcType=VARCHAR},
  
  
    #{age,jdbcType=INTEGER},
  

  
  
update student

  
    name = #{name,jdbcType=VARCHAR},
  
  
    age = #{age,jdbcType=INTEGER},
  

where id = #{id,jdbcType=INTEGER}
  
  
update student
set name = #{name,jdbcType=VARCHAR},
  age = #{age,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
  

在src/main/java中com.fengyuan.dao中生成了StudentMapper.java:

package com.fengyuan.dao;

import com.fengyuan.model.Student;

public interface StudentMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Student record);

    int insertSelective(Student record);

    Student selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Student record);

    int updateByPrimaryKey(Student record);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65057.html

相關(guān)文章

  • Mybatis體驗(yàn)

    摘要:概述是一款優(yōu)秀的基于的持久層框架,封裝代碼,實(shí)現(xiàn)將參數(shù)映射到語(yǔ)句并執(zhí)行,最后將執(zhí)行結(jié)果映射到對(duì)象并返回的功能,支持自定義存儲(chǔ)過(guò)程和高級(jí)映射。命名無(wú)要求,但應(yīng)該有意義。創(chuàng)建實(shí)體和映射文件是映射框架,所以我們需要對(duì)應(yīng)創(chuàng)建類,與數(shù)據(jù)庫(kù)表進(jìn)行映射。 概述 Mybatis是一款優(yōu)秀的、基于SQL的持久層框架,封裝JDBC代碼,實(shí)現(xiàn)將參數(shù)映射到SQL語(yǔ)句并執(zhí)行,最后將執(zhí)行結(jié)果映射到JAVA對(duì)象并返...

    ingood 評(píng)論0 收藏0
  • [直播視頻] 《Java 微服務(wù)實(shí)踐 - Spring Boot 系列》限時(shí)折扣

    摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強(qiáng)大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實(shí)踐為系列講座,專題直播節(jié),時(shí)長(zhǎng)高達(dá)小時(shí),包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡(jiǎn)介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開(kāi)發(fā)人員必備技術(shù)。無(wú)論是互聯(lián)網(wǎng)、云計(jì)算還是大數(shù)據(jù),Java平臺(tái)已成為全棧的生態(tài)體系,...

    Enlightenment 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<