一、简介
MyBatis:解决数据的持久化问题的框架
一款优秀的半自动的ORM持久层框架,它支持自定义 SQL、存储过程以及高级映射;一个开源轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。
MyBatis 前身为IBatis,2002 年由 Clinton Begin 发布。2010 年从Apache 移到 Google并改名为 MyBatis,2013 年又迁移到了Github。
特点
• mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。
• mybatis通过xml或注解的方式将要执行的各种statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为iava对象并返回。
• 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbcapi底层访问细节,使我们不用与jdbcapi打交道,就可以完成对数据库的持久化操作。
• MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
二、案例
1.创建测试的数据库和表
-- 判断存在即删除数据库
drop database if exists mydb;
-- 创建数据库
create database mydb;
-- 使用数据库
use mydb;
-- 删除重复的表
drop table if exists t_user;
-- 创建t_user表
create table t_user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);
-- 新增
insert into t_user(username,password,phone,address)values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address)values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address)values('小美','123','18565234759','信阳');
-- 查询
select * from t_user;
2.创建一个Java项目并导入mybatis框架的jar包;创建一个lib文件夹放入mybatis框架的14个jar包,导入项目中。
3.创建一个实体类跟表对应;在src中创建com.zhan.bean包,然后创建User实体类。表名即类名;字段名即属性必须小写。
package com.zhan.bean;
public class User {
//属性
private Integer uid;
private String username;
private String password;
private String phone;
private String address;
//方法
public User() {
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}'+'\n';
}
}
4.创建针对表操作的接口类并定义方法;在dao包中创建UserDao的接口,然后在接口中定义针对数据库的增删改查等操作。
package com.zhan.dao;
import com.zhan.bean.User;
import java.util.List;
public interface UserDao {
//查询
List<User> selectAll();
//新增
int add(User user);
//删除
int delete(int uid);
//单查
User selectById(int uid);
//修改
int update(User user);
//模糊查询
List<User> seach(String keyword);
}
5. 在接口的包中创建对应的mapper映射配置文件;在dao接口的同目录下创建跟接口名字一样的配置文件。
namespace:是映射的dao接口;把配置文件和接口进行映射
通过select标签进行查询
id:映射接口的方法名
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可)
resultType:指定返回值的类型
<?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">
<mapper namespace="com.zhan.dao.UserDao">
<select id="selectAll" resultType="com.zhan.bean.User">
select * from t_user;
</select>
<insert id="add" parameterType="com.zhan.bean.User">
insert into t_user(username,password,phone,address)values(#{username},#{password},#{phone},#{address});
</insert>
</mapper>
6.在src目录中创建mybatis框架的核心配置文件。
在src中创建一个文件,命名为SqlMapConfig.xml,在该配置文件中配置连接数据库的参数。
environments:配置环境信息===就是配置连接数据库的参数;
default:指定配置的环境信息的id,表示默认连接该环境
transactionManager:配置事务的处理方式:模式使用JDBC的事务处理
dataSource:数据源的默认type设置为pooled,表示使用连接池
mappers:加载mapper配置文件
<?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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.zhan.dao.UserDao"/>
<!-- <mapper resource="com/zhan/dao/UserDao.xml"/>-->
</mappers>
</configuration>
7.在测试类中进行测试 使用mybatis框架需要按照框架的步骤进行;
public class UserTest {
InputStream stream = null;
SqlSessionFactoryBuilder builder = null;
SqlSessionFactory factory = null;
SqlSession sqlSession = null;
UserDao userDao = null;
@Before
public void init() throws IOException {
stream = Resources.getResourceAsStream("mybatis.xml");
builder = new SqlSessionFactoryBuilder();
factory = builder.build(stream);
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void testSelectAll(){
List<User> userList = userDao.selectAll();
for (User user:userList) {
System.out.println(user);
}
}
@Test
public void testAdd(){
User user = new User();
user.setUsername("张其");
user.setPassword("123");
user.setAddress("开封");
user.setPhone("123");
int n = userDao.add(user);
if(n>0){
System.out.println("新增成功");
}else{
System.out.println("新增失败");
}
}
@Test
public void testDelete(){
int n = userDao.delete(5);
if(n>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}
@Test
public void testSelectById(){
User user = userDao.selectById(6);
System.out.println(user);
}
@Test
public void testUpdate(){
//1.数据库回显
User oldUser = userDao.selectById(6);
System.out.println("修改前:"+oldUser);
//2.根据需要修改字段值
oldUser.setUsername("修改测试");
oldUser.setAddress("河南南阳");
//3.执行数据库更新
userDao.update(oldUser);
//4.再次查询
User newUser = userDao.selectById(6);
System.out.println("修改后:"+newUser);
}
@Test
public void testSeach(){
List<User> userList = userDao.seach("张");
for (User user:userList) {
System.out.println(user);
}
}
@After
public void destroy() throws IOException {
sqlSession.commit();
sqlSession.close();
stream.close();
}
}
测试类UserTest分步骤解析
@Before | 前置通知, 在目标方法(切入点)执行之前执行。 value 属性绑定通知的切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式 注意:如果在此回调方法中抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。 |
@After | 后置通知, 在目标方法(切入点)执行之后执行 |
查询测试
查询运行后控制台日志
新增测试
新增运行后控制台日志
删除测试
删除运行后控制台日志
单查测试
修改测试
模糊查询测试