MyBatis介绍:
Mybatis是一个持久层框架,一个ORM(对象关系映射)框架。支持定制化SQL,存储过程以及高级映射。避免了jdbc编程过程中所有的jdbc代码和手动设置参数以及获取结果集的硬编码。主要让编码人员集中精力放在sql上,通过mybatis提供的映射方式获取数据。
ORM:用于实现面向对象编程语言里不同类型系统的数据之间的转换。 可将数据库中的数据映射成Java的对象。
1,mybatis-config.xml作为MyBatis的全局配置文件,配置了MyBatis的运行环境等
2,mapper.xml文件是sql映射文件,文件中配置了操作数据库的sql语句。
3,通过SQLSessionFactoryBuilder类加载MyBatis 的运行环境生成SQlsessionFactory类
4,由SQLSessionFactory(会话工厂——单例模式实现)创建Sqlsession。一个请求获取一个单独的sqlsession
5,sqlSession用来操作数据库
6,Executor(执行器)---sqlsession通过执行器操作数据库。MyBatis底层定义了Executor执行器操作数据库,Executor接口有两个实现,一个是基本执行器,一个是缓存执行器
7,mapped statement(底层封装对象)---对操作数据库封装对象。它包装了MyBatis配置信息和mapper映射信息。mapper.xml文件中的每一个sql对应一个mapped statement对象。sql的id既mapped statement的id
8,Mapped Statement执行输入参数进行定义,包括hashmap、基本类型、pojo、Executor通过mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程 中的PreparedStatement设置参数
9,Mapped statement对sql对执行输出结果进行定义,包括hashMap、基本类型、pojo、Executor通过Mapped statement在执行sql后将输出结果映射到Java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
入门程序实现:
1,首先先引入依赖
1、通过maven来引入依赖:
<!--mysql连接数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!--log4j日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2,配置文件 mybatis-config.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>
<!--从配置文件中加载-->
<!--properties resource="jdbc.properties"--><!--/properties-->
<!--配置我们运行的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/NewMybatis529Test" />
<property name="username" value="root" />
<property name="password" value="132990" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
3,编写Bean类
package com.wj.bean;
/**
* 和数据库对应的bena类
*/
public class Student {
private int id;
private String name;
private String sex;
private int age;
public Student() {
}
public Student(int id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
4,编写dao层
package com.wj.dao;
import com.wj.bean.Student;
public interface StudentMapper {
//通过注解的形式来获取数据
// @Select("select * from student where id = #{id}")
Student getUserByID(Integer id);
}
5,编写对应的Mapper.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" >
<!-- namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址-->
<mapper namespace="com.wj.dao.StudentMapper">
<resultMap id="BaseResultMap" type="com.wj.bean.Student" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="TINYINT" />
</resultMap>
<!-- id 与调用方法一致,parameterType为参数类型,resultType为返回类型>
<select id="getUserByID" parameterType="java.lang.Integer" resultType="com.wj.bean.Student">
select * from student where id = #{id}
</select>
</mapper>
6,查询过程
package com.wj;
import com.wj.bean.Student;
import com.wj.dao.StudentMapper;
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;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
try {
/**
* 通过Resource获取mybatis配置流
*/
InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
/**
* 获取SqlSessionFactory实例
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
/**
* 获取SqlSession实例
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
/**
* 通过反射获取dao实例
*/
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.getUserByID(2);
System.out.println(student.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
来看一下运行结果
可以看到,结果就是我们想要查询的结果。
#{}与${}的区别:
${} 直接进行字符串的拼接
${} -》JDBC中的Statement
select * from orders where id = ${6};
Preparing: select * from orders where id = 6;
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${} 括号中只能是value。
#{}使用占位符,可以预编译
#{} -》JDBC中的preStatement
select * from orders where id = #{orderId};
Preparing: select * from orders where id = ?;
#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。