2022.1.17-18 Javaweb Mybatis快速入门完成增删改查

2022.1.17-18 Javaweb Mybatis快速入门完成增删改查,第1张

2022.1.17-18 Javaweb Mybatis快速入门完成增删改查

Mybatis
Mybatis是持久层框架,简化JDBC开发。

create database mybatis;
use mybatis;

drop table if exists tb_user;

create table tb_user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	gender char(1),
	addr varchar(30)
);



INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');



pom.xml



    4.0.0

    org.example
    mybatis-demo
    1.0-SNAPSHOT
    
    
        org.mybatis
        mybatis
        3.5.5
    
        
            mysql
            mysql-connector-java
            5.1.46
        
        
            junit
            junit
            4.13
            test
        

        
        
            org.slf4j
            slf4j-api
            1.7.20
        
        
        
            ch.qos.logback
            logback-classic
            1.2.3
        
        
        
            ch.qos.logback
            logback-core
            1.2.3
        
    

mybatis-config.xml




    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

UserMapper.xml






    
        select * from tb_brand;


    


最后在test中新建MyBatisTest.java

package com.itest.pojo;





import com.itest.mapper.BrandMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;



public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        //加载核心配置文件,获取sqlsessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //获取sqlsession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //执行方法
        List brands = brandMapper.selectAll();
        System.out.println(brands);

        //释放资源
        sqlSession.close();
    }
}

结果显示如下:

有字段显示为null。因为Java中驼峰命名与数据库名称不一致。
解决方案有以下两种:

1.对不一样的列名起别名,让别名和实体类的属性一样。

    
        select
             
        from tb_brand;
    

2.用resultmap来解决

    
        
        
    

    
        select *
        from tb_brand;
    
    
    select * from tb_brand where id = #{id};

XML中<会报错,解决方法有两种
1.转义字符  如<的转义字符为<     
2.CDATA区  如小于号如下:
    

条件查询-多条件查询

1.散装参数格式:注意@Param(" xxx")中xxx需要对应占位符名称 status = #{ status }
2.如果都来自同一对象,则 ListselectByCondition(Brand brand); 这样 status = #{ status } 就会到对象brand中去匹配属性。
3.封装成map,map键的名称与占位符保持一致,ListselectByCondition(Map map);

代码实现:
1.
BrandMapper.xml代码

    
            select * from tb_brand
            where status = #{status}
                and brand_name like #{brandName}
                and company_name like #{companyName}
    

BrandMapper.java

public interface BrandMapper {
    List selectByCondition(Brand brand);
    }

MyBatisTest.java

 //模拟接收参数
        int status =1;
        String brandName = "华为";
        String companyName = "华为";
        //处理参数
        brandName ="%"+brandName+"%";
        companyName = "%"+companyName+"%";
        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setBrandName(companyName);
        brand.setCompanyName(brandName);
        ···
         List brands =  brandMapper.selectByCondition(brand);

        System.out.println(brands);

结果

3.
BrandMapper.xml中不需要修改

    
            select * from tb_brand
            where
              
                  status = #{status}
              
              
                  and brand_name like #{brandName}
              
              
                  and company_name like #{companyName}
              
    

其中Sting类型 判断条件是:不等于空,也不等于空字符串

新问题:如果status为空 则 后面语句格式不对 报错

org.apache.ibatis.exceptions.PersistenceException: ### Error
querying database. Cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an
error in your SQL syntax

改进方法1:恒等式  统一加and
    
            select * from tb_brand
       
              
                  and status = #{status}
              
              
                  and brand_name like #{brandName}
              
              
                  and company_name like #{companyName}
              
       
    

单条件-动态条件查询
BrandMapper.java

public interface BrandMapper {
    List selectSingleCondition(Brand brand);
    }

BrandMapper.xml