利用mybatis实现增删改查

本文详细介绍了一个使用MyBatis框架进行数据库操作的小项目实践过程,包括搭建环境、配置文件、单表操作以及主从表关联查询等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:
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>
            
            
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          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();
                          }
                      
                      }
                      //运行结果:
                      京东

                      转自:http://blog.youkuaiyun.com/stubbornaccepted/article/details/72808766

                      评论
                      添加红包

                      请填写红包祝福语或标题

                      红包个数最小为10个

                      红包金额最低5元

                      当前余额3.43前往充值 >
                      需支付:10.00
                      成就一亿技术人!
                      领取后你会自动成为博主和红包主的粉丝 规则
                      hope_wisdom
                      发出的红包
                      实付
                      使用余额支付
                      点击重新获取
                      扫码支付
                      钱包余额 0

                      抵扣说明:

                      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                      余额充值