1、MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis,它是一个基于java的持久层框架。
MyBatis支持普通SQL查询,存储过程和高级映射的持久层框架,使用比较简单,使用XML或者注解配置和原始映射,将接口和java的POJO(Plain Old Java Objects)映射成数据库中的记录。
2、MyBatis的环境搭建
java环境
eclipse
mysql
mybatis运行环境(jar包)
3、框架流程
1、SqlMapConfig.xml
SqlMapConfig.xml是mybatis的全局配置文件,配置数据库,数据源,事务mybatis运行环境。
2、SqlSessionFactory
根据配置文件SqlMapConfig.xml创建工厂
3、SqlSesssion
通过工厂来创建SqlSession会话,在这里操作数据库,完成SQL的增,删,改,查
4、Executor
执行SqlSession语句,操作数据库执行。
5、mapped statement
对操作数据库存储封装(sql语句,输入参数,输出结果等)
4、入门示例
1、SqlMapConfig.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="db.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<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>
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
数据库文件配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student
jdbc.username=root
jdbc.password=123456
2、POJO类
简单的JavaBean类
package com.example.po;
public class User {
private String name;
private int age;
private String cls;
private int 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 getCls() {
return cls;
}
public void setCls(String cls) {
this.cls = cls;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", cls=" + cls + ", id="
+ id + "]";
}
}
3、映射文件User.xml文件
在映射文件中写SQL语句
参数
id:标识映射文件的sql标识
parameterType:参数类型
resultType:返回值类型
<?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 namespace="test">
<select id="findUserById" parameterType="int" resultType="com.example.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
</mapper>
4、在SqlMapConfig.xml中加载映射文件
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
5、单元测试
package mybatis.jdbc;
import java.io.IOException;
import java.io.InputStream;
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 com.example.po.User;
public class JdbcTest {
@Test
public void findUserByIdTest() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// 通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
// selectOne查询出一条记录
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
// 释放资源
sqlSession.close();
}
}
5、细节
1、参数
parameterType:输入的参数类型
resultType指定输出结果的类型
2、#{}和¥{}
#{}是一个点位符,接收的参数可以是简单类型,pojo,hashmap,
${}表示一个拼接的符号,会引起sql注入,因此不建议使用。
3、selectOne和selectList
selectOne查询一条记录进行映射。如果使用selectOne实现,也可以使用selectList实现(list中只有一条记录)
selectList表示查询列表进映射。如果有多条的话,使用selectOne则会报错。
6、传统Dao开发遇到的问题
1、dao接口实现类方法中存在大量的重复代码
2、存在很多 硬编码,不等于维护和修改
3、调用sqlsession方法时传入的变量,使用泛型,如果出错,编译时候也不会报,不利于开发。
解决办法mapper代理方法
7、mapper代理方法
1、定义接口
package com.example.mapper;
import com.example.po.User;
public interface UserMapper {
public User findUserById(int id) throws Exception;
}
2、UserMapper.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.example.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.example.po.User">
SELECT
* FROM USER WHERE id=#{value}
</select>
</mapper>
3、SqlMapConfig.xml文件中配置
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml" />
<package name="com.example.mapper"/>
</mappers>
4、测试用例
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
// 此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
// 创建sqlSessionFactory
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
//用户信息的综合 查询
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user = userMapper.findUserById(1);
System.out.println(user);
}
}
8、Sql片段
为什么使用sql片段
1、在进行Sql查询的时候,可能都要进行一些统一的操作。比如判断用户是否输入内容,如果没有内容,则不进行后续sql查询
2、一些比较常用的sql语句抽取出来,组成sql片段。
示例如下: