目录
6.1 SqlSession工厂构建器SqlSessionFactoryBuilder
6.2 SqlSession工厂对象SqlSessionFactory
1. MyBatis的简介
1.1 原始jdbc操作
原始jdbc操作(插入数据)
原始jdbc操作(查询数据)
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的快速入门
2.1 MyBatis开发步骤
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
- 添加MyBatis的坐标
- 创建user数据表
- 编写User实体类
- 编写映射文件UserMapper.xml
- 编写核心文件SqlMapConfig.xml
- 编写测试类
2.2 环境搭建
1. 导入MyBatis的坐标和其他相关坐标
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--日志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2. 创建myUser数据表
3. 编写User实体
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
4. 编写UserMapper映射文件
<?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="com.itheima.domain.User">
select * from MyUser
</select>
</mapper>
5. 编写MyBatis核心文件
<?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>
<!-- 配置数据源的环境-->
<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/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
2.3 编写测试代码
public class MybatisTest {
@Test
public void test1() throws IOException {
// 获得核心配置文件
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 MyBatis的插入数据操作
1. 编写UserMapper映射文件
<?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">
<!-- 插入操作-->
<insert id="save" parameterType="com.itheima.domain.User">
insert into myUser values(#{id},#{username},#{password})
</insert>
</mapper>
2. 编写插入实体User的代码
@Test
public void test2() throws IOException {
// 模拟user对象
User user=new User();
user.setUsername("tom");
user.setPassword("666");
// 获得核心配置文件
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得session工厂对象
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得session会话对象
SqlSession sqlSession=sqlSessionFactory.openSession();
// 执行操作 参数:namespace+id
sqlSession.insert("userMapper.save",user);
// mybatis执行更新操作 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
3. 插入操作注意问题
- 插入语句使用insert标签
- 在映射文件中使用parameterType属性指定要插入的数据类型
- Sql语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);
- 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()
4.2 MyBatis的修改数据操作
1. 编写UserMapper映射文件
<!-- 修改操作-->
<update id="update" parameterType="com.itheima.domain.User">
update myUser set username=#{username},password=#{password} where id=#{id}
</update>
2. 编写修改实体User的代码
// 修改操作
@Test
public void test3() throws IOException {
// 模拟user对象
User user=new User();
user.setId(6);
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();
}
3. 修改操作注意问题
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);
4.3 MyBatis的删除数据操作
1. 编写UserMapper映射文件
<!-- 删除操作-->
<delete id="delete" parameterType="java.lang.Integer">
delete from myUser where id=#{xx}
</delete>
2. 编写删除数据的代码
// 删除操作
@Test
public void test4() throws IOException {
// 获得核心配置文件
InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得session工厂对象
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得session会话对象
SqlSession sqlSession=sqlSessionFactory.openSession();
// 执行操作 参数:namespace+id
sqlSession.delete("userMapper.delete",6);
// mybatis执行更新操作 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
3. 删除操作注意问题
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);
5.MyBatis的核心配置文件概述
5.1 MyBatis核心配置文件层级关系
5.2 MyBatis常用配置解析
1. environments标签
数据库环境的配置,支持多环境配置
2. mapper标签
3. Properties标签
实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件
4. typeAliases标签
上面我们是自定义的别名,mybatis框架已经为我们设置好的一些常用的类型的别名
6.MyBatis的相应API
6.1 SqlSession工厂构建器SqlSessionFactoryBuilder
6.2 SqlSession工厂对象SqlSessionFactory
SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:
6.3 SqlSession会话对象
7.Mybatis的Dao层实现
7.1 传统开发方式
1. 编写UserDao接口
public interface UserMapper {
public List<User> findAll() throws IOException;
}
2. 编写UserDaoImpl实现
public class UserMapperImpl implements UserMapper {
@Override
public List<User> findAll() throws IOException {
InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession= sqlSessionFactory.openSession();
List<User> userList= sqlSession.selectList("userMapper.findAll");
return userList;
}
}
3. 测试传统方式
public class ServiceDemo {
public static void main(String[] args) throws IOException {
//创建dao层对象 当前dao层实现是手动编写的
UserMapper userMapper=new UserMapperImpl();
List<User> all= userMapper.findAll();
System.out.println(all);
}
}
7.2 代理开发方式
1. 代理开发方式介绍
2. 编写UserMapper接口
3. 测试代理方式
public class ServiceDemo {
public static void main(String[] args) throws IOException {
InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession= sqlSessionFactory.openSession();
UserMapper mapper= sqlSession.getMapper(UserMapper.class);
List<User> users= mapper.findAll();
System.out.println(users);
}
}
7.3 知识小结
MyBatis的Dao层实现的两种方式:
- 手动对Dao进行实现:传统开发方式
- 代理方式对Dao进行实现: UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
8.MyBatis映射文件深入
9.MyBatis核心配置文件深入
10.MyBatis的多表操作
11.MyBatis的注解开发