1、MyBatis的简介
1.1 原始jdbc操作
查询数据:
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
"root", "root");
// 获得预编译对象
PreparedStatement pst = connection.prepareStatement(
"select id,username,password from user");
// 执行查询
ResultSet resultSet = pst.executeQuery();
// 遍历结果集
while (resultSet.next()) {
// 封装实体
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
System.out.println(user);
}
// 释放资源
resultSet.close();
pst.close();
connection.close();
新增数据:
// 模拟实体对象
User user = new User();
user.setId(2);
user.setUsername("Tom");
user.setPassword("abc");
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
"root", "root");
// 获得预编译对象
PreparedStatement pst = connection.prepareStatement(
"insert into user(id,username,password) values (?,?,?)");
// 设置占位符参数
pst.setInt(1,user.getId());
pst.setString(2,user.getUsername());
pst.setString(3,user.getPassword());
// 执行操作
pst.executeUpdate();
// 释放资源
pst.close();
connection.close();
1.2 原始 jdbc 操作的分析
原始 jdbc 开发存在的问题如下:
① 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
② sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变 java 代码。
③ 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到 sql 语句的占位 符位置
应对上述问题给出的解决方案:
① 使用数据库连接池初始化连接资源
② 将 sql 语句抽取到 xml 配置文件中
③ 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
1.3 MyBatis介绍
- mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了
jdbc ,使开发者只需要关注 sql 语句本身,而不需要花费精力
去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 - mybatis 通过 xml 或注解的方式将要执行的各种 statement 配
置起来,并通过 java 对象和 statement 中 sql 的动态参数进行
映射生成最终执行的 sql 语句。 - 最后 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采
用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了
封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api
打交道,就可以完成对数据库的持久化操作。
2、MyBatis的快速入门
① 添加 MyBatis 的依赖坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
② 创建 user 数据表
③ 编写 User 实体类
④ 编写映射文件 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="userMapper">
<!--查询操作-->
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
⑤ 编写核心文件 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标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--自定义别名-->
<typeAliases>
<typeAlias type="com.it.demo.User" alias="user"></typeAlias>
</typeAliases>
<!--数据源环境-->
<environments default="development">
<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>
<!--加载映射文件-->
<mappers>
<mapper resource="com/it/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
数据源配置jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
⑥ 编写测试类
//获得核心配置文件
InputStream resourceAsStream =
Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
List<User> userList =
sqlSession.selectList("userMapper.findAll");
//打印数据
System.out.println(userList);
//释放资源
sqlSession.close();
3、MyBatis的映射文件概述
4、MyBatis的增删改查操作
4.1 增加
<insert id="save" parameterType="com.it.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
//模拟user对象
User user = new User();
user.setUsername("xxx");
user.setPassword("abc");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//执行操作 参数:namespace+id
sqlSession.insert("userMapper.save",user);
//mybatis执行更新操作 提交事务
//sqlSession.commit();
//释放资源
sqlSession.close();
4.2 修改
<update id="update" parameterType="com.it.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
//模拟user对象
User user = new User();
user.setId(7);
user.setUsername("lucy");
user.setPassword("123");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
sqlSession.update("userMapper.update",user);
//mybatis执行更新操作 提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
4.3 删除
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
sqlSession.delete("userMapper.delete",8);
//mybatis执行更新操作 提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
5、MyBatis的核心配置文件概述
5.1 配置文件层级关系:
5.2 MyBatis常用配置解析
properties
这些是外部化的,可替代的属性,一般在Java 属性配置文件中
setting
这是MyBatis中极为重要的调整设置,它们会改变MyBatis在运行时的行为。
typeAliases
类型别名是为java类型命名一个短的名字
typeHandlers
类型处理器被用来将获取的值以合适的方式转换成 Java 类型
environments
环境配置就是数据源的配置,MyBatis可以配置多个环境。但是每一个SqlSessionFactory的实例只能选择一个环境,即每个数据库对应一个SqlSessionFactory的实例。
mappers
mapper映射器就是用来告诉MyBatis从哪里去找映射文件,进而找到这些SQL语句。
6、MyBatis的相应API
6.1 SqlSession工厂构建器 SqlSessionFactoryBuilder
常用 API SqlSessionFactory build( InputStream inputStream)
通过加载 mybatis 的核心文件的输入流的形式构建一个 SqlSessionFactory 对象
String resource = " mybatis /builder/mybatis config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。 Resources 类帮助你从类路径下、文件系统或 一个 web URL 中加载资源文件。
6.2 SqlSession 工厂对象 SqlSessionFactory
SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:
6.3 SqlSession 会话对象
执行语句的主要方法
T selectOne (String statement, Object parameter)
List selectList (String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
操作事务主要方法:
void commit()
void rollback()