学习springboot第3步,Mybatis操作数据库1

     关于springboot操作数据库的方式,有Hibernate + JPA 的方式,前面已经说过了。但是,Mybatis好像也蛮火的。这里也算是探索一回吧。这里演示所用的数据库是sqlserver2008

    整体目录结构,大概这样子

    学习springboot第3步,Mybatis操作数据库1_第1张图片

    使用Mybatis第一件事就是导入jar包,具体做法就是修改pom文件嘛。


        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.3.1
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
     
  
		
			com.microsoft.sqlserver
			sqljdbc4
			4.0
		

		
    		com.alibaba
    		druid
    		1.1.0
		
	

      与导入无关的内容,这里拿掉了。其中druid节点是连接池需要用到的,这个不知道的,可以慢慢了解。

      首先还是来看看springboot的启动文件,在类的属性中,多了一个MapperScan属性。在springboot启动过程中,扫描mybatis相关类。做的事情无非是建立数据库连接,开启连接池等等。帮开发人员做了很多事情哦,至于具体怎么做的,初学者可以慢慢学习与研究。从无到有是一个循序渐进的过程。

package com.springboot;

import java.util.Collections;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
@MapperScan("com.springboot.repository")   //扫描这个路径下的类
public class MybatisApplication {

	public static void main(String[] args) {
		
		SpringApplication app = new SpringApplication(MybatisApplication.class);
		app.setDefaultProperties(Collections.singletonMap("server.servlet.context-path", "/webapp"));
		app.run(args);
		
	}
}

     Mybatis的作用就是帮助开发人员方便、快速操作数据库。所以我们最需要掌握i恐怕就是下面这个操作数据库的接口类,各种业务的数据库操作,包括增加,删除,修改,查询,都与这个类息息相关。代码也简单。

package com.springboot.repository;

import java.util.List;

import com.springboot.entity.ProductOrder;

public interface ProductOrderRepository {

	int del(String id);

    int insert(ProductOrder p);

    int update(ProductOrder p);
    
    ProductOrder getProductOrder(String id);
    
    List getAllProductOrder();
}

     这个跟Hibernate 的JPA感觉很类似,也只是一个接口。interface大家都知道,是没有实现代码的。没有实现代码不表示没有实现,这个接口里的方法,Mybatis都帮你实现了。与Hibernate不同的是,Mybatis还必须有一个与这个类相关联的xml文件。文件内容大概如下。





    
        
        
        
        
    
    
    
        id, name,price,pDate
    
    
    
        delete from t_ProductOrder where id = #{id}
    
    
    
        insert into t_ProductOrder values (#{id}, #{name}, #{price},#{pDate})
    
   
    
        update t_ProductOrder
        
            
                name = #{name},
            
            
                price = #{price},
            
            
                pDate = #{pDate},
            
        
        where id = #{id}
    
    
    
   
    

      mapper标签中的namespace必须与上面的数据库操作类的路径严格对应,多不得,少不得。resultMap标签是查询方法返回数据集格式。其中column是数据库表的列,而property是实体类的属性。javaType是数据类型。这里数字,日期,字符都枚举了一下,多数场景也就这三种类型了。这里返回的数据集只限于一个表或者一个视图。当然,如果业务需,是可以实现多表关联联查询的,Mybatis也是支持的。这里就不多说了,贪多嚼不烂。

     下面这四个标签,insert,update,delete\select,很明显是对应四种数据库操作SQL语句,还可以带参数的哦。四种标签的id就是接口类中的方法名,两种严格对应。运行过程中,Mybatis框架执行的就是这个SQL语句了。这样一来,相对Hibernate,效率理所当然的高了。这也是无数的mybatis粉丝坚定是使用mybatis的理由哦。

     实体类代码没有任何逻辑,与XML文件中resultMap节点对应,算是接口和XML之间的桥梁。

package com.springboot.entity;

import java.util.Date;

public class ProductOrder {
	
    private String id;

    private String name;

    private float price;

    private Date pDate;
    
    public String getId() {
        return id;
    }

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

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return this.price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public Date getPDate() {
        return this.pDate;
    }

    public void setPDate(Date pDate) {
        this.pDate = pDate;
    }
}

     在刚开始使用Mybatis的时候,很容易遇到 Invalid bound statement (not found) 错误。这个就是数据库操作类和XML文件之间的没对应上。要不就是XML文件不存在,要不就是namespace路径写错了,要不就是列名或者属性写错了,总而言之,言而总之,就是个低级错误,仔细检查一定能发现问题所在。

    最后,强调一下,这个文件的位置在 resources/mapper目录下。不要随便放别的目录下,也没必要为了放别的目录下,而去想各种办法。

      这个XML文件也可以省去,不过接口写法不一样,这里不说了,初学者先搞清楚一种模式吧。

      后面的Controller和Service没有特别的,这里也贴一下代码,方便那些想运行代码的童鞋。

      首先是接口类,这个接口其实可以有,也可以没有。直接写个实现类也是可以的。

package com.springboot.service;

import java.util.List;

import com.springboot.entity.ProductOrder;

public interface IProcducOrderService {
	
    ProductOrder getProductOrderById(String id);

    int addProductOrder(ProductOrder m);
    
    List getAllProductOrder();

}

下面的实现类代码基本上没啥特殊的,稍微不同一点就是通过 @Resource的方式来调用 Repository下的数据库操作类。

@Resource和@Autowired这个两个东西感觉差不多,@Autowired属于Spring框架,而@Resource属于一个是java自己的东西。有兴趣可以自行研究,这里不多说了,因为我们的重点是Mybatis

package com.springboot.service;

import org.springframework.stereotype.Service;
import com.springboot.entity.ProductOrder;
import com.springboot.repository.ProductOrderRepository;

import java.util.List;

import javax.annotation.Resource;

@Service
public class ProductOrderServiceImpl implements IProcducOrderService {

    @Resource
    private ProductOrderRepository db;

    @Override
    public ProductOrder getProductOrderById(String id)
    {
    	return db.getProductOrder(id);
    }

    @Override
    public int addProductOrder(ProductOrder m)
    {
    	
    	return db.insert(m);
    }
    
    @Override
    public List getAllProductOrder()
    {
    	return db.getAllProductOrder();
    	
    }

}

最后是面向前端Controller类,这个类也没有特别的地方,就不多说了。

package com.springboot.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;  
import com.springboot.entity.ProductOrder;
import com.springboot.service.IProcducOrderService;

@RestController
@RequestMapping("/product")
public class ProductOrderController {
	
    @Resource
    private IProcducOrderService procductService;

    @RequestMapping("/query")
    @ResponseBody
    public ProductOrder query(HttpServletRequest request){
        
    	String id = request.getParameter("id");
        
        return this.procductService.getProductOrderById(id);
    }

    @RequestMapping("/getall")
    @ResponseBody
    public List getall()
    {
        return this.procductService.getAllProductOrder();
    }
    
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    @ResponseBody
    public String save(ProductOrder m)
    {
    	UUID uuid = UUID.randomUUID(); 
    	
    	m.setId(uuid.toString()); //guid 不要说不知道什么是guid哦
        
    	int i = this.procductService.addProductOrder(m);
        
        return "{'success' : true,'msg':'','count':'"+ i +"'}".replaceAll("'","\"");
    }
}

     当然,这里并没有把Repository接口类中定义几个方法全部实现,还有的方法,有兴趣的童鞋可以自己补齐。

     最后,把测试用到的index.html文件中的html代码,也发在这里。这样一个完整的流程就走通了。注意一点,这个静态文件的路径是在resources/static目录下。同样没有必要把这个文件随便放到别的目录去。





springboot服务接口测试




    
    
    

    系统运行是需要数据库支撑的,下面是数据库的建表语句。

CREATE TABLE [dbo].[t_ProductOrder](
    [id] [varchar](50) NOT NULL,
    [name] [varchar](50) NULL,
    [price] [float] NULL,
    [pDate] [datetime] NULL)

     关于数据库的表,如果规范一点,至少应该搞个主键什么的。因为不是重点就不搞了。上面的那个XML文件也是根据表来的。

     最后不能忘记的是,在resources目录下配置文件,application.properties。

#port
server.port=8181

# mybatis 
# mybatis.type-aliases-package=com.springboot.entity
mybatis.mapper-locations=classpath:mapper/*.xml
#mybatis.configuration.map-underscore-to-camel-case=true

#sqlserver
spring.datasource.url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=yourdatabase
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

       当然,配置文件也可以是 application.yml,不一样的格式,一样的结果。本人习惯application.properties

       为了避免运行时出幺蛾子,浪费时间,这里放出所有代码。我是不是一个好人啊?哈哈

       如果所有代码都复制好了,启动springboot,在浏览器中访问一下 http://localhost:8181/webapp/index.html 

     点add,再点查询,应该是下面这个效果

    学习springboot第3步,Mybatis操作数据库1_第2张图片     

     也可以用浏览器直接访问Controller里面的方法,http://localhost:8181/webapp/product/query?id=1这个自己去尝试一下吧。

     以前写的博文都是把本地运行的代码做为附件,直接发上来了,方便大家运行嘛。但是又感觉这样不好,不折腾两下是没学习效果的。还有一部分人,只需要看看代码,参考一下思路就行。所以这回不传了。实在想试试代码效果的,就麻烦点,一个个类复制吧。也是一个学习过程嘛。

  如果文中发现有什么差错,请下面留言好了。关于springboot,共同学习,共同进步。

你可能感兴趣的:(技术)