GitHub地址:https://github.com/mybatis/mybatis-3
当前,最新版本是MyBatis 3.5.4 ,其发布时间是2020年2月4日。
官网地址:https://mybatis.org/mybatis-3/
其实,看完百度百科和官网,也不太理解, MyBatis 是在做什么;经过百度,发现有一位写的很不错:https://blog.csdn.net/qq_39159227/article/details/89036003
封装JDBC操作
利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
使用 Maven(本人版本:3.6.1)来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.4version>
dependency>
Mybatis的功能架构分为三层:
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
优点:
缺点:
编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
先创建数据库:
CREATE DATABASE `mybatis`;
USE `mybatis`;
CREATE TABLE `user`(
`id` INT(20) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`,`name`,`pwd`)
VALUES (1,'周丹','123456'),(2,'周颖','zxcvbn'),(3,'姜嘉航','123456');
在 Maven 仓库导入需要的 jar 包,将依赖文件写入 pom.xml
;
Maven 仓库地址:https://mvnrepository.com/
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.4version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.8version>
<scope>providedscope>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
mybatis-config.xml
模板
<configuration>
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="LOG4J"/>
settings>
<typeAliases>
<package name="com.sudong.pojo"/>
typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
<mappers>
<package name="com.sudong.mapper"/>
mappers>
configuration>
其中,db.properties
配置参数如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
构建 sqlSessionFactory:
package com.sudong.utils;
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 java.io.IOException;
import java.io.InputStream;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 工厂模式
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取sqlSession的连接
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
引入 LomBok,通过简单注解来实现精简代码来达到消除冗长代码的目的。
package com.sudong.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
package com.sudong.mapper;
import com.sudong.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
List<User> getUserList();
// 在 xml 获取 id
User selectById(int id);
// 多个参数操作,bi需要增加注解
User selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);
// 新增一个用户
int addUser(User user);
// 修改用户信息
int Updateuser(User user);
// 删除用户信息
int deleteUserById(int id);
}
原来我们需要编写接口实现类,使用了Mybatis之后,我们可以专注编写SQL,使用配置文件;
注:
- 程序运行起来之后,依旧可以动态修改代码,解耦;
- namespace 绑定对应的接口;
<mapper namespace="com.sudong.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from user;
select>
<select id="selectById" resultType="User">
select * from user where id = #{id};
select>
<select id="selectByUsernamePwd" resultType="User">
select * from user where name = #{username} and pwd = #{pwd};
select>
<insert id="addUser" parameterType="User">
insert into `user`(`id`,`name`,`pwd`) values (#{id},#{name},#{pwd});
insert>
<update id="Updateuser" parameterType="User">
update `user` set `name` = #{name}, pwd = #{pwd} where id = #{id};
update>
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id};
delete>
mapper>
import com.sudong.mapper.UserMapper;
import com.sudong.pojo.User;
import com.sudong.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class test {
public static void main(String[] args) {
// 如何获取接口
// 1、 获取SqlSession, 执行sql使用的
SqlSession session = MyBatisUtils.getSession();
// 2、通过 session.getMapper(Class ) 获得接口
UserMapper mapper = session.getMapper(UserMapper.class);
/*
// 删除
int user = mapper.deleteUserById(3);
session.commit();
if(user > 0){
System.out.println("删除成功");
}
*/
/*
修改
int user = mapper.Updateuser(new User(4,"赵日天","123456"));
session.commit();
if(user > 0){
System.out.println("修改成功");
}
*/
/*
// 增加
int user = mapper.addUser(new User(4,"叶良辰","123456"));
session.commit();
if(user > 0){
System.out.println("添加成功");
}
*/
/*
//查找:通过id
User user = mapper.selectById(1);
System.out.println(user);
*/
/*
//查找:通过name和pwd
User user = mapper.selectByUsernamePwd("周丹","123456");
System.out.println(user);
*/
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
引入需要的依赖;
配置 mybatis-config.xml 全局的配置文件;(数据源和mapper特别要注意)
创建 SqlSessionFactory,并通过其创建 SqlSession 对象;(MyBatisUtils)
配置 SqlSession 来操作数据库(CRUD);
1、多个参数一定要增加 @Param 注解
2、增删改一定要增加事务提交
3、增删改,标签一定要对应,参数类型必须要写
4、增删改不用写返回值,查询,必须写返回值,集合、泛型中的内容(具体的对象)
测试(调用 commit() 提交事务);