目录结构(怕一些因为文件路径错误、所有不要原版不动拷贝、要理解!)
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();
}
}
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对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
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}
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 + "]";
}
}
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();
}
}
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}%'
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;
}
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{
//可以扩展用户的信息
}
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;
}
//可以包装其它的查询条件,订单、商品
//....
}
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官方中文教程(推荐特别好!)
还是自己领悟的好!加油!