关于配置数据库可以参考上一篇文章,这里只讲mybatis

pom.xml



[html]  view plain  copy

1. <!-- 引入mybatis -->  
2. <dependency>  
3. <groupId>org.mybatis.spring.boot</groupId>  
4. <artifactId>mybatis-spring-boot-starter</artifactId>  
5. <version>1.3.0</version>  
6. </dependency>  
7. <!-- mybatis分页插件 -->  
8. <dependency>  
9. <groupId>com.github.pagehelper</groupId>  
10. <artifactId>pagehelper-spring-boot-starter</artifactId>  
11. <version>1.1.1</version>  
12. </dependency>

基本SQL操作


spring boot已经自动实现了mybatis所有配置,直接写dao接口即可操作数据库。


[java]  view plain  copy


    1. @Mapper  
    2. public interface MybatisDao {  
    3. @Select("select * from  user where id = #{id}")  
    4. public List<User> findById(User param);


    @Mapper:声明一个mybatis的dao接口,会被spring boot扫描到


    @Select:声明一个查询方法,相应的增删改使用@Insert @Delete@Update


    List<User>:返回集合。如果只返回一个结果,返回值是User。如果是增删改方法返回值是int


    User param:传参,#{id}就是param对象的id值


    扫描Mapper


    [java]  view plain  copy


    1. @MapperScan("hello.dao")  

    在配置类上添加以上注解,可以扫描dao包中的所有接口,替代在每个dao中写@Mapper注解,不过这样会提高耦合度。而@Mapper可以与dao自成一体,与@Controller、@Service遥相呼应,整体结构更优雅


    驼峰命名

    在properties中添加以下配置,在执行查询后,可以将数据库的NN_NN格式字段,在java结果集对象中自动转换成驼峰命名参数



    [plain]  view plain  copy


    1. mybatis.configuration.mapUnderscoreToCamelCase=true


    结果映射@Results


    如果结果集不是JAVA对象而是Map,map中的列名会和数据库中的NN_NN一样,是不会自动驼峰转换的。可以使用@Result来指明结果映射,同样也适用JAVA对象


    [java]  view plain  copy


    1. @Results({  
    2. @Result(property="nnNn",column="NN_NN")      
    3. })  
    4. @Select("select * from  user")      
    5. public List<Map> findAll();

    使用List<Map>不用去维护pojo,适于用数据库字段不确定或经常变化的场景。但是程序的可读性、可维护性不如List<User>


    可复用的@Results


    声明时给id赋值为user


    [java]  view plain  copy

    1. @Results(id="user",value={  
    2. @Result(property="nnNn",column="NN_NN")  
    3. })

    在其他 方法中,重复使用id为user的结果映射


    [java]  view plain  copy


    1. @ResultMap("user")  


    打印SQL日志到控制台


    在application.properties中添加以下配置


    [plain]  view plain  copy

    1. logging.level.你的包名.mybatis接口包=debug


    执行SQL时,会在控制台打印SQL日志



    java mybaits plus 动态添加表修改表 springboot mybatis 动态添加字段_SQL



    第一行:==>左边是执行SQL的接口及其方法,右边是执行语句


    第二行:传参数1,String类型


    第三行:查到一行数据


    分页


    首先要在pom.xml中引入文章开头的分页插件,分页逻辑写在service层。


    [java]  view plain  copy


    1. @Service  
    2. @Transactional  
    3. public class HelloServiceImpl {  
    4. @Autowired  
    5.     MybatisDao mybatisDao;  
    6.       
    7. public void find(){    
    8. //分页插件: 查询第1页,每页10行  
    9. 1, 10);    
    10.         mybatisDao.findAll();    
    11. //数据表的总行数  
    12.         page.getTotal();  
    13. //分页查询结果的总行数  
    14.         page.size();  
    15. //第一个User对象,参考list,序号0是第一个元素,依此类推  
    16. 0);  
    17.     }


    执行原理:PageHelper.startPage会拦截下一个sql,也就是mybatisDao.findAll()的SQL。并且根据当前数据库的语法,把这个SQL改造成一个高性能的分页SQL,同时还会查询该表的总行数,具体可以看SQL日志。


    PageHelper.startPage和mybatisDao.findAll()最好紧跟在一起,中间不要有别的逻辑,否则可能出BUG。


    Page<User> page:相当于一个list集合,findAll()方法查询完成后,会给page对象的相关参数赋值


    回传ID


    假设数据库表的ID主键是自动增长的,现在添加一条数据,想要得到这条数据自动增长的ID,方法如下


    dao层


    useGeneratedKeys=true:获取数据库生成的主键


    keyProperty="id":把主键值存入User param对象的id属性


    [java]  view plain  copy


      1. @Insert("insert into user(name) values(#{name})")  
      2. @Options(useGeneratedKeys=true,keyProperty="id")   
      3. public int add(User param);


      service层


      [java]  view plain  copy

      1. User user = new User();  
      2. user.setName("tom");  
      3. mybatisDao.add(user);  
      4. System.out.println("回传ID值:"+user.getId());


      控制台


      java mybaits plus 动态添加表修改表 springboot mybatis 动态添加字段_User_02


      存储过程


      这是一个mysql存储过程,传入一个id值,根据这个id查询出name值并且做为传出参数


      [sql]  view plain  copy


      1. DELIMITER $$  
      2. CREATE PROCEDURE `hello`(IN id_in VARCHAR(10),OUT name_out VARCHAR(10))  
      3. BEGIN  
      4. SELECT NAME INTO name_out FROM USER WHERE id=id_in;  
      5. END$$  
      6. DELIMITER ;


      dao层


      mode=IN:传入参数,就是user.id


      mode=OUT:传出参数,就是user.name


      StatementType.CALLABLE:说明这是一个存储过程


      [java]  view plain  copy


        1. @Select("call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})")  
        2. @Options(statementType= StatementType.CALLABLE )  
        3. public void call(User user);


        service层


        [java]  view plain  copy


          1. public void call(){  
          2. new User();  
          3. "14");  
          4.     mybatisDao.call(user);  
          5.     System.out.println(user.getName());


          执行结果


          java mybaits plus 动态添加表修改表 springboot mybatis 动态添加字段_java_03

          • 上一篇 maven(18)-mybatis generator插件