MyBatis代码自动生成

Mybatis实现的是JDBC部分的功能

Mybatis入门程序

1、需求

·根据用户id查询一个用户信息
·根据用户名称模糊查询用户信息列表
·添加用户
·更新用户
·删除用户

2、环境

java 环境 :jdk1.8.0_77

开发工具 : IDEA 2016.1

数据库 : MySQL 5.7

Mybatis 运行环境( jar 包)

MySQL 驱动包

其他依赖包

3、log4j.properties

在工程里建一个config文件夹,转成资源目录,创建一个log4j.properties文本,写以下内容:

# Global logging configuration
#在开发环境日志级别要设置为DEBUG、生产环境要设置为INFO或者ERROR
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

Mybatis默认使用log4j作为输出日志信息。
4.bd.properties
jdbc.url=jdbc:mysql:///数据库名

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

5、SqlMapConfig.xml

配置 Mybatis 的运行环境、数据源、事务等




    
    
        
            
            
                
                
                
                
            
        
    
    
        
    


6、创建domain映射类

先创建一个com.company.domain包,然后创建一个User类,对应数据库里面的User表

package com.company.domain;

import java.util.Date;

/**
 * Created by Administrator on 2017/10/21.
 */
public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

7、Mapper接口
Mybatis 的 mapper 接口

编写mapper接口(相当于Dao接口,增删改查操作),定义增删改查方法,再编写 mapper.xml 映射文件,需遵循一些开发规范,mybatis 可以自动生成 mapper 接口类代理对象。

开发规范:

1.在 mapper.xml 中 namespace 等于 mapper 接口地址(所在包名的全路径)

2.在 xxxmapper.java 接口中的方法名要与 xxxMapper.xml 中 >statement 的 id 一致。
3.在 xxxmapper.java 接口中的输入参数类型要与 xxxMapper.xml >中 statement 的 parameterType 指定的参数类型一致。
4.在 xxxmapper.java 接口中的返回值类型要与 xxxMapper.xml 中 statement 的 resultType 指定的类型一致。
5.接口文件名要与xml映射文件名一致(UserMapper.java和UserMapper.xml)

代码实现:
parameterType:指定输入参数类型,mybatis 从输入对象中获取参数值拼接在 sql 中。如果是变量类型,写包名加类名
resultType:指定输出结果类型,mybatis 将 sql 查询结果的一行记录数据映射为 resultType 指定类型的对象。
创建com.company.mapper包,然后创建UserMapper接口

public interface UserMapper {
    public User findUserById(int id);
}

创建UserMapper.xml




    


主方法测试:

public static void main(String[] args) throws IOException {
        //创建sqlSessionFactory
        //Mybatis 配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入Mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建usermapper对象,mybatis自动生成代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用UserMapper的方法
        User user = userMapper.findUserById(1);
        System.out.println(user.getUsername());
    }

1、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 用于创建 SqlSessionFacoty,SqlSessionFacoty 一旦创建完成就不需要SqlSessionFactoryBuilder 了,因为 SqlSession 是通过 SqlSessionFactory 生产,所以可以将SqlSessionFactoryBuilder 当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

2、SqlSessionFactory

SqlSessionFactory 是一个接口,接口中定义了 openSession 的不同重载方法,SqlSessionFactory 的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理 SqlSessionFactory。

3、SqlSession

SqlSession 是一个面向用户的接口, sqlSession 中定义了数据库操作,默认使用 DefaultSqlSession 实现类。

8、单例模式的SqlSessionFactory

public class SqlSessionFactoryUtil {
    //首先创建静态成员变量sqlSessionFactory,静态变量被所有的对象所共享。
    public static SqlSessionFactory sqlSessionFactory = null;
    public static SqlSessionFactory getSqlSessionFactory() {
        //如果sqlSessionFactory没有被创建就读取全局配置文件,假如已经被创建过了,就使用已经存在的sqlsessionfactory。
        //这样就有了单例模式的效果
        if(sqlSessionFactory==null){
            String resource = "SqlMapConfig.xml";
            try {
                Reader reader = Resources.getResourceAsReader(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return sqlSessionFactory;
    }
}

主方法测试变为:

    public static void main(String[] args) throws IOException {
        //创建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建usermapper对象,mybatis自动生成代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用UserMapper的方法
        User user = userMapper.findUserById(1);
        System.out.println(user.getUsername());
    }

9、自定义别名:

在 SqlMapConfig.xml 中配置:(设置别名)




    
    
        
        
    
    
        
            
            
                
                
                
                
            
        
    
    
        
    


10、查找全部用户

UserMapper.java

public interface UserMapper {
    public User findUserById(int id);

    public List findAllUsers();
    //添加用户信息
    public int addUser(User user);

    //删除用户信息
    public int deleteUser(int id);

    public int updateUserById(User user);
}

UserMapper.xml




    
    <--由于已经设置 批量别名定义,扫描整个包下的类,所以此处只需要写类名即可以找到   -->
    


主方法测试

public static void main(String[] args) throws IOException {
        //创建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建usermapper对象,mybatis自动生成代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用UserMapper的方法
//        User user = userMapper.findUserById(1);
//        System.out.println(user.getUsername());
        List userList = userMapper.findAllUsers();
        for(User user : userList)
        {
            System.out.println(user.getUsername());
        }
    }

虽然 findAllUsers()的返回值类型是List,xml文件中resultType="User"即可。

新增用户

 
        
            select LAST_INSERT_ID()
        
        insert into user(username, birthday, sex, address)
        values(#{username}, #{birthday}, #{sex}, #{address})
    

主函数

   User user = new User();
        SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
        user.setUsername("田志");
        user.setSex("男");
        user.setBirthday(sdf.parse("2016-11-29"));
        user.setAddress("江西南昌");
        userMapper.addUser(user);
        System.out.println(user.getId());
        sqlSession.commit();

增删改操作需要 sqlSession.commit();

自增主键返回

MySQL 自增主键:执行 insert 提交之前自动生成一个自增主键,通过 MySQL 函数获取到刚插入记录的自增主键: LAST_INSERT_ID() ,是在 insert 函数之后调用。

删除用户

  
        delete from user where user.id = #{id}
    

     userMapper.deleteUser(1);
        sqlSession.commit();

更新用户

    
        update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where user.id = #{id}
    

    SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");

        User user = new User();
        //根据id更新用户信息
        user.setId(24);
        user.setUsername("张四风2");
        user.setBirthday(sdf.parse("2015-01-12"));
        user.setSex("女");
        user.setAddress("上海黄埔");

        userMapper.updateUserById(user);

        //提交事务
        sqlSession.commit();

模糊查找用户方法1:

    

 User user = new User();
        user.setSex("1");
        user.setUsername("%张%");

        //调用UserMapper的方法
        List list = userMapper.findUserList(user);

        for(User u : list)
        {
            System.out.println(u.getUsername());
        }

模糊查找用户方法2:

    

 User user = new User();
        user.setSex("1");
        user.setUsername("张");

        //调用UserMapper的方法
        List list = userMapper.findUserList(user);

        for(User u : list)
        {
            System.out.println(u.getUsername());
        }

查找user表记录数

    

      int count = userMapper.findUserCount();
        System.out.println(count);

动态 SQL

通过mybatis提供的各种标签方法实现动态拼接sql。

 

测试代码:因为设置了动态的sql,如果不设置某个值,那么条件就不会拼接在sql上

所以我们就注释掉设置username的语句

        User user = new User();
//        user.setSex("1");
        user.setUsername("%张%");

        //调用UserMapper的方法
        List list = userMapper.findUserList2(user);

        for(User u : list)
        {
            System.out.println(u.getUsername());
        }

Sql 片段

通过上面的其实看到在 where sql语句中有很多重复代码,我们可以将其抽取出来,组成一个sql片段,其他的statement就可以引用这个sql片段,利于系统的开发。

这里我们就拿上边sql 中的where定义一个sq片段如下:

 
        
            and user.sex = #{sex}
        
        
            and user.username like  #{username}
        
    

那么我们该怎样引用这个sql片段呢?如下:

select * from user
        
        
            
        

多表连接

再创建一个订单信息表

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);

    public List> getAllOrderInfo();

    

       List> mapList = userMapper.getAllOrderInfo();
        for(Map map : mapList)
        {
            System.out.println("---------------");
            for(Map.Entry entry : map.entrySet())
            {
                System.out.println(entry.getKey()+" "+entry.getValue());
            }

        }

代码

案例代码

代码自动生成

利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件。这样可以大大节约开发时间,将生成的代码copy到项目工程中即可。

要想实现代码的自动生成,首先要下载一个工具:http://download.csdn.net/detail/u010608551/9434523,下载后解压zip文件,解压后的目录应该是如下的效果:

MyBatis代码自动生成_第1张图片
image

其中有mybatis框架的jar包,数据库驱动程序jar包以及MyBatis生成器jar包。其中的generatorConfig.xml是需要我们来配置的文件,先将文件用记事本打开改成utf-8文件,然后把该文件拖至Itellijie,修改配置成如下,然后保存,关闭该文件,将该文件改回ANSI格式:

  
  
  
  
      
      
          
              
              
              
          
          
          
          
          
              
          
          
          
              
              
          
          
          
              
          
          
          
              
          
          
        

其中的数据库名称,用户名,密码以及表表根据自己的具体情况来修改,配置中的targetProject是目标文件夹,不会自动生成,需要自己创建,然后把路径配好。

配置文件写好以后,打开cmd,将目录切换到lib目录下,执行脚本:java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite

然后就可以在src目录下找到相应的文件,每个数据库表都会对应三个文件(实体类、接口、配置文件)。

MyBatis代码自动生成_第2张图片
image
MyBatis代码自动生成_第3张图片
image

你可能感兴趣的:(MyBatis代码自动生成)