> 文章列表 > MyBatis(一)

MyBatis(一)

MyBatis(一)

一、简介

1.1 什么是MyBatis

       MyBatis是一个持久层框架,既然和持久层有关那就可以简单理解成和数据库有关,既然是框架那么就肯定是为了简化数据库有关的操作。由于传统的JDBC代码处理数据库有关的代码太复杂,所以出现了MyBatis来快速处理数据库。

1.2 MyBatis的特点

  •     支持定制化SQL、存储过程、高级映射
  •     省略了手动编写JDBC代码和手动设置参数、获取结果集
  •     可以使用简单的XML、注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录
  •     SQL语句和代码分离,SQL写在xml中便于统一管理和优化
  •     MyBatis不会对应用程序或数据库的现有设计强加任何影响
     

二、入门

1.在mysql中执行如下脚本:

CREATE DATABASE db_Mybatis;USE db_Mybatis;CREATE TABLE `user`(`id` VARCHAR(12) PRIMARY KEY,`username` VARCHAR(20),`password` VARCHAR(20)
)engine=INNODB DEFAULT CHARSET=utf8;show tables;
describe `user`;SELECT * FROM `user`;INSERT INTO `user`
VALUES('1','qq','123456');INSERT INTO `user`
VALUES('2','ww','123456')

2.创建一个maven项目

2.1 用到mybatis需要配置什么?

1. pom.xml 文件

  • 文件指定用到的jar包
  • 添加对抗“maven约定大于配置”的资源位置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Mybatis</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><!--        版本要和mysql的版本匹配起来,mysql是5开头的话这个也要以5开头,如果是8开头。。。--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency></dependencies><!--    因为maven的约定大于配置,资源文件都约定放在resources目录。
但是在项目中可能不仅仅会将所有的资源配置文件都放在resources中。
那么此时默认的maven项目构建编译时就不会将我们其他目录下的资源配置文件导出到target目录下,
就会导致我们的资源配置文件读取失败,导致项目出现异常错误。
可以在pom文件中添加如下配置来解决该类问题:
--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource></resources></build></project>

 2. mybatis核心配置文件

在src/resources文件夹下新建一个mybatis-config.xml文件(命名随便)

环境信息:比如连接数据库所必须的url、用户名、密码等等信息。
注册映射:所有的mapper.xml配置文件都要在这里注册。

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configurationPUBLIC "-//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.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db_mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--每个Mapper.xml都需要在mybatis核心配置文件中注册 --><mappers><mapper resource="userMapper.xml"/></mappers></configuration>

2.2 写代码

  • 实体类:既然是和数据库进行交互,那么就要有实体类和数据库中的每个表一一对应,每个属性的类型和名称要和数据库表中的一样,否则可能无法匹配上。
package pojo;public class User {private String id;private String username;private String password;public User() {}public String getId() { return this.id; }public void setId(String id) { this.id = id; }public String getUsername() { return this.username; }public void setUsername(String username) { this.username = username; }public String getPassword() { return this.password; }public void setPassword(String password) { this.password = password; }public String toString() {return "User [id=" + this.id + ", username=" + this.username + ", password=" + this.password + "]\\n";}
}
  • MyBatis工具类:用来连接数据库、创建与数据库进行交互的SqlSession类的实体对象

MyBatis中有三个比较重要的类:

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 ;//获取SqlSessionFactory对象static {try {String resource = "mybatis-config.xml";     //MyBatis的核心配置文件,没指定路径也能读到吗?去classpath下递归读!InputStream inputStream = Resources.getResourceAsStream(resource);  //读取配置文件中的信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  //创建SqlSessionFactory对象} catch (IOException e) {e.printStackTrace();}}//创建SqlSeesion对象public static SqlSession getSqlSession() {return sqlSessionFactory.openSession() ;}
}
  • Mapper接口类:指出想要实现的方法,只需要构造出方法名即可
package dao;import pojo.User;import java.util.List;public interface UserMapper {List<User> getAllUser();void insertUsers();
}
  • Mapper.xml配置文件:通过配置文件将Mapper接口类和MyBatis联系起来,在该配置文件中写SQL语句即可,从而将SQL和代码分离。之后MyBatis就会根据这个配置文件进行相应的操作。
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.UserMapper"><select id="getAllUser" resultType="pojo.User">select * from `user`		<!--在select元素中间写需要执行的SQL语句 --></select></mapper>

其中有几个重要的属性:

  •  测试类
import dao.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;import java.util.List;public class MyTest {@Testpublic void test01(){SqlSession sqlSession = MybatisUtils.getSqlSession();try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//userMapper.insertUsers();List<User> allUser = userMapper.getAllUser();  //底层是SQL的执行for(User u:allUser){System.out.println(u);}} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();}}
}

运行结果:

三、mybatis实现增删改查

增删改一定要提交事务!不然无法生效!

1、带条件的查询

mysql带条件的查询放到Java里其实就是带参数的方法。

UserMapper.java
public interface UserMapper {User getUserById(String id);
}userMapper.xml
<mapper namespace="dao.UserMapper"><select id="getUserById" resultType="pojo.User" parameterType="java.lang.String">select * from `user` where id=#{id}   <!--和写SQL语句是有区别的,where后面的字符串不用加单引号--></select>
</mapper>测试类:
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User u = userMapper.getUserById("1");  //底层是SQL的执行System.out.println(u);
} catch (Exception e) {e.printStackTrace();
} finally{sqlSession.close();
}

需要注意两点:

  • 有入参的时候,要用<select>的parameterType属性指定入参的类型
  • #{id} 可以直接获取入参的值

2、插入

UserMapper.java
public interface UserMapper {void addUser(User user);
}userMapper.xml
<mapper namespace="dao.UserMapper"><!-- #{..}可以直接取User的各个属性--><insert id="addUser" parameterType="pojo.User">insert into `user` values(#{id},#{username},#{password})</insert>
</mapper>测试类
@Testpublic void test01(){SqlSession sqlSession = MybatisUtils.getSqlSession();try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.addUser(new User("3","three","123456"));sqlSession.commit(); //别忘了提交事务!} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();}}

需要注意:

  • 当接口参数为实体类时,可以用#{id}直接取id属性
  • 增删改查一定要提交事务才能生效