MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
对JDBC进行封装的框架有哪些
Mybatis,Hibernate,dbutils,Spring中的jdbcTemplate。
MyBatis基本原理
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射成java对象并返回。
使用JDBC操作数据库存在的问题
数据库连接频繁开启和关闭,会严重影响数据库的性能。代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。
我们先要下载MyBatis + Mysql驱动包
Mybaits下载:传送门~
Mysql驱动下载:传送门~
打开IDEA,新建一个简单的Java项目,项目就叫Mybaits吧,在项目Mybaits目录下创建一个libs目录(用于存放项目所要依赖的jar包),那要放哪些jar包呢?
需要的jar包有这些:
把jar包拷贝到libs目录下,别忘了libs → 右键 → Add as Library(这才是真正导入jar包)
Mysql数据库,数据库名sys,表名Student(可以使用开发工具Navicat来创建数据库)
主要步骤:
1、 创建PO(model)类(根据需求创建)
2、 创建全局配置文件SqlMapConfig.xml(文件名任意)
3、 编写映射文件
4、 加载映射文件,在全局配置文件SqlMapConfig.xml中进行加载。
5、 编写一个测试程序,即编写Java代码,连接并操作数据库。
编写测试程序的步骤:
a) 读取配置文件。
b) 通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。
c) 通过SqlSessionFactory创建SqlSession。
d) 调用SqlSession的操作数据库方法。
e) 关闭SqlSession。
注意: Mybatis使用的日志包是log4j的,所以需要添加log4j.properties(文件内容可以从mybatis-3.5.5.pdf中拷贝,mybatis-3.5.5.pdf就在下载后的Mybatis的目录里)
最终的目录结构:
全局配置文件SqlMapConfig.xml中的代码:
<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/sys"/>
<property name="username" value="root"/>
<property name="password" value="123456789"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="cn/kkdy/map/StudentMap.xml"/>
mappers>
configuration>
全局配置文件简单说明:
dataSource标签里有4个property,分别表示注册驱动、数据库连接的路径、用户名、密码。mappers标签的子标签mapper用于加载映射文件StudentMap.xml。
映射文件StudentMap.xml中的代码:
<mapper namespace="mybatis.kkdy">
<select id="StudentById" parameterType="String" resultType="cn.kkdy.model.Student">
select * from Student where id = #{id}
select>
mapper>
映射文件简单说明:
命名空间(namespace)用于区分不同的mapper,select标签中的id,通过id可以知道要执行的是哪一个sql语句,parameterType用于表示传进来的参数类型,即#{id}中的参数id的类型,resultType指返回的结果类型。
log4j.properties中的代码:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
提示: 以上三个配置文件的代码都可以从文件mybatis-3.5.5.pdf中找到(这个文件就在下载后的Mybatis的目录里),我们只需要拷贝过来修改即可。
Student类(model):
package cn.kkdy.model;
public class Student {
private String id;
private String name;
private int age;
private String sex;
private int score;
public Student() {
}
public Student(String id, String name, int age, String sex, int score) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
public String getId() {
return id;
}
public void setId(String 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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", score=" + score +
'}';
}
}
TestStu类(测试类):
package cn.kkdy.test;
import cn.kkdy.model.Student;
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.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestStu {
@Test
public void test() throws IOException {
//1、读取配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//2、通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过SqlSessionFactory创建SqlSession
SqlSession session = sqlSession.openSession();
//4、调用SqlSession的操作数据库方法
Student s = session.selectOne("mybatis.kkdy.StudentById", "202004");
System.out.println(s);
session.commit();
session.close(); //关闭SqlSession对象
}
}
运行结果:
Student{id='202004', name='酷酷的猿', age=20, sex='男', score=100}
代码分析:
重点讲解selectOne("mybatis.kkdy.StudentById", "202004")
方法中的参数。
第一个参数,mybatis.kkdy
就是映射文件中mapper标签中命名空间(namespace)的值,StudentById
指的是映射文件中select标签中id的值,总的来说,这个参数就是相当于一个sql语句。
第二个参数,这个参数的值会传递给映射文件中的sql语句中的变量id。
本文仅演示了查询数据库记录,其他数据库操作例如增、删、改都是类似的,只不过是调用了不同的方法而已。
如果要对数据库进行多种操作,可能会出现重复的代码,我们可以通过创建新的方法,并使用注解@Bufore、@After来抽取重复代码。
最后,我为了演示方便,都是直接抛出异常(不建议这样),建议处理异常。
以上的MyBatis快速入门项目,可以直接下载,无需积分。
MyBatis快速入门,就是这么简单。如果觉得还不错的话,就送我一个赞吧!如果本文对你有用的话,也欢迎收藏哦!