博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring+MyBatis整合
阅读量:6469 次
发布时间:2019-06-23

本文共 10460 字,大约阅读时间需要 34 分钟。

一、准备工作

  1.1准备jar包

  

  

  

  建表语句:

CREATE TABLE `t_customer` (  `id` int(32) NOT NULL AUTO_INCREMENT,  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `jobs` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `phone` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

 

 

  1.2编写配置文件:

    1.2.1db.properties   

#dataSource#Thu Mar 07 16:27:40 CST 2019jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/smjdbc.username=rootjdbc.password=123456jdbc.maxTotal=30jdbc.maxIdle=10jdbc.initialSize=5

 

    1.2.2 beans.xml    

 

    1.2.3 mybatis-config.xml  

 

  

 二、基于Dao方式整合

  2.1在src目录下创建com.sm.po包,并在包中创建Customer类

  Customer.java

package com.sm.po;public class Customer {    private Integer id;    private String username;    private String jobs;    private String phone;    public Customer() {        // TODO Auto-generated constructor stub    }    public Customer(Integer id, String username, String jobs, String phone) {        super();        this.id = id;        this.username = username;        this.jobs = jobs;        this.phone = phone;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getJobs() {        return jobs;    }    public void setJobs(String jobs) {        this.jobs = jobs;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    @Override    public String toString() {        return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";    }}

 

    2.2在com.sm.po包中创建CustomerMapper.xml文件  

 

    2.3在mybatis-config.xml中添加映射文件(CustomerMapper.xml)

mybatis-config.xml

 

    2.4创建一个com.sm.dao包,并在其中创建CustoemrDao接口 

package com.sm.dao;import com.sm.po.Customer;public interface CustomerDao {    public Customer findCustomerById(Integer id);}

 

    2.5创建一个com.sm.dao.impl包,并在其中创建CustomerDao接口的实现类CustomerDaoImpl.

package com.sm.dao.impl;import org.mybatis.spring.support.SqlSessionDaoSupport;import com.sm.dao.CustomerDao;import com.sm.po.Customer;public class CustomerDaoImpl extends SqlSessionDaoSupport implements CustomerDao{    @Override    public Customer findCustomerById(Integer id) {        return this.getSqlSession().selectOne("com.sm.po.CustomerMapper.findCustomerById",id);    }}

继承了SqlSessionDaoSupport,通过getSqlSession()获取sqlSession,并执行指定SQL语句。

获取SqlSession首先需要设置SqlSessionFactory,SqlSessionFactory通过spring注入。

    SqlSessionDaoSupport :部分源码

      

       Spring就是通过set方法将SqlSessionFactory注入,然后获取sqlSession。  

 

 

    2.6 在beans.xml中将SqlSessionFactory注入   

 

     2.7测试 

package com.sm.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.sm.dao.CustomerDao;import com.sm.dao.impl.CustomerDaoImpl;import com.sm.po.Customer;public class DaoTest {    public static void main(String[] args) {        ApplicationContext act = new ClassPathXmlApplicationContext("beans.xml");        CustomerDao cus = (CustomerDaoImpl)act.getBean("customerDao");        Customer custoemr =  cus.findCustomerById(1);        System.out.println(custoemr);    }}

 

 

三、基于Mapper接口方式整合

  采用基于Dao方式整合可以实现所需功能,但是也有一定的问题,例如执行语句的路径容易写错。    

    那么有什么方式可以将xxxxMapper.xml中语句的ID与Dao中的方法直接关联起来,这样调用方法时直接调用就可以了,

  避免了自己编写语句路径出错。

  基于Mapper接口方式整合就可以达到这种目的。

  

  3.1在src目录下创建com.sm.mapper包,并在其中创建CustomerMapper.java和其映射文件CustomerMapper.xml。

 

CustomerMapper.java  

package com.sm.mapper;import com.sm.po.Customer;public interface CustomerMapper {    public Customer findCustomerById(Integer id);    public void addCustomer(Customer customer);}

 

CustomerMapper.xml

    

    3.2在mybatis-config.xml中配置<mapper resource = "com/sm/mapper/CustomerMapper.xml"/> 

  

    3.3在beans.xml中将映射文件和接口关联起来

  

 

    测试:

package com.sm.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.sm.mapper.CustomerMapper;import com.sm.po.Customer;public class MapperTest {    public static void main(String[] args) {        ApplicationContext act = new ClassPathXmlApplicationContext("beans.xml");        CustomerMapper customerMapper = act.getBean("customerMapper",CustomerMapper.class);        Customer customer =  customerMapper.findCustomerById(1);        System.out.print(customer);    }}

 

 

注:基于Mapper接口整合还需遵循以下规范:

  Mapper接口的名称和对应的Mapper.xml文件的名称必须保持一致。

  Mapper.xml文件中的namespace与Mapper接口的类路径要一致,即这两个文件是放在一个包中的。

  Mapper接口中的方法和Mapper.xml中定义的sql语句的id要相同。

  Mapper接口方法中的参数类型要与Mapper.xml中对应语句的类型(parameterType)相同。

  Mapper接口方法的返回值与Mapper.xml中对应语句的返回值类型(resultType)要相同。

  

  如果以上规范都遵循了,MyBatis就会自动生成Mapper接口实现类的代理对象,从而简化开发。

  而且遵循了以上规范,可以不用再mybatis-config.xml中执行映射文件(<mapper resource = "xxx"/>)

 

三、基于MapperScannerConfigurer的整合

  采用Mapper接口方式整合比基于Dao方式整合方便些,但是依然需要在配置文件(beans.xml)中编写大量配置。

  那有没有更方便的方式呢,只需要指定接口和映射文件即可。

  基于MapperSacnnerConfigurer就可以实现这一点。

  我们将 基于Mapper接口实现整合中beans.xml中的关联部分删除。

 

beans.xml 

  采用自动扫描就可以省去繁琐的配置,使接口类和映射文件自动关联。

 

 

 

四、测试事务

   4.1 将com.sm.mapper包中CustomerMapper.java和CustomerMapper.xml中加入添加方法。

  

CustomerMapper.java  

package com.sm.mapper;import com.sm.po.Customer;public interface CustomerMapper {    public Customer findCustomerById(Integer id);    public void addCustomer(Customer customer);}

 

CustomerMapper.xml

insert into t_customer(username,jobs,phone) values(#{username}, #{jobs}, #{phone})

 

  4.2创建com.sm.service包,并创建CustomerService接口  

package com.sm.service;import com.sm.po.Customer;public interface CustomerService {    public void addCustomer(Customer customer);}

  

  4.3创建com.sm.serviceImpl包,并创建CustomerServiceImpl实现类  

package com.sm.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.sm.mapper.CustomerMapper;import com.sm.po.Customer;import com.sm.service.CustomerService;@Servicepublic class CustomerServiceImpl implements CustomerService{    @Autowired  //按类型装配,使用注解自动注入    private CustomerMapper customerMapper;    //@Transactional //事务    @Override    public void addCustomer(Customer customer) {        customerMapper.addCustomer(customer);        int i = 1/0;    }}

  首先注释掉事务,如果没有事务addCustomer方法及时int i = 1/0报错,插入语句也会成功将数据插入。

  如果有事务,int i = 1/0报错,插入也会失败。此处注释事务,比较注释前后区别。

 

  4.4在beans.xml中采用自动扫描方式注册bean

 beans.xml 

 

    测试:

package com.sm.test;import org.springframework.context.ApplicationContext;import com.my.util.MyBatisUtil;import com.sm.mapper.CustomerMapper;import com.sm.po.Customer;import com.sm.service.CustomerService;import com.sm.service.impl.CustomerServiceImpl;public class TransactionTest {    public static void main(String[] args) {        ApplicationContext act = MyBatisUtil.getApplicationContext("beans.xml");        CustomerService cs = act.getBean(CustomerService.class);        cs.addCustomer(new Customer(10, "hhh", "stu", "177xxxx1234"));    }}

没有注释事务注解,方法执行失败,但数据仍然会被插入表中。

我们将事务的注释去掉,再运行会发现方法执行失败,但数据不会被插入表中。 

  

 

转载于:https://www.cnblogs.com/huang-changfan/p/10492373.html

你可能感兴趣的文章
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
SQL性能优化:如何定位网络性能问题
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
RPC框架Thrift例子-PHP调用C++后端程序
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
Go的基本示例
查看>>
js判断移动端是否安装某款app的多种方法
查看>>