1. 程式人生 > >利用mybatis實現增刪改查 的小專案,單表,雙表一對多,

利用mybatis實現增刪改查 的小專案,單表,雙表一對多,

簡介:
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

iBATIS一詞來源於”internet”和”abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
MyBatis 是支援普通 SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

每個MyBatis應用程式主要都是使用SqlSessionFactory例項的,一個SqlSessionFactory例項可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的例項獲得。
下面開始我們的小專案:
1.我們已經在自己的資料庫中建立好了將要展示的三個表,並新增好了某些資料
user表:

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NOT
NULL COLLATE 'utf8_bin', `psw` VARCHAR(50) NOT NULL COLLATE 'utf8_bin', PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=12 ;

這裡寫圖片描述
Company表:

CREATE TABLE `company` (
    `cid` INT(11) NOT NULL,
    `name` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
    `address` VARCHAR
(10) NOT NULL COLLATE 'utf8_bin', `pro` VARCHAR(10) NOT NULL COLLATE 'utf8_bin', `city` VARCHAR(10) NOT NULL COLLATE 'utf8_bin', `price` FLOAT NULL DEFAULT NULL, PRIMARY KEY (`cid`) ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB ;

這裡寫圖片描述
Emp表:

CREATE TABLE `emp` (
    `eid` INT(11) NOT NULL,
    `name` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
    `sex` VARCHAR(2) NULL DEFAULT NULL,
    `email` VARCHAR(50) NULL DEFAULT NULL,
    `salary` FLOAT NULL DEFAULT NULL,
    `cid` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`eid`),
    INDEX `c_e_cid` (`cid`),
    CONSTRAINT `c_e_cid` FOREIGN KEY (`cid`) REFERENCES `company` (`cid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

這裡寫圖片描述
company和emp是一對多的關係
2.通過幫助文件,建立核心MyBatis配置檔案generator.xml,
在該檔案中已經告訴MyBatis所連結的資料庫,所使用哪種方式對資料表進行對映。以及一些其他資訊。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 資料庫驅動包位置 -->
    <!-- <classPathEntry location="C:\Users\fangjiejie\.IntelliJIdea2016.1\config\jdbc-drivers\mysql-connector-java-5.1.35.jar" /> -->
    <classPathEntry location="C:\Users\fangjiejie\.IntelliJIdea2016.1\config\jdbc-drivers\mysql-connector-java-5.1.35-bin.jar" />
    <context id="mysqltools" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 資料庫連結URL、使用者名稱、密碼 -->
        <!-- <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/sy" userId="sypro" password="sypro"> -->
        <jdbcConnection driverClass="org.gjt.mm.mysql.Driver" 
            connectionURL="jdbc:mysql://127.0.0.1/test?useUnicode=true&amp;characterEncoding=utf-8" 
            userId="root" password="******">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置 -->
        <javaModelGenerator targetPackage="com.lyf.model" 
            targetProject="D:\web\mybitsUse">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成的對映檔案包名和位置 -->
        <sqlMapGenerator targetPackage="com.lyf.mapping" 
            targetProject="D:\web\mybitsUse">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.lyf.mapper" 
                targetProject="D:\web\mybitsUse">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成那些表(更改tableName和domainObjectName就可以)
            更復雜的方式如下: 但基本不常用
            <table tableName="tmenu" domainObjectName="Menu" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />

        -->
        <table tableName="company" domainObjectName="Company"  />
        <table tableName="emp" domainObjectName="Emp"  />
        <table tableName="user" domainObjectName="User"  />
    </context>
</generatorConfiguration>

3.將generator.xml文件和mybatis的jar 置於某個目錄下,本例目錄為:D:\web\mybitsUse
4.由java命令生成model,mappper
命令為:java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
這裡寫圖片描述
就會在當前目錄下生成我們需要的目錄com
這裡寫圖片描述
5.建立一個maven專案
在pom.xml中要加入jar包

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.31</version>
    </dependency>
        <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.1</version>
    </dependency>

6.將我們建立好的com目錄移到maven專案中,
7.建立好resources下的資源配置文件mybatis.cfg.xml
注意標清連結的資料庫,mapper對映之類

<?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="org.gjt.mm.mysql.Driver" />     

              <property name="url" value="jdbc:mysql://127.0.0.1/test?useUnicode=true&amp;characterEncoding=utf-8" />    

              <property name="username" value="root" />     

              <property name="password" value="******" />

            </dataSource>     

        </environment>     

    </environments>     
     <mappers>
         <mapper class="com.lyf.mapper.CompanyMapper"/>
         <mapper class="com.lyf.mapper.EmpMapper"/>
         <mapper class="com.lyf.mapper.UserMapper"/>

    </mappers>  


    </configuration>  

8.整個專案的目錄結構就建立好了這裡寫圖片描述
9.下面實現單表操作的增刪改查

package com.lyf.service;

import com.lyf.model.User;
import com.lyf.model.UserExample;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.util.List;

/**
 * Created by fangjiejie on 2017/5/29.
 */
public class UserServiceImp {
    SqlSessionFactory ssf;

    public UserServiceImp() {
        ssf=new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml"));
    }

    public static void main(String[] args) {
        new UserServiceImp();
    }
@Test
    public void add(){
        SqlSession sqlSession=ssf.openSession();
        User user=new User();
        user.setUsername("lyf");
        user.setPsw("hahaha");
        sqlSession.insert("com.lyf.mapper.UserMapper.insert",user);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void del(){
        SqlSession sqlSession=ssf.openSession();
        User user=new User();
        user.setId(8);
        sqlSession.delete("com.lyf.mapper.UserMapper.deleteByPrimaryKey",user);
        //sqlSession.delete("com.lyf.mapper.UserMapper.deleteByPrimaryKey",8);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void Update(){
        SqlSession sqlSession=ssf.openSession();
        User user=new User();
        user.setId(11);
        user.setUsername("hahahaaa");
        sqlSession.update("com.lyf.mapper.UserMapper.updateByPrimaryKeySelective",user);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void selectUser(){
        SqlSession sqlSession=ssf.openSession();
        UserExample userExample=new UserExample();
        userExample.createCriteria().andUsernameLike("l%");
        List<User> list= sqlSession.selectList("com.lyf.mapper.UserMapper.selectByExample",userExample);
        for(User u:list){
            System.out.println(u.getUsername());
        }
        sqlSession.close();
    }
}

10.下面演示主從表一對多,多對一的查詢
1.在Company類中新增屬性物件elist(emp的集合),並作getter和setter

 private Object elist;

    public Object getElist() {
        return elist;
    }

    public void setElist(Object elist) {
        this.elist = elist;
    }

在Emp類中新增物件屬性comp(company),並做getter和setter

private Object comp;

    public Object getComp() {
        return comp;
    }

    public void setComp(Object comp) {
        this.comp = comp;
    }

2.在mapper中新增修改對映關係,新增對映方法
CompanyMapper類

修改:
    @Select({
        "select",
        "cid, name, address, pro, city, price",
        "from company",
        "where cid = #{cid,jdbcType=INTEGER}"
    })
    @Results({
        @Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
        @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
        @Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
        @Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
        @Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
        @Result(column="price", property="price", jdbcType=JdbcType.REAL),
        @Result(property="elist",javaType = List.class,column="cid",
                many = @Many(select="com.lyf.mapper.EmpMapper.selectEmpByCom"))
    })
    Company selectByPrimaryKey(Integer cid);
新增selectComByEmp方法:

    @Select({
            "select",
            "cid, name, address, pro, city, price",
            "from company",
            "where cid = #{cid,jdbcType=INTEGER}"
    })
    @Results({
            @Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
            @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
            @Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
            @Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
            @Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
            @Result(column="price", property="price", jdbcType=JdbcType.REAL)
              })
    Company selectComByEmp(Integer cid);

EmpMapper類:

修改:
    @Select({
        "select",
        "eid, name, sex, email, salary, cid",
        "from emp",
        "where eid = #{eid,jdbcType=INTEGER}"
    })
    @Results({
        @Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
        @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
        @Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
        @Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
        @Result(column="salary", property="salary", jdbcType=JdbcType.REAL),
        @Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER),
            @Result(property = "comp",column="cid",
            one = @One(select="com.lyf.mapper.CompanyMapper.selectComByEmp"))
    })
    Emp selectByPrimaryKey(Integer eid);

新增selectEmpByCom方法:
    @Select({
            "select",
            "eid, name, sex, email, salary, cid",
            "from emp",
            "where cid = #{cid,jdbcType=INTEGER}"
    })
    @Results({
            @Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
            @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
            @Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
            @Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
            @Result(column="salary", property="salary", jdbcType=JdbcType.REAL),
            @Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER)
    })
    List<Emp> selectEmpByCom(Integer cid);

測試程式碼:

package com.lyf.service;

import com.lyf.model.Company;
import com.lyf.model.Emp;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.util.List;

/**
 * Created by fangjiejie on 2017/5/29.
 */
public class CompanyServiceImp {
    private SqlSessionFactory ssf;
    public CompanyServiceImp(){
        ssf= new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml"));
    }
    @Test
    public void queryEmpByCompany(){
        SqlSession session=ssf.openSession();
        Company company=new Company();
        company.setCid(1);
        Company company1=session.selectOne("com.lyf.mapper.CompanyMapper.selectByPrimaryKey",company);
        List<Emp> list=(List<Emp>)company1.getElist();
        for(Emp e:list){
            System.out.println(e.getName());
        }
        session.close();
    }
 //執行結果:
  MIKE
  JACK
    @Test
    public void queryComByEmp(){
        SqlSession session=ssf.openSession();
        Emp emp1=session.selectOne("com.lyf.mapper.EmpMapper.selectByPrimaryKey",4);
        List<Company> company=(List<Company>) emp1.getComp();
        System.out.println(company.get(0).getName());
        session.close();
    }

}
//執行結果:
京東