1、什么是mybatis?
Mybatis是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一、一对多),Mybatis可以通过简单的XML文件或注解来配置和映射原始类型、接口;Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作,但它的数据库无关性较低。
·什么是ORM
Object Relation Mapping , 对象关系映射。对象是☞面向对象对象(Java对象),关系☞的是数据库中的关系模型(数据库表);
对象关系映射,指的就是Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Strudent类去对应数据库中的一张表,类中的属性和表中的列一一对应。Strudent类就对应Student表,一个Student对象就对应Student表中的一行数据。
·为什么mybatis是半自动的ORM框架
用mybatis进行开发,需要手动编写SQL语句。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由的对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言,所以mybatis的数据库无关性低。
虽然mybatis需要手写SQL,但是相比于JDBC,它提供了输入映射和输出映射,可以方便的进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL功能,极大地提升了开发地效率。
·什么是持久层
将业务数据存储到磁盘,也具有长期储备能力,只要磁盘不损坏,如果在断电情况下,重启电脑仍然可以读取数据。
2、开发步骤
1)导入jar包
在pom.xml文件中的<dependencies></dependencies>中导入依赖
<!-- mysql驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
<!--DBCP数据库连接池-->
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2)创建User类
package entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String userpwd;
private double money;
}
3)编写mapper.xml映射文件(写操作对应的SQL语句,例如增删查改)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://mybatis.apache.org/dtd/mybatis-3-mapper.dtd">
<!-- 该文件是一个Mybatis的映射文件
namespace:执行的是接口(映射器)的全称(包名,接口名)
-->
<mapper namespace="mapper.UserMapper">
<select id="selectUserById" parameterType="int" resultType="entity.User">
select id,uname as userName,upwd as userPwd,money from myjdbc where id=#{id}
</select>
<select id="userLogin" parameterType="entity.User" resultType="entity.User">
select id,uname as userName,upwd as userPwd,money from myjdbc where uname =#{username} and upwd =#{userpwd}
</select>
<insert id="insertUser" parameterType="entity.User" >
insert into myjdbc values(null,#{username},#{userpwd},#{money})
</insert>
<update id="updatePwdById" parameterType="entity.User">
update myjdbc set upwd=#{password} where id=#{id}
</update>
<delete id="deleteUserById" parameterType="entity.User">
delete from myjdbc where id=#{id}
</delete>
</mapper>
4)编写全局配置文件(配置数据源信息)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 该文件是Mybatis配置文件 -->
<!-- 配置Mybatis文件相关数据(配置数据库环境) -->
<configuration>
<!--
environments:指定数据库相关信息
default:默认使用哪一个数据库环境
-->
<environments default="gcd">
<environment id="gcd">
<!-- 使用JDBC事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gcddb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 配置指定的映射文件(指定Mybaitis对数据库操作的地址,默认在resource文件下去找该映射文件) -->
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
5)编写接口类
package mapper;
import entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 这个接口也称为mybatis的映射器
* 映射器中的方法对应的是映射文件中的
*/
public interface UserMapper {
//根据id查询用户数据
User selectUserById(Integer id);
//查询所有用户的数据
List<User> selectUserAll();
//用户登录
User userLogin( User user);
//用户登录2
//用户注册
boolean insertUser(User user);
//修改密码
boolean updatePwdById(@Param("password") String password , @Param("id") Integer id );
//删除数据
int deleteUserById( Integer id);
//删除多条数据
boolean batchById(@Param("ids") String[] ids);
//
List<User> selectUserByPage(@Param("page") Integer currectPage, @Param("size") Integer size);
}
6)编写测试类
package testData;
import entity.User;
import 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.Before;
import org.junit.Test;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestUser {
UserMapper mapper;
SqlSession sqlSession;
@Before
@Test
public void test01() throws IOException {
//创建一个数据源工厂
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//读取mybatis配置文件
InputStream is = Resources.getResourceAsStream("config.xml");
/*
* SqlSessionFactory理解成数据源,相当于JDBC中的DataSource,
* 以下关于SqlSessionFactory作为理解
* 1.SqlSessionFactory是线程安全的,可以让多个执行的线程同时存取
* 2.SqlSessionFactory(单列)当操作多个数据库时,可以为每个数据库指定的SqlSessionFactory
*/
SqlSessionFactory ssf = ssfb.build(is);
//sqlSession相当于JDBC的Connction
sqlSession = ssf.openSession(true); //自动提交
/*
获取映射器:
SqlSession提供了getMapper()的方法返回符合Mapper的映射器要求的对象,
在这里我们只需要调用该对象的方法也就是访问了数据库
*/
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void test02() {
User user = mapper.selectUserById(3);
System.out.println(user);
}
@Test
public void test03() {
List<User> users = mapper.selectUserAll();
System.out.println(users);
}
@Test
public void test04() {
User user = new User();
user.setUsername("admin100");
user.setUserpwd("00000");
User u = mapper.userLogin(user);
if(u!=null){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
@Test
public void test06() {
User user =new User(null,"admin","234567",100000);
boolean b = mapper.insertUser(user);
sqlSession.commit(); //手动提交
if(b==true)
{
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
}
@Test
public void test07() {
boolean b = mapper.updatePwdById("123456",3);
if(b==true)
{
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
@Test
public void test08() {
int n = mapper.deleteUserById(4);
if(n==1)
{
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
//映射器(接口)
//映射文件(mapper)
@Test
public void test09() {
String[] strArr = {"10","11"};
boolean b =mapper.batchById(strArr);
if(b==true)
{
System.out.println("批量删除成功");
}else {
System.out.println("批量删除失败");
}
}
@Test
public void test10() {
List<User> users = mapper.selectUserByPage(1,2);
System.out.println(users.size());
}
}
3、总结
Mybatis其实是对JDBC的操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建Connection、手动设置参数等JDBC复杂的代码。
JDBC和Mybatis的区别
1)从层次上看,JDBC是较底层的持久层操作方式,而Mybatis都是在JDBC基础上进行了封装使其更加方便程序员对数据库的操作。
2)从功能上看,JDBC只是简单的建立数据库连接,然后建立statement,将Sql语句传给statement去执行,如果是有返回结果的查询语句,则会将查询结果放到ResultSet对象,通过对ResultSet对象的遍历来获取数据。