Mybatis的简单介绍和基本使用
1、数据库操作框架的历程
1、JDBC
2、DBUtils
3、Hibernate
Hibernate优点
Hibernate缺点
4、JDBCTemplate
JDBCTemplate优点
JDBCTemplate缺点
5、Mybatis
Mybatis优点
Mybatis缺点
2、快速搭建Mybatis项目
2.1、新建一个maven项目,并导入pom依赖
<!-- mybatis核心驱动 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 导入mysql对应版本的驱动(根据自己安装的版本) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
如何找到适合与自己安装的mysql的连接依赖:依照下面的图去寻找即可。
2.2、配置一个SqlSessionFactory的文件
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3、mybatis的简单使用
package cool.ale.pojo;
/**
* @author dujlc
*/
public class Emp {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
<?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">
<!-- namespace如果是基于statementId的方式去执行SQL就可以随便写
如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="cool.ale.mapper.EmpMapper">
<select id="selectEmp" resultType="cool.ale.pojo.Emp">
select * from emp where id = #{id}
</select>
</mapper>
3.1、基于statementId的方式去调用SQL
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
package cool.ale.tests;
import cool.ale.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 java.io.IOException;
import java.io.InputStream;
public class Test {
/**
* 基于statementId的方式去执行SQL
* @throws IOException
*/
@org.junit.Test
public void Test01() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取数据的第一种方式
try (SqlSession session = sqlSessionFactory.openSession()) {
// 这里的第一个参数是EmpMapper中的namespace + 具体sql语句的id
// 第二个是传入sql的参数
Emp emp = (Emp) session.selectOne("cool.ale.pojo.EmpMapper.selectEmp", 101);
System.out.println(emp);
}
}
}
3.2、基于接口绑定的方式调用SQL
package cool.ale.mapper;
import cool.ale.pojo.Emp;
public interface EmpMapper {
/**
* 根据id查询sql
* @param id id参数
* @return
*/
Emp selectEmp(Integer id);
}
<?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="cool.ale.mapper.EmpMapper">
<select id="selectEmp" resultType="cool.ale.pojo.Emp">
select * from emp where id = #{id}
</select>
</mapper>
<mappers>
<mapper class="cool.ale.mapper.EmpMapper"></mapper>
</mappers>
package cool.ale.tests;
import cool.ale.mapper.EmpMapper;
import cool.ale.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 java.io.IOException;
import java.io.InputStream;
public class Test {
/**
*
* 基于接口绑定的方式
* @throws IOException
*/
@org.junit.Test
public void Test02() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取数据的第二种方式
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(101);
System.out.println(emp);
}
}
}
3.3、基于注解的方式调用Sql
package cool.ale.mapper;
import cool.ale.pojo.Emp;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
/**
* 根据id查询sql
* @param id id参数
* @return
*/
@Select("select * from emp where id = #{id}")
Emp selectEmp(Integer id);
}
<?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">
<!-- namespace如果是基于statementId的方式去执行SQL就可以随便写
如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="cool.ale.mapper.EmpMapper">
<!--<select id="selectEmp" resultType="cool.ale.pojo.Emp">
select * from emp where id = #{id}
</select>-->
</mapper>
/**
*
* 基于注解的方式
* @throws IOException
*/
@org.junit.Test
public void Test03() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取数据的第二种方式
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(101);
System.out.println(emp);
}
}
4、mybatis的增删改查操作
4.1、准备工作
<!-- mybatis核心驱动 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 导入mysql对应版本的驱动(根据自己安装的版本) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<?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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="EmpMapper.xml"/>-->
<mapper class="cool.ale.mapper.EmpMapper"></mapper>
</mappers>
</configuration>
package cool.ale.mapper;
import cool.ale.pojo.Emp;
public interface EmpMapper {
/**
* 根据id查询sql
* @param id id参数
* @return
*/
Emp selectEmp(Integer id);
}
package cool.ale.pojo;
/**
* @author dujlc
*/
public class Emp {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
<?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">
<!-- namespace如果是基于statementId的方式去执行SQL就可以随便写
如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="cool.ale.mapper.EmpMapper">
<select id="selectEmp" resultType="cool.ale.pojo.Emp">
select * from emp where id = #{id}
</select>
</mapper>
4.2、具体操作
<?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">
<!-- namespace如果是基于statementId的方式去执行SQL就可以随便写
如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="cool.ale.mapper.EmpMapper">
<select id="selectEmp" resultType="cool.ale.pojo.Emp">
select * from emp where id = #{id}
</select>
<insert id="insertEmp">
INSERT INTO `mybatis`.`emp`(`id`, `name`) VALUES (#{id}, #{name});
</insert>
<update id="updateEmp">
UPDATE emp SET name = #{name} WHERE id = #{id};
</update>
<delete id="deleteEmp">
DELETE FROM emp WHERE id = #{id};
</delete>
</mapper>
package cool.ale.mapper;
import cool.ale.pojo.Emp;
public interface EmpMapper {
/**
* 根据id查询sql
* @param id id参数
* @return
*/
Emp selectEmp(Integer id);
/**
* 插入Emp信息
* @param emp 传入需要插入的emp对象
* @return
*/
Integer insertEmp(Emp emp);
/**
* 需要更新的对象
* @param emp 传入需要更新的emp对象
* @return
*/
Integer updateEmp(Emp emp);
/**
* 需要删除的对象
* @param id 需要删除的emp对象的id
* @return
*/
Integer deleteEmp(Integer id);
}
package cool.ale.tests;
import cool.ale.mapper.EmpMapper;
import cool.ale.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 java.io.IOException;
import java.io.InputStream;
public class MybatisCRUDTest {
private SqlSession session = null;
@Before
public void before() throws IOException {
// 从 xml中构建 SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// true是设置自动提交
session = sqlSessionFactory.openSession(true);
}
@Test
public void select() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(101);
System.out.println(emp);
}
@Test
public void Insert() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setId(102);
emp.setName("张三");
Integer result = mapper.insertEmp(emp);
System.out.println(result.toString());
}
@Test
public void Update() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setId(102);
emp.setName("李四");
Integer result = mapper.updateEmp(emp);
System.out.println(result.toString());
}
@Test
public void Delete() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Integer id = 102;
Integer result = mapper.deleteEmp(id);
System.out.println(result.toString());
}
}