简介
什么是 MyBatis?
**MyBatis 是一款优秀的持久层框架**,它支持自定义 SQL、存储过程以及高级
映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的
工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口
和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库
中的记录。 Mybtais是一个ORM框架,轻量级的ORM框架。mybatis将SQL
语句的定义控制权,完全交给了开发者,并且暴露一套API,对JDBC中:
事务,参数,查询结果等进行配置处理。**Mybatis也是基于ORM思想.**
强烈建议学习 mybatis 先去看官方文档:mybatis中文网
什么是ORM呢??
简单理解是一个关系对应模型 ,数据库的表对应我们写的实体类
ORM : Object relation mapping
对象关系映射
将数据库信息和Java中实体类进行映射
users: 1 张三 20 User: id、uName、age
话不多说,使用mybatis 需要用到maven项目 规范来做就是7个步骤 :
代码结构目录 :
- 首先导入我们的jar包
jar包地址:添加链接描述
搜索需要的jar包 ,然后复制里面的maven代码到pom.xml 就好了
pom.xml 文件
<dependencies>
<!--导入mysql jar包 ,记住mysql的版本最好要跟我们的mysql 一致 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<!-- 导入mybatis jar包 版本不需要太高 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 导入 测试jar包 可以用来测试代码 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
- 第二步 写我们的resources 配置文件
<?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="development">
<environment id="development">
<!-- 配置事务 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ums?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
<!-- 这里还可以配置其他连接 ,<environment id ="mysql12" -->
</environments>
<!-- 配置到mapper下的xml 文件 ,引入局部配置文件-->
<mappers>
<mapper resource="com/powernode/mapper/usermapper.xml"/>
</mappers>
</configuration>
- 第四步,写user实体类
package com.powernode.entity;
public class User {
private String usercode;
private String fullname;
private int age;
private String sex;
private String email;
private String address;
/*
我们最好有参和无参构造 都写上
*/
public User() {
}
public User(String usercode, String fullname, int age, String sex, String email, String address) {
this.usercode = usercode;
this.fullname = fullname;
this.age = age;
this.sex = sex;
this.email = email;
this.address = address;
}
public String getUsercode() {
return usercode;
}
public void setUsercode(String usercode) {
this.usercode = usercode;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"usercode='" + usercode + '\'' +
", fullname='" + fullname + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
", address='" + address + '\'' +
'}';
}
}
- 第四步
写我们的mapper接口 ,也就是我们之前写的dao 层接口
import com.powernode.entity.User;
import java.util.List;
import java.util.Map;
public interface usermapper {
//增删改查操作
List<User>getusers();
User getoneuser(String id);
int addusers(User user);
/* 使用map */
int addusers2(Map<String, Object> map);
int updateusers(User user);
int deleteusers(String id);
}
- 第五步 ,写我们的mapper.xml 这里就是写我们sql 语句的啦
<?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 要和mapper 同包绑定到指定mapper -->
<mapper namespace="com.powernode.mapper.usermapper">
<!-- select 中的id 要和 mapper 里面的方法一致,绑定指定方法 -->
<!-- resultType 是sql 语句执行的返回类型 -->
<!-- parameterType="" 是参数类型 -->
<select id="getusers" resultType="com.powernode.entity.User">
select *
from user
</select>
<select id="getoneuser" parameterType="String" resultType="com.powernode.entity.User">
select *
from user
where usercode = #{id}
</select>
<insert id="addusers" parameterType="com.powernode.mapper.usermapper">
insert into user (usercode,fullname,age,sex,email,address) values(#{usercode},#{fullname},#{age},#{sex},#{email},#{address})
</insert>
<update id="updateusers" parameterType="com.powernode.mapper.usermapper" >
update user set fullname = #{fullname} ,age = #{age} where usercode = #{usercode}
</update>
<delete id="deleteusers" parameterType="String" >
delete from user where usercode = #{usercode}
</delete>
<!-- map key 值可以自定义 ,value 里面的和user 区别,就是user需要按照实体类写法 ,map不需要-->
<insert id="addusers2" parameterType="map">
insert into user (usercode,fullname,age,sex,email,address) values(#{usercode},#{fullname},#{age},#{sex},#{email},#{address})
</insert>
</mapper>
- 第六步就是写我们的 工具类 ,我们mybatis 创建会话工厂SqlSessionFactory 的地方
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 {
/* 会话工厂 创建SqlSession对象,SqlSessionFactory是全局对象
static 保证全局唯一,我们这里都用static 修饰,让程序一开始就加载我们的SqlSessFactory
*/
public static SqlSessionFactory sqlSessionFactory;
static {
try {
// xml resource资源路径
String resource = "mybatis.confing.xml";
// 获得加载核心配置文件的inputStream流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过SqlSessionFactoryBuilder对象的build方法创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获得 sqlsession
public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
// 也可以这样写return sqlSessionFactory.openSession();
}
}
- 最后一步 ,写我们的mapper 接口的实现方法,就是我们以前的daoimpl
import com.powernode.entity.User;
import com.powernode.mapper.usermapper;
import com.powernode.util.Mybatisutils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class mapperTest {
@Test
public void test() {
// 1、获取sqlsession对象
SqlSession sqlSession = Mybatisutils.getSqlSession();
try {
// 2、执行语句,,相当于userdao userdao =new userdaoimpl()
usermapper usermapper = sqlSession.getMapper(usermapper.class);
// 3、 list<User> 接收返回值
List<User> userList = usermapper.getusers();
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4、关闭sqlsession
sqlSession.close();
}
}
@Test
public void testone() {
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
User user = usermapper.getoneuser("d94d16bc-099e-11ed-9004-0a0027000009");
System.out.println(user);
sqlSession.close();
}
@Test
public void addusers() {
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
usermapper.addusers(new User("111", "hhh", 18, "男", "22@qq.com", "广东省"));
// 提交事务,不然不会插入
sqlSession.commit();
sqlSession.close();
}
/*使用map */
@Test
public void addusers2() {
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
Map<String, Object> Map = new HashMap<>();
Map.put("usercode","222");
Map.put("fullname","HHH");
Map.put("age",10);
Map.put("sex","男");
Map.put("email","2528@qq.com");
Map.put("address","中国");
usermapper.addusers2(Map);
// 提交事务,不然不会插入
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateusers() {
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
usermapper.updateusers(new User("111", "小灰灰", 18000, "男", "22@QQ.com", "hhh"));
// 提交事务,不然不会插入
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteusers() {
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
usermapper.deleteusers("111");
// 提交事务,不然不会插入
sqlSession.commit();
sqlSession.close();
}
}
我们的增删改操作需要加上sqlSession.commit();
这句话,提交业务,操作才会执行
我们的这些操作这三句代码是不需要改变的:
SqlSession sqlSession = Mybatisutils.getSqlSession();
usermapper usermapper = sqlSession.getMapper(usermapper.class);
/* -- 需要写的是中间的代码, 专注于我们的sql 语句,让我们的数据库操作
更加简便*/
sqlSession.close();
最后 ,如果出现 配置文件写了但是代码加载不到的问题 ,我们在pom.xml 文件中加上这段代码:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.poroperties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>