一、Mybatis简介
MyBatis
本是apache的一个开源项目iBatis
, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis
。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架
。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
GitHub地址:https://github.com/mybatis/mybatis-3/releases
二、下载Mybatis框架支持包
GitHub地址:https://github.com/mybatis/mybatis-3/releases
三、创建第一个Mybatis项目
相关jar包下载地址:
地址一 https://pan.baidu.com/s/1w8lDco7wTZWBFdsvrTNopw 提取码: faxn
地址二 https://pan.baidu.com/s/1v96WBxYfEpOGu8cAn1zAYQ 提取码: hzba
地址三 https://pan.baidu.com/s/1Xd1Lp-GQyw7R9XQYhlXfrw 提取码: rc1e
1、创建一个普通Java项目
2、在项目根路径下新建lib文件夹
3、复制Mybatis框架支持包到lib文件夹下
4、复制mysql数据库驱动到lib文件夹
5、复制junit测试包到lib文件夹
6、将lib文件夹标记为Library
四、创建MySQL数据库
建库建表sql如下:
#创建mybatis_day_01数据库
CREATE DATABASE mybatis_day_01;
#选中mybatis_day_01数据库
use mybatis_day_01;
#创建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`)
);
五、编写配置文件
1、在src目录下创建log4j日志配置文件log4j.properties
# Global logging configuration
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
2、在src目录下创建Mybatis主配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybatis的环境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_day_01?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
六、测试
1、编写User实体类
package cn.hestyle.entity;
import java.io.Serializable;
import java.util.Date;
/**
* description: User模型
*
* @author hestyle
* @version 1.0
* @className mybatis_day_01->User
* @date 2020-01-25 10:58
**/
public class User implements Serializable {
private Integer id;
private String username;
private String sex;
private Date birthday;
private String address;
public User() {
}
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 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、编写UserMapper接口(作用相当于IUserDao接口)
package cn.hestyle.mapper;
import cn.hestyle.entity.User;
import java.util.List;
/**
* description:
*
* @author hestyle
* @version 1.0
* @className mybatis_day_01->UserMapper
* @date 2020-01-25 18:58
**/
public interface UserMapper {
/**
* 保存一个user对象
* @param user 待保存的对象
* @return 受影响的行数
*/
public Integer save(User user);
/**
* 通过id删除一个user
* @param id user id
* @return 受影响的行数
*/
public Integer deleteById(Integer id);
/**
* 更新一个User实体对象
* @param user 待更新的对象
* @return 受影响的行数
*/
public Integer update(User user);
/**
* 通过id查找
* @param id 用户id
* @return User实体类对象
*/
public User findUserById(Integer id);
/**
* 通过usernameKey关键字查找user表
* @param usernameKey 用户名关键字
* @return User list
*/
public List<User> findUsersByUsernameKey(String usernameKey);
/**
* 查找user表所有记录
* @return User list
*/
public List<User> findAll();
}
2、编写UserMapper.xml映射文件(作用相当于UserDaoImpl实现类)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离
注意:使用mapper代理开发时,namespace有特殊且重要的作用
-->
<mapper namespace="cn.hestyle.mapper.UserMapper">
<!--
[id]:statement的id,要求在命名空间内唯一
keyProperty="id" useGeneratedKeys="true"用于设置自动增长标识(id字段自动增长)
[parameterType]:入参的java类型
[#{}]: 表示一个占位符?,比如#{username},将取出入口参数User.username
-->
<insert id="save" keyProperty="id" useGeneratedKeys="true" parameterType="cn.hestyle.entity.User">
INSERT INTO user(
username, birthday, sex, address
) VALUES (
#{username},#{birthday},#{sex},#{address}
)
</insert>
<!--
[id]:statement的id,要求在命名空间内唯一
[parameterType]:入参的java类型
#{id}表示获取入口参数中的id属性
-->
<delete id="deleteById" parameterType="java.lang.Integer">
DELETE FROM user
WHERE id = #{id}
</delete>
<!--
更新一个User实体对象
[id]:statement的id,要求在命名空间内唯一
[parameterType]:入参的java类型
-->
<update id="update" parameterType="cn.hestyle.entity.User">
UPDATE user
SET username = #{username},
birthday = #{birthday},
sex = #{sex},
address = #{address}
WHERE id = #{id}
</update>
<!--
通过id查找user表
[id]:statement的id,要求在命名空间内唯一
[parameterType]:入参的java类型
[resultType]:查询出的单条结果集对应的java类型
[#{id}]:表示该占位符待接收参数的名称为id。
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.hestyle.entity.User">
SELECT *
FROM user
WHERE id = #{id}
</select>
<!--
通过usernameKey关键字查找user表
[id]:statement的id,要求在命名空间内唯一
[parameterType]:入参的java类型
[resultType]:查询出的单条结果集对应的java类型
-->
<select id="findUsersByUsernameKey" parameterType="java.lang.String" resultType="cn.hestyle.entity.User">
SELECT *
FROM user
WHERE username LIKE CONCAT('%', #{username}, '%')
</select>
<!--
查找user表所有记录
[id]:statement的id,要求在命名空间内唯一
[resultType]:查询出的单条结果集对应的java类型
-->
<select id="findAll" resultType="cn.hestyle.entity.User">
SELECT *
FROM user
</select>
</mapper>
需要在主配置文件SqlMapConfig.xml
添加路径
3、编写测试类
package cn.hestyle.test;
import cn.hestyle.entity.User;
import cn.hestyle.mapper.UserMapper;
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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* description:
*
* @author hestyle
* @version 1.0
* @className mybatis_day_01->Demo01
* @date 2020-01-25 11:10
**/
public class Demo01Test {
private static InputStream inputStream;
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession;
private static UserMapper userMapper;
static {
try {
//读取Mybatis配置文件
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建sqlSessionFactory,然后获取sqlSession
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testSave() throws IOException {
User user = new User();
user.setUsername("hestyle_1");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("太阳系-地球-亚洲");
Integer rows = userMapper.save(user);
System.err.println("受影响的行数rows = " + rows);
user.setUsername("hestyle_2");
userMapper.save(user);
user.setUsername("hestyle_3");
userMapper.save(user);
user.setUsername("hestyle_4");
userMapper.save(user);
//修改了数据库,需要提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteById() throws IOException {
Integer rows = userMapper.deleteById(1);
System.err.println("rows = " + rows);
//修改了数据库,需要提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void testFindUserById() throws IOException {
User user = userMapper.findUserById(2);
System.err.println(user);
sqlSession.close();
}
@Test
public void testFindUserByUsername() throws IOException {
List<User> userList = userMapper.findUsersByUsernameKey("style");
for (User user : userList) {
System.err.println(user);
}
sqlSession.close();
}
@Test
public void testFindAll() throws IOException {
List<User> userList = userMapper.findAll();
for (User user : userList) {
System.err.println(user);
}
sqlSession.close();
}
@Test
public void testUpdate() throws IOException {
User user = userMapper.findUserById(2);
user.setUsername("hestyle_2_修改测试");
userMapper.update(user);
//修改了数据库,需要提交事务
sqlSession.commit();
sqlSession.close();
}
}
4、依次执行测试方法
①、执行testSave
方法
执行后数据库user表:
②、执行testDeleteById
方法
执行后数据库user表:
③、执行testFindUserById
方法
执行后控制台输出:
④、执行testFindUserByUsernameKey
方法
执行后控制台输出:
⑤、执行testFindAll
方法
执行后控制台输出:
⑥、执行testUpdate
方法
执行后数据库user表:
以上就是创建第一个Mybatis项目的主要内容,涉及User实体类的增、删、改、查,Mybatis框架是持久层框,即对数据库操作(增、删、改、查)的封装。顺带提一下,这里的User实体类的属性名与user表中的字段名一一对应,是为了方便演示。实际开发过程中可能出现user表中出现字段名modify_time,User实体类出现属性名modifyTime,这时select语句需要手动一一对应。
以上只是演示了Mybatis的基本操作,更详细的介绍请参考我的;另外一篇博客 Mybatis框架之快速入门(别再翻了,此篇博客就够了)