概述
mybatis是一个优秀的基于java的持久层框架,它内部封装了
jdbc,使开发者只需要关注sq语句本身,而不需要花费精力
去处理加载驱动、创建连接、创建 statement等繁杂的过程。mybatis通过xm或注解的方式将要执行的各种 statement配
置起来,并通过java对象和 statement中sq的动态参数进行
映射生成最终执行的sq语句。最后 mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了 jdbc api底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。
开发步骤
添加依赖
1
2
3
4
5
6
7
8
9
10
11<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>编写数据表与Bean类
创建并编写mapper.xml
1
2
3
4
5
6
7
8
<mapper namespace="userMapper">
<select id="findAll" resultType="com.myspring.bean.User">
select *
from user
</select>
</mapper>创建并编写sqlMapConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<!-- 配置数据源环境 -->
<environments default="">
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456789"/>
</dataSource>
</environment>
</environments>
</configuration>调用操作
1
2
3
4
5
6
7
8
9
10
11
12// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis/sqlMapConfig.xml");
// 获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行操作,参数即mapper.xml中的namespace.id
List<User> userList = sqlSession.selectList("userMapper.findAll");
// 测试
System.out.println(userList);
// 释放资源
sqlSession.close();
增删改查操作代码
1 |
|
1 | // 获得核心配置文件 |
配置文件常用标签
environments标签
配置数据库环境,支持多环境
transactionManager事务管理器属性
- JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域
- MANAGED: 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。
daraSource数据源属性
- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
- POOLED:这种数据源的实现利用“池”的概念将JDBC连接对象组织起来。
- JNDI:这个数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
Mapper标签
加载映射,加载方式有多种。
- 使用相对于类路径的资源引用,例如:< mapper resource=”org/ mybatis/ builder/ AuthorMapperxm”/>
- 使用完全限定资源定位符(URL),例如:< mapper url=”file//ar/ mappers/ Author Mapper.xm”/
- 使用映射器接口实现类的完全限定类名,例如:< mapper class=” org. mybatis builder. AuthorMapper”/>
- 将包内的映射器接口实现全部注主册为映射器,例如:< package name=” org. mybatis. builder”/>
Properties标签
实际开发中,习惯将数据源的配置信息单独抽取成个 properties文件,该标签可以加载额外配置的 properties文件
1 |
|
typeAliases标签
起别名,有已经设置好的常用的类型的别名,也可自定义
1 | <!-- 自定义别名,注意标签在config.xml中的顺序 --> |
MyBatis相关API
SqlSession工厂构建器SqlSessionFactoryBuilder
SqlSession工厂对象SqlSessionFactory
SqlSession会话对象
DAO层实现
采用 Mybatis的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流。
Mapper接口开发方法只需要程序员编写 Mapper接口(相当于Dao接口),由 Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
- Mapper.xm文件中的 namespace与 mapper接口的全限定名相同
- Mapper接口方法名和 Mapper. xm中定义的每个 statement的id相同
- Mapper接口方法的输入参数类型和 mapper. xn中定义的毎个sql的 parameter Type的类型相同
- Mapper接口方法的辅出参数类型和 mapper. xm中定义的每个sq的 resultType的类型相同
创建并编写Mapper.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<mapper namespace="com.myspring.dao.UserMapper">
<!-- 查询所有 -->
<select id="findAll" resultType="user">
select *
from user
</select>
<!-- 根据name查询所有 -->
<select id="findByName" parameterType="int" resultType="user">
select *
from user
where id = #{id}
</select>
</mapper>创建并编写Mapper接口
1
2
3
4
5
6public interface UserMapper {
// 查询所有
List<User> findAll() throws Exception;
// 根据id查询所有
User findById(int id);
}调用
1
2
3
4
5
6
7InputStream resourceAsStream = Resources.getResourceAsStream("myBatis/sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.findAll();
User user = mapper.findById(2);
映射文件:动态sql语句
1 | <!-- sql语句抽取 --> |
配置文件
类型转换TypeHandler标签
黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全覆盖_SSM整合_哔哩哔哩_bilibili
插件plugins标签
添加依赖
1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>1.0</version>
</dependency>在配置文件中添加标签
1
2
3
4
5<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 分页助手,设置分页信息以分页,startPage(pageNum,pageSize)
PageHelper.startPage(1, 1);
// 当前页
List<User> userList = mapper.findAll();
// 分页信息
PageInfo<User> userPageInfo = new PageInfo<>(userList);
for (User user : userList) {
System.out.println(user);
}
System.out.println("上一页:" + userPageInfo.getPrePage());
System.out.println("当前页:" + userPageInfo.getPageNum());
System.out.println("下一页:" + userPageInfo.getNextPage());
System.out.println("总页数:" + userPageInfo.getPages());
System.out.println("当前条数:" + userPageInfo.getPageSize());
System.out.println("总条数:" + userPageInfo.getTotal());
System.out.println("是否第一页:" + userPageInfo.isIsFirstPage());
System.out.println("是否末页:" + userPageInfo.isIsLastPage());
多表操作
黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全覆盖_SSM整合_哔哩哔哩_bilibili
注解开发
使用xml开发crud
1 | <!-- 加载映射文件 --> |
1 |
|
1 | public interface UserMapper { |
1 | public class UserMapperTest { |
注解开发CRUD
1 | public interface UserMapper { |
1 | <!-- 加载映射关系 --> |
调用不变