1. Mybatis 搭建步骤:
1.1、添加pom依赖(Mybatis核心依赖和数据库【Mysql】版本对应版本的驱动jar包)
使用框架也就是使用别人写好的代码,要想用的前提当然是导入别人的代码
pom.xml
<?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>cn.qqa</groupId>
<artifactId>mybatis_helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<!--mybatis核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql对应版本的连接器驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.2、新建数据库及表
mybatis是半自动持久化ORM(Object Relational Mapping,对象关系映射),关系也就是关系数据库中的表,也就是将POJO类(Plain Old Java Object,普通的 Java对象)和表映射,
那么当然要在新建数据库和相应的表。
1.3、添加Mybatis全局配置文件(可以再Mybatis官网中复制)
1.4、修改全局配置文件中的 数据源配置信息
mybatis.xml
<?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>
<!-- Setup the transaction manager and data source that are
appropriate for your environment
-->
<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/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="xxxxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- XML mapper files should be listed here -->
<!--第一种是statementId的执行SQL方式-->
<!--<mapper resource="EmpMapper.xml" />-->
<!--<mapper class="cn.qqa.mapper.EmpMapper"/>-->
<package name="cn.qqa.mapper"/>
</mappers>
</configuration>
1.5、添加数据库表中对应的POJO(Plain Old Java Object, 普通java对象)类(类比JavaBean类)
Emp.java
package cn.qqa.pojo;
import org.apache.ibatis.type.Alias;
public class Emp {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
1.6、添加对应的PojoMapper.xml(里面维护所有的sql语句,在mybatis中sql语句与java代码分离)
(1)需要修改namespace: 如果是StatementId的方式没有特殊的要求
如果是接口绑定的方式必须等于接口的完整限定名(包+类名)
(2)需要修改对应的id(唯一),resultType对应返回的类型(如果为POJO,则要指定完整限定名)
1.7、修改Mybatis全局配置文件中的<Mapper></Mapper>
2、Myabits执行SQL的三种实现方式
2.1、基于statementId的方式执行SQL
2.1.1xml文件
<mappers>
<!-- XML mapper files should be listed here -->
<mapper resource="EmpMapper.xml" />
</mappers>
2.1.2、java文件
SqlSessionFactory sqlSessionFactory;
@Before
public void before(){
//从XML中构建SqlSeesionFactory
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException e){
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* ·基于statementId的方式执行SQL
*
* <mapper resource="EmpMapper.xml" />-
* @throws IOException
*/
@Test
public void test01(){
try (SqlSession session = sqlSessionFactory.openSession()) {
Emp emp = (Emp) session.selectOne("cn.qqa.pojo.EmpMapper.selectEmp", 1);
System.out.println(emp);
}
}
2.2、基于接口绑定的方式(java与sql解耦)
步骤:
2.2.1、新建数据访问层的接口:POJOMapper.java
EmpMapper.java
package cn.qqa.mapper;
import cn.qqa.pojo.Emp;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
//根据id查询Emp对应实体(数据库字段)
//@Select("select * from emp where id = #{id}")
//查询
Emp selectEmp(Integer id);
//插入
Integer insertEmp(Emp emp);
//更新
Integer updateEmp(Emp emp);
//s删除
Integer deleteEmp(Integer id);
}
2.2.2、添加mapper中对应的操作方法
(1)方法名要与PojoMapper.xml(Mapper)中配置的节点的id一致
(2)方法返回类型要与PojoMapper.xml(Mapper中配置的节点的resultType一致 )
(3)PojoMapper.xml中对应节点的参数必须要在方法的参数中声明
2.2.3、PojoMapper.xml中的namespace必须要和接口的完整限定名一致
EmpMapper.xml
<?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="cn.qqa.pojo.EmpMapper">-->
<mapper namespace="cn.qqa.mapper.EmpMapper">
<!--根据id查询Emp对应实体(数据库字段)-->
<select id="selectEmp" resultType="cn.qqa.pojo.Emp">
select * from Emp where id = #{id}
</select>
<insert id="insertEmp">
INSERT INTO
Emp( username)
VALUES ( #{username});
</insert>
<update id="updateEmp">
update emp
set username = #{username}
where id = #{id}
</update>
<delete id="deleteEmp">
delete
from Emp
where id=#{id}
</delete>
</mapper>
2.2.4、修改Mybatis全局配置文件中的mappers, <mapper class="cn.qqa.mapper.EmpMapper"/>
2.2.5、一定要将PojoMapper.xml文件和接口文件放在同一级目录中 如果使用maven,只需在resources目录中,新建和接口类应的文件夹就行了,生成会自动合并在一起
MybatisTest.java
package cn.qqa.tests;
import cn.qqa.mapper.EmpMapper;
import cn.qqa.pojo.Emp;
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.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.Before;
import org.junit.Test;
import javax.sound.midi.Soundbank;
import java.io.IOException;
import java.io.InputStream;
/**
* Mybatis 搭建步骤:
* 1.添加pom依赖(Mybatis核心依赖和数据库【Mysql】版本对应版本的驱动jar包)
* 2.新建数据库及表
* 3.添加Mybatis全局配置文件(可以再Mybatis官网中复制)
* 4.修改全局配置文件中的 数据源配置信息
* 5.添加数据库表中对应的POJO类(类比JavaBean类)
* 6.添加对应的PojoMapper.xml(里面维护所有的sql语句,在mybatis中sql语句与java代码分离)
* (1)需要修改namespace: 如果是StatementId的方式没有特殊的要求
* 如果是接口绑定的方式必须等于接口的完整限定名(包+类名)
* (2)需要修改对应的id(唯一),resultType对应返回的类型(如果为POJO,则要指定完整限定名)
* 7.修改Mybatis全局配置文件中的<Mapper></Mapper>
*/
public class MybatisTest {
SqlSessionFactory sqlSessionFactory;
@Before
public void before(){
//从XML中构建SqlSeesionFactory
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException e){
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* ·基于statementId的方式执行SQL
*
* <mapper resource="EmpMapper.xml" />-
* @throws IOException
*/
@Test
public void test01(){
try (SqlSession session = sqlSessionFactory.openSession()) {
Emp emp = (Emp) session.selectOne("cn.qqa.pojo.EmpMapper.selectEmp", 1);
System.out.println(emp);
}
}
/**
* ·基于接口绑定的方式
* java与sql解耦
* 1.新建数据访问层的接口:POJOMapper
* 2.添加mapper中对应的操作方法
* (1)方法名要与PojoMapper.xml(Mapper)中配置的节点的id一致
* (2)方法返回类型要与PojoMapper.xml(Mapper中配置的节点的resultType一致
* (3)PojoMapper.xml中对应节点的参数必须要在方法的参数中声明
* 3.PojoMapper.xml中的namespace必须要和接口的完整限定名一致
* 4.修改Mybatis全局配置文件中的mappers,
* <mapper class="cn.qqa.mapper.EmpMapper"/>
* 5.一定要将PojoMapper.xml文件和接口文件放在同一级目录中
* 如果使用maven,只需在resources目录中,新建和接口类应的文件夹就行了,生成会自动合并在一起
*
*/
@Test
public void test02(){
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(1);
System.out.println(emp);
}
}
/***
* ·基于注解的方式
* 在接口方法上写上对应的注解(sql语句),没有解耦
* @Select("select * from emp where id = #{id}")
* 注意:注解可以和xml共存,但是xml中不能有方法中用到的id
*/
@Test
public void test03(){
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(1);
System.out.println(emp);
}
}
}
MybatisCRUD.java
package cn.qqa.tests;
import cn.qqa.mapper.EmpMapper;
import cn.qqa.pojo.Emp;
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.lang.model.element.VariableElement;
import java.io.IOException;
import java.io.InputStream;
public class MybatisCRUD {
SqlSessionFactory sqlSessionFactory;
@Before
public void before(){
//从XML中构建SqlSeesionFactory
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException e){
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void select(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(1);
System.out.println(emp);
}
/**
* 注意要提交事务
*/
@Test
public void insert(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setUsername("xxx");
try{
Integer result = mapper.insertEmp(emp);
System.out.println(result);
sqlSession.commit();
}catch (Exception ex){
System.out.println("插入失败");
sqlSession.rollback();;
}finally {
sqlSession.close();
}
}
/**
* 更新
* 注意要提交事务
*/
@Test
public void update(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setId(5);
emp.setUsername("xxx");
try{
Integer result = mapper.updateEmp(emp);
System.out.println(result);
sqlSession.commit();
}catch (Exception ex){
System.out.println("插入失败");
sqlSession.rollback();;
}finally {
sqlSession.close();
}
}
/**
* 删除
* 注意要提交事务
*/
@Test
public void delete(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
try{
Integer result = mapper.deleteEmp(4);
System.out.println(result);
sqlSession.commit();
}catch (Exception ex){
System.out.println("删除失败");
sqlSession.rollback();;
}finally {
sqlSession.close();
}
}
}