Mybatis入门例子

MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

本教程是maven项目、不会maven的开这个文章!-----Maven教程
  • 开发工具:idea
  • 语言:java
  • 项目结构:maven项目
  • 看注释学习!!!
  • mysql数据库


1.1、先来个简单的、入门程序!

Mybatis入门例子_第1张图片Mybatis入门例子_第2张图片

目录结构(怕一些因为文件路径错误、所有不要原版不动拷贝、要理解!)

1.1、db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=用户名
jdbc.password=密码

1.1.1SQL语句、数据表

/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/
/*Table structure for table `items` */

CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名称',
  `price` float(10,1) NOT NULL COMMENT '商品定价',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
  `createtime` datetime NOT NULL COMMENT '生产日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Table structure for table `orderdetail` */

CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */

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;

/*Table structure for table `user` */

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

插入数据:

/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/
/*Data for the table `items` */

insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2016-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2016-02-06 13:23:02');

/*Data for the table `orderdetail` */

insert  into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);

/*Data for the table `orders` */

insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2016-02-04 13:22:35',NULL),(4,1,'1000011','2016-02-03 13:22:41',NULL),(5,10,'1000012','2016-02-12 16:13:23',NULL);

/*Data for the table `user` */

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2016-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);



1.2、pom.xml文件


    4.0.0
    web-test-com
    MyBatis
    0.0.1-SNAPSHOT
    war

    


        
            junit
            junit
            4.12
            provided
        

        
            log4j
            log4j
            1.2.17
        

        
            org.mybatis
            mybatis
            3.1.1
        
        
            mysql
            mysql-connector-java
            5.1.38
        

    




1.3、SqlMappingConfig.xml文件





	
	
		
		
	

	
	

	
		
		
		
		
		
		
	

	
	
		
			
			
			
			
				
				
				
				
			
		
	


	
	
	
	
		
                
              
		
		

		
		
		
		
	

1.4、user.xml文件(注意在SqlMappingConfig.xml文件中已经引用它






	
	
	
	
	
	
	

1.5、测试类

package cn.com.czy.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.com.czy.mybatis.pojo.User;
import org.junit.Test;

/**
 * 《单表映射》
 * 入门程序总结:这是简单的mybatis入门程序
 * -- 1、映射(mapper)文件是user.xml --  -- 
 * -- 2、逻辑基本的resultType、parameterType等一下基础知识  --  -- 
 * -- 3、SqlSessionFactory、SqlSession的原理  --  -- 
 */
public class MybatisFirst {

	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		// mybatis配置文件
		String resource = "config/SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		return sqlSessionFactory;
	}

	// 根据id查询用户信息,得到一条记录结果
	@Test
	public void findUserByIdTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();

		// 通过SqlSession操作数据库
		// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
		// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
		// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
		
                // selectOne查询出一条记录(这种很麻烦的!!!往后看看)
		User user = sqlSession.selectOne("test.findUserById", 1);
		System.out.println(user);
		// 释放资源
		sqlSession.close();
	}
}

你竟然看到这里了、不错哦!往下看、实际开发中是下面那种方式!加油、带上梦想生活!

1.6、selectOne和selectList

selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。


总结:mybatis和hibernate本质区别和应用场景

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sqlsql语句自动生成了。

对sql语句进行优化、修改比较困难的。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。




2.1、传统的方式写mybatis的应用程序

2.3、环境搭建

pom.xml文件


    4.0.0
    web-test-com
    MyBatis
    0.0.1-SNAPSHOT
    war

    

        
            junit
            junit
            4.12
            provided
        

        
            log4j
            log4j
            1.2.17
        

        
            org.mybatis
            mybatis
            3.1.1
        
        
            mysql
            mysql-connector-java
            5.1.38
        

    


2.4、SqlMappingConfig.xml文件(学会看注释、你就入门了!!!别说我只贴代码不给解释!!!)





	
	
		
		
	

	
	

	
		
		
		
		
		
		
	

	
	
		
			
			
			
			
				
				
				
				
			
		
	


	
	
	
	
		
		
		
		

		
		
		
		
	







2.5、映射文件user.xml注意在SqlMappingConfig.xml文件中已经引用它









	
	
	
	
	
	
	

	
	
	
	
	

	
	 
	
	
		
		
		
		
		
			
			SELECT LAST_INSERT_ID()
		
		insert into user(username,birthday,sex,address)
		value(#{username},#{birthday},#{sex},#{address})
		
		
		
		
		
	


	
		
		delete from user where
		id=#{id}
	


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





2.6、pojo类
package cn.com.czy.mybatis.pojo;

import java.util.Date;


/**
 * 
 * 

Title: User

*

Description:用户pojo

*/ public class User { //属性名和数据库表的字段对应 private int id; private String username; // 用户姓名 private String sex; // 性别 private Date birthday; // 生日 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }



2.7、测试类(传统的不用接口、只是简单的)

package cn.com.czy.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.com.czy.mybatis.pojo.User;
import org.junit.Test;

/**
 * 《单表映射》
 * 入门程序总结:这是简单的mybatis入门程序
 * -- 1、映射(mapper)文件是user.xml --  -- 
 * -- 2、逻辑基本的resultType、parameterType等一下基础知识  --  -- 
 * -- 3、SqlSessionFactory、SqlSession的原理  --  -- 
 */
public class MybatisFirst {

	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		// mybatis配置文件
		String resource = "config/SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		return sqlSessionFactory;
	}

	

	// 根据id查询用户信息,得到一条记录结果
	@Test
	public void findUserByIdTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();

		// 通过SqlSession操作数据库
		// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
		// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
		// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
		// selectOne查询出一条记录
		User user = sqlSession.selectOne("test.findUserById", 1);

		System.out.println(user);

		// 释放资源
		sqlSession.close();

	}

	// 根据用户名称模糊查询用户列表
	@Test
	public void findUserByNameTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// list中的user和映射文件中resultType所指定的类型一致
		List list = sqlSession.selectList("test.findUserByName", "小明");
		System.out.println("信息:" + list);
		sqlSession.close();

	}

	// 添加用户信息
	@Test
	public void insertUserTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// 插入用户对象
		User user = new User();
		user.setUsername("王小军");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("河南郑州");

		sqlSession.insert("test.insertUser", user);

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

		// 获取用户信息主键
		System.out.println(user.getId());
		// 关闭会话
		sqlSession.close();

	}

	// 根据id删除 用户信息
	@Test
	public void deleteUserTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();

		// 传入id删除 用户
		sqlSession.delete("test.deleteUser", 49);

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

		// 关闭会话
		sqlSession.close();

	}

	// 更新用户信息
	@Test
	public void updateUserTest() throws IOException {

		// 通过工厂得到SqlSession
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// 更新用户信息

		User user = new User();
		// 必须设置id
		user.setId(41);
		user.setUsername("王大军");
		user.setBirthday(new Date());
		user.setSex("2");
		user.setAddress("河南郑州");

		sqlSession.update("test.updateUser", user);

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

		// 关闭会话
		sqlSession.close();

	}

}


3.1、我们用mapper代理方法来实现(实际开发用到的)

1、pom.xml文件一样

2、SqlMappingConfig.xml一样

3、开发规范:

我们编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

3.2、接口UserMapping.xml文件(可能有点多、你挑着看就好了、学会查询就会别的!!!)

注意在SqlMappingConfig.xml文件中已经引用它










	
	
	
	
		
			
				and user.sex = #{userCustom.sex}
			
			
				and user.username LIKE '%${userCustom.username}%'
			
		
	

	
	
	
	
	

	
	

	
	
	
	
	
	
	
	
	
	
	
	
	

	
	



	
	
	
	
	
		
		
		
		
		
		
		
		
	

	
	
	






3.3、UserMapping.java类

package cn.com.mybatis.mapper;

import java.util.List;

import cn.com.czy.mybatis.pojo.User;

/**
 * 总结:
 * 1、mapper代理方式、理解mapper开发规范 
 * 2、mapper文件是usermapper.xml
 * 3、了解动态sql、别名、sql代码片、
 * 4、了解  resultMap
 * 
 * 

* Title: UserMapper *

*

* Description: mapper接口,相当 于dao接口,用户管理 *

*/ public interface UserMapper { // 根据id查询用户信息 public User findUserById(int id) throws Exception; // 根据用户名列查询用户列表 public List findUserByName(String name) throws Exception; // 根据id查询用户信息,使用resultMap输出 public User findUserByIdResultMap(int id) throws Exception; // 用户信息综合查询 public List findUserList(UserQueryVo userQueryVo) throws Exception; // 用户信息综合查询总数 public int findUserCount(UserQueryVo userQueryVo) throws Exception; // 插入用户 public void insertUser(User user) throws Exception; // 删除用户 public void deleteUser(int id) throws Exception; }

3.3、包装类、继承类(这些只是为了以后更好的拓展罢了)

UserMapping的子类

package cn.com.mybatis.mapper;

import cn.com.czy.mybatis.pojo.User;

/**
 * 总结:
 * 1、mapper代理方式、理解mapper开发规范 
 * 2、mapper文件是usermapper.xml
 * 3、了解动态sql、别名、sql代码片、
 * 4、了解  resultMap
 * 
 * 

Title: UserCustom

*

Description: 用户的扩展类

*/ public class UserCustom extends User{ //可以扩展用户的信息 }

UserMapping的包装类
package cn.com.mybatis.mapper;


/**
 * 总结:
 * 1、mapper代理方式、理解mapper开发规范 
 * 2、mapper文件是usermapper.xml
 * 3、了解动态sql、别名、sql代码片、
 * 4、了解  resultMap
 * 
 * 

Title: UserQueryVo

*

Description:包装类型

*/ public class UserQueryVo { //在这里包装所需要的查询条件 //用户查询条件 private UserCustom userCustom; public UserCustom getUserCustom() { return userCustom; } public void setUserCustom(UserCustom userCustom) { this.userCustom = userCustom; } //可以包装其它的查询条件,订单、商品 //.... }

3.5测试类

package cn.com.mybatis.mapper;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.com.czy.mybatis.pojo.User;

/*
 * 
 * 总结:
 * 1、mapper代理方式、理解mapper开发规范 
 * 2、mapper文件是usermapper.xml
 * 3、了解动态sql、别名、sql代码片、
 * 4、了解  resultMap
 *
 */
public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	// 此方法是在执行testFindUserById之前执行
	@Before
	public void setUp() throws Exception {

		// mybatis配置文件
		String resource = "config/SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);
	}

	//用户信息的综合 查询
	@Test
	public void testFindUserList() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//创建包装对象,设置查询条件
		UserQueryVo userQueryVo = new UserQueryVo();
		UserCustom userCustom = new UserCustom();
		userCustom.setSex("1");
		userCustom.setUsername("郑游");
		userQueryVo.setUserCustom(userCustom);
		
		//调用userMapper的方法
		List list = userMapper.findUserList(userQueryVo);
		
		System.out.println(list);
	}
	
	
	
	@Test
	public void testFindUserCount() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//创建包装对象,设置查询条件
		UserQueryVo userQueryVo = new UserQueryVo();
		UserCustom userCustom = new UserCustom();
		userCustom.setSex("1");
		userCustom.setUsername("郑游");
		userQueryVo.setUserCustom(userCustom);
		//调用userMapper的方法
		int count = userMapper.findUserCount(userQueryVo);
		
		System.out.println(count);
	}
	
	
	
	@Test
	public void testFindUserById() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//调用userMapper的方法
		
		User user = userMapper.findUserById(1);
		
		System.out.println(user);
		
		
	}
	
	
	@Test
	public void testFindUserByName() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//调用userMapper的方法
		
		List list = userMapper.findUserByName("小明");
		
		sqlSession.close();
		
		System.out.println(list);
		
		
	}
	
	@Test
	public void testFindUserByIdResultMap() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//调用userMapper的方法
		
		User user = userMapper.findUserByIdResultMap(1);
		
		System.out.println(user);
		
	}

}

Maven官方中文教程(推荐特别好!)

还是自己领悟的好!加油!





你可能感兴趣的:(Mybatis入门例子)