mybatis的简单入门

前言

什么是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行业的一员,让我们共同进步吧,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值