前言
什么是Mybatis?
mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
在我不用Mybatis开发的情况下,我的dao层使用的是jdbc开发,但是它存在着以下问题
①-数据库链接的创建,释放频繁让我们的系统资源浪费严重,在一个大的项目下真的很影响系统性能.
②-sql的语句在我们写的代码中硬编码,让我们的代码变得不容易维护,实际应用中sql语句的变化可能较大,sql的变动需要我们改变java代码.
③-在我们进行查询操作的时候,需要手动将结果集中的数据封装到实体中间,插入操作时又需要手动将实体数据设置到sql语句的占位符位置
但是我们如何解决呢?
这个时候我们就需要Mybatis,方法如下
①-使用数据库连接池初始化连接资源
②-将sql语句抽取到xml配置文件中
③-使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
入门热身
在开始之前给大家看看在下的目录包结构:
MyBatis开发步骤:
①在Maven中(项目里的pom.xml文件)添加MyBatis的坐标
<?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>Mybatis_01</groupId>
<artifactId>Mybatis_01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
②创建一个测试的数据表(Student)
-- 创建数据库studentmanager
CREATE DATABASE `studentmanager`;
-- 使用这个数据库
USE studentManager;
-- 创建一个student表
CREATE TABLE student(
-- 添加id属性为int 添加主键,并且设置自增
id INT(11) PRIMARY KEY AUTO_INCREMENT,
-- 添加name属性为varchar
NAME VARCHAR(20) NULL,
-- 添加年龄
age INT(11) NULL,
-- 添加性别
sex VARCHAR(1)NULL
);
-- 向student表插入一条数据
INSERT INTO student VALUES (NULL,'坤坤',22,'女');
-- 表格创建完成后查询一下确保数据插入
SELECT * FROM student;
③编写Student实体类并且创建该类的接口,配置一个StudentDao.xml文件
//Student实体类
package com.itcast.damain;
public class Student {
private int id;
private String name;
private int age;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
//student接口并且添加增删改查方法
package com.itcast.dao;
import com.itcast.damain.Student;
import java.util.List;
public interface StudentDao {
//查询所有学生,由于是查询操作所以我们需要一个返回值类型,一个student集合
List<Student> findAll();
//添加学生,添加操作需要一个student对象
void addStudent(Student student);
//根据Id删除学生,需要传入id值
void delectByStudentId(int id);
//修改学生操作,需要一个student对象
void update(Student student);
}
StudentDao.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="com.itcast.dao.StudentDao">
<!--查询所有-->
<select id="findAll" resultType="student">
select * from student
</select>
<!--插入操作-->
<insert id="addStudent" parameterType="student">
insert into student values(null,#{name},#{age},#{sex})
</insert>
<!--根据id删除学生-->
<delete id="delectByStudentId" parameterType="student">
delete from student where id=#{id}
</delete>
<!--修改学生-->
<update id="update" parameterType="student">
update student set name=#{name},age=#{age},sex=#{sex} where id=#{id}
</update>
</mapper>
<!--注意: UserDao.xml 需要 与 接口所在的包保持一致. -->
④编写配置文件 mybatis的核心配置文件和映射文件.需要jdbc.properties文件哦
#jdbc文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/studentManager
jdbc.username=root
jdbc.password=root
<!--头文件-->
<?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>
<!--jdbc文件指向-->
<properties resource="jdbc.propperties"/>
<!--======================================================================================-->
<!--给我们的路径配置一个别名,这个配置别名需要放到jdbc指向下面,不然会报错哦:这一步可以省略,但是别名可以让我们在后面更大的项目中省下时间,推荐使用-->
<typeAliases>
<!--这里的"com.itcast.domain.Student"是我的Student类的全限定类名,后面的alias="student"则是你需要起的别名-->
<typeAlias type="com.itcast.domain.Student" alias="student"/>
</typeAliases>
<!--======================================================================================-->
<!--数据库链接配置-->
<environments default="development"> <!--这个配置是设置默认使用的数据库连接池,你可以在这个标签下添加其它的数据库连接池,如c3p0,druid-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--这里的连接池四大必备元素我们采用动态获取的方式-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--======================================================================================-->
<!--读取mybatis 映射文件-->
<mappers>
<!--这里填写你的实体类接口的xml文件的全限定路径-->
<mapper resource="com/itcast/dao/StudentDao.xml"/>
</mappers>
</configuration>
⑤激动人心的测试时间!!!
import com.itcast.damain.Student;
import com.itcast.dao.StudentDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo {
// 修改学生
@Test
public void test4() throws IOException {
// 获取核心配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得session工厂对象
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
// 获得session回话对象
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setId(2);
student.setName("蔡广坤");
student.setAge(24);
student.setSex("女");
mapper.update(student);
sqlSession.close();
}
// 删除学生
@Test
public void test3() throws IOException {
// 获取核心配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得session工厂对象
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
// 获得session会话对象
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
mapper.delectByStudentId(2);
sqlSession.close();
}
// 插入学生
@Test
public void test2() throws IOException {
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setName("波澜哥");
student.setAge(22);
student.setSex("男");
mapper.addStudent(student);
sqlSession.close();
}
// 查询所有
@Test
public void test1() throws IOException {
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession();
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
List<Student> list = mapper.findAll();
for (Student student : list) {
System.out.println(student);
}
}
}
后话:
感觉很遗憾没有分享之前学习的代码,但是根据笔者目前的学习状况,还是能有多余的时间来和各位分享的,尽量补齐前面的学习代码,另外如果我的代码有什么问题欢迎提出来,让我们一起学习进步,如果对我的代码有不清楚的地方也欢迎留言提问,我会抽时间一一回答.同为IT行业的一员,让我们共同进步吧,