Spring整合MyBatis和MyBatis逆向工程

 

Spring整合MyBatis和MyBatis逆向工程

 

一、整合思路和准备

1.  集成思路

       需要spring来管理数据源信息。

        需要spring通过单例方式管理SqlSessionFactory。

        使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)

        持久层的mapper都需要由spring进行管理,spring和mybatis整合生成mapper代理对象

 2.  集成步骤

        ①jar包集成;

        ②配置文件集成(数据源);

        ③SqlSessionFactory集成;

        ④Mapper接口集成;

3.  搭建工程

新建java项目

            Spring整合MyBatis和MyBatis逆向工程_第1张图片

 

导入jar包

 

Spring整合MyBatis和MyBatis逆向工程_第2张图片

数据库

原型文件:db.properties和log4j.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root

jdbc.password=root

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

二、原始Dao整合

1.  PO类

        

public class User implements Serializable {

   //属性名和数据库表的字段对应
   private int id;
   private String username;// 用户姓名
   private String sex;// 性别
   private Date birthday;// 生日
   private String address;// 地址

   //用户创建的订单列表
   private List ordersList;
public class Orders {
   private Integer id;

   private Integer userId;

   private String number;

   private Date createtime;

   private String note;

   //用户信息
   private User user;

2.  DAO类

public interface UserDao {
   //根据id查询用户信息
   public User findUserById(int id) throws Exception;
}
/**
 * UserDaoImpl继承SqlSessionDaoSupport
 * 自动方法结束就关闭资源了,不需要再close关闭资源了
 * @author DreamWF
 *
 */
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

   @Override
   public User findUserById(int id) throws Exception {
      //继承SqlSessionDaoSupport,通过this.getSqlSession()得到sqlSessoin
      SqlSession sqlSession = this.getSqlSession();

      User user = sqlSession.selectOne("test.findUserById", id);

      return user;

   }
}

3.  Mapper映射文件:user.xml







    
    
    
    



4.  Mybatis的SqlMapConfig.xml




    
    
        
        
    

    
    
        
        
        
    

 

5.  Spring的applicationContext.xml



    
    
    
    
        
        
        
        
        
        
    

    
    
        
        
        
        
    

    
    
        
    

6.  测试代码

public class UserDaoImplTest {

   private ApplicationContext applicationContext;

   //SetUp这个方法得到Spring容器
   @Before
   public void setUp() throws Exception {
      applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
   }

   @Test
   public void testFindUserById() throws Exception {

      UserDao userDao=(UserDao) applicationContext.getBean("userDao");
      //调用userDao的方法
      User user=userDao.findUserById(1);
      System.out.println(user);

   }
}

三、Mapper整合

编写PO类、采用Mapper代理就不用写DAO了,MyBatis的配置文件不用管

1.  Mapper类、Mapper配置文件UserMapper.xml

 

public interface UserMapper {
   
   //根据id查询用户信息
   public User findUserById(int id) throws Exception;
}

 







    



2.  SqlMapConfig.xml

 





    
    


        
        

    

    
    
        
        

    

3.  applicationContext.xml

 

 



    
    
    
    
        
        
        
        
        
        
    

    
    
        
        
        
        
    

    
    
        
        
        

    






4.  测试类

 

package com.cjw.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.cjw.mapper.UserMapper;
import com.cjw.ssm.po.User;

public class UserDaoImplTest {

   private ApplicationContext applicationContext;

   //SetUp这个方法得到Spring容器
   @Before
   public void setUp() throws Exception {
      applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
   }

   @Test
   public void testFindUserById() throws Exception {

      UserMapper userMapper=(UserMapper) applicationContext.getBean("userMapper");
      //调用userDao的方法
      User user=userMapper.findUserById(1);
      System.out.println(user);

   }
}

 

四、MyBatis逆向工程

 

 

方式一:导入jar包

        逆向工程,这里采用代码生成

 

        下载逆向工程https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2

        使用方法  :

               ①创建generator配置文件;

               ②使用java类来执行逆向工程;

               ③把生成的代码拷贝到项目中。

               ④ 在正式项目中使用逆向工程生成的代码

        导入jar包

Spring整合MyBatis和MyBatis逆向工程_第3张图片

 

1.  配置文件:generatorConfig.xml

 





    
        
            
            
        
        
        
        
        

        
        
            
        

        
        
            
            
            
            
        
        
        
            
            
        
        
        
            
            
        
        
        

2.  运行java代码

 

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

public class GeneratorSqlmap {

   public void generator() throws Exception{

      List warnings = new ArrayList();
      boolean overwrite = true;
      //指定 逆向工程配置文件
      File configFile = new File("generatorConfig.xml");
      ConfigurationParser cp = new ConfigurationParser(warnings);
      Configuration config = cp.parseConfiguration(configFile);
      DefaultShellCallback callback = new DefaultShellCallback(overwrite);
      MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
            callback, warnings);
      myBatisGenerator.generate(null);

   }
   public static void main(String[] args) throws Exception {
      try {
         GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
         generatorSqlmap.generator();
      } catch (Exception e) {
         e.printStackTrace();
      }

   }

}

3.  使用生成的代码

 

如果正式项目中已经有po类所在的包了,那么就只需要拷贝po类到指定包下就可以。

如果正式项目中没有po包,那么就把逆向工程中整个po类的包拷贝过去。

Mapper.xml和mapper.java的拷贝与po类一样。

package cn.itcast.ssm.mapper;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.ssm.po.Items;
import cn.itcast.ssm.po.ItemsExample;

public class ItemsMapperTest {

   private ApplicationContext applicationContext;

   private ItemsMapper itemsMapper;

   //在setUp这个方法得到spring容器
   @Before
   public void setUp() throws Exception {
      applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
      itemsMapper = (ItemsMapper) applicationContext.getBean("itemsMapper");
   }

   //根据主键删除 
   @Test
   public void testDeleteByPrimaryKey() {

   }

   //插入
   @Test
   public void testInsert() {
      //构造 items对象
      Items items = new Items();
      items.setName("手机");
      items.setPrice(999f);
      itemsMapper.insert(items);
   }

   //自定义条件查询
   @Test
   public void testSelectByExample() {
      ItemsExample itemsExample = new ItemsExample();
      //通过criteria构造查询条件
      ItemsExample.Criteria criteria = itemsExample.createCriteria();
      criteria.andNameEqualTo("笔记本3");
      //可能返回多条记录
      List list = itemsMapper.selectByExample(itemsExample);

      System.out.println(list);

   }

   //根据主键查询
   @Test
   public void testSelectByPrimaryKey() {
      Items items = itemsMapper.selectByPrimaryKey(1);
      System.out.println(items);
   }

   //更新数据
   @Test
   public void testUpdateByPrimaryKey() {

      //对所有字段进行更新,需要先查询出来再更新
      Items items = itemsMapper.selectByPrimaryKey(1);

      items.setName("水杯");

      itemsMapper.updateByPrimaryKey(items);
      //如果传入字段不空为才更新,在批量更新中使用此方法,不需要先查询再更新
      //itemsMapper.updateByPrimaryKeySelective(record);

   }

}

注意事项

 

    Mapper.xml文件已经存在时,如果进行重新生成则mapper.xml文件时,内容不被覆盖而是进行内容追加,结果导致mybatis解析失败。

解决方法:删除原来已经生成的mapper xml文件再进行生成。

Mybatis自动生成的po及mapper.java文件不是内容而是直接覆盖没有此问题。

 

方式二:maven整合

Spring整合MyBatis和MyBatis逆向工程_第4张图片

pom.xml


	4.0.0
	com.cjw
	myBatisGenerator
	0.0.1-SNAPSHOT
	war
	
		3.2.8
		5.1.36
		5.1.28
		1.2.17
		
		UTF-8
	

	
		
		
			mysql
			mysql-connector-java
			${mysql-connector-java.version}
		
		  
          
            org.mybatis  
            mybatis  
            ${mybatis.version}  
        
		
			org.mybatis.generator
			mybatis-generator-core
			1.3.2
		
		   
          
            log4j  
            log4j  
            ${log4j.version}  
        
	
	
		
			
				
					org.apache.maven.plugins
					maven-compiler-plugin
					
						1.7
						1.7
					
					3.2
				
				
					org.mybatis.generator
					mybatis-generator-maven-plugin
					1.3.2
					
						
						src/main/resources/generatorConfig.xml
						true
					
				
			
		
	

generatorConfig.xml配置文件

 




    
        
            
            
            
        
        
        
        
        
        
            
        
        
        
            
            
        
        
        
            
        
        
        
            
        
        
        

 

运行java代码:GeneratorSqlmap.java

package com.cjw.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

public class GeneratorSqlmap {

	public void generator() throws Exception{

		List warnings = new ArrayList();
		boolean overwrite = true;
		//指定 逆向工程配置文件
		File configFile = new File("src/main/resources/generatorConfig.xml"); 
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(configFile);
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
				callback, warnings);
		myBatisGenerator.generate(null);

	} 
	public static void main(String[] args) throws Exception {
		try {
			GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
			generatorSqlmap.generator();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 

你可能感兴趣的:(框架)