抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Hello world!

概述

mybatis是一个优秀的基于java的持久层框架,它内部封装了
jdbc,使开发者只需要关注sq语句本身,而不需要花费精力
去处理加载驱动、创建连接、创建 statement等繁杂的过程。

mybatis通过xm或注解的方式将要执行的各种 statement配
置起来,并通过java对象和 statement中sq的动态参数进行
映射生成最终执行的sq语句。

最后 mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了 jdbc api底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。

开发步骤

  1. 添加依赖

    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>
  2. 编写数据表与Bean类

  3. 创建并编写mapper.xml

    1
    2
    3
    4
    5
    6
    7
    8
    <?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.myspring.bean.User">
    select *
    from user
    </select>
    </mapper>
  4. 创建并编写sqlMapConfig.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?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="">
    <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>
  5. 调用操作

    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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.myspring.bean.User">
select *
from user
</select>
<!-- 插入 -->
<insert id="save" parameterType="com.myspring.bean.User">
insert into user
values (#{name}, #{age})
</insert>
<!-- 修改 -->
<update id="update" parameterType="com.myspring.bean.User">
update user
set age=#{age}
where name = #{name}
</update>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis/sqlMapConfig.xml");
// 获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();

// 查询
List<User> userList = sqlSession.selectList("userMapper.findAll");
// 插入
sqlSession.insert("userMapper.save", new User("李52四", 11));
// 修改
sqlSession.update("userMapper.update", new User("李52四", 110));
// 删除
sqlSession.delete("userMapper.delete", "李52四");
// 执行更新操作需要提交事务
sqlSession.commit();

// 释放资源
sqlSession.close();

配置文件常用标签

environments标签

配置数据库环境,支持多环境

image-20210717113103566

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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 resource="jdbc.properties"/>
<!-- 配置数据源环境 -->
<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="mybatis/UserMapper.xml"/>
</mappers>
</configuration>

typeAliases标签

起别名,有已经设置好的常用的类型的别名,也可自定义

image-20210717115049996

1
2
3
4
<!-- 自定义别名,注意标签在config.xml中的顺序 -->
<typeAliases>
<typeAlias type="com.myspring.bean.User" alias="user"/>
</typeAliases>

MyBatis相关API

SqlSession工厂构建器SqlSessionFactoryBuilder

image-20210717115904738

SqlSession工厂对象SqlSessionFactory

image-20210717120144619

SqlSession会话对象

image-20210717120625651

DAO层实现

采用 Mybatis的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流。

Mapper接口开发方法只需要程序员编写 Mapper接口(相当于Dao接口),由 Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

image-20210717123055155

  • Mapper.xm文件中的 namespace与 mapper接口的全限定名相同
  • Mapper接口方法名和 Mapper. xm中定义的每个 statement的id相同
  • Mapper接口方法的输入参数类型和 mapper. xn中定义的毎个sql的 parameter Type的类型相同
  • Mapper接口方法的辅出参数类型和 mapper. xm中定义的每个sq的 resultType的类型相同
  1. 创建并编写Mapper.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?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.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>
  2. 创建并编写Mapper接口

    1
    2
    3
    4
    5
    6
    public interface UserMapper {
    // 查询所有
    List<User> findAll() throws Exception;
    // 根据id查询所有
    User findById(int id);
    }
  3. 调用

    1
    2
    3
    4
    5
    6
    7
    InputStream 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!-- sql语句抽取 -->
<sql id="selectUser">
select *
from user
</sql>

<!-- 动态条件 -->
<select id="findByCondition" parameterType="user" resultType="user">
<include refid="selectUser"/>
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=0">
and age=#{age}
</if>
</where>
</select>

<!-- 动态条件 -->
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"/>
<where>
-- select * from user where id in(?,?)
-- collection写list或array等
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>

配置文件

类型转换TypeHandler标签

黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全覆盖_SSM整合_哔哩哔哩_bilibili

插件plugins标签

  1. 添加依赖

    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>
  2. 在配置文件中添加标签

    1
    2
    3
    4
    5
    <plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper">
    <property name="dialect" value="mysql"/>
    </plugin>
    </plugins>
  3. 调用

    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
2
3
4
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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.myspring.dao.UserMapper">

<!-- sql语句抽取 -->
<sql id="selectUser">
select *
from user
</sql>

<!-- 查询 -->
<select id="findAll" resultType="user">
<include refid="selectUser"/>
</select>
<select id="findById" parameterType="int" resultType="user">
select *
from user
where id = #{id}
</select>
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"></include>
<where>
-- select * from user where id in(?,?)
-- collection写list或array等
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
<select id="findByCondition" parameterType="user" resultType="user">
<include refid="selectUser"></include>
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=0">
and age=#{age}
</if>
</where>
</select>
<!-- 插入 -->
<insert id="save" parameterType="com.myspring.bean.User">
insert into user (name, age)
values (#{name}, #{age})
</insert>
<!-- 修改 -->
<update id="update" parameterType="com.myspring.bean.User">
update user
set age=#{age},
name=#{name}
where id = #{id}
</update>
<!-- 删除 -->
<delete id="delete" parameterType="int">
delete
from user
where id = #{id}
</delete>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface UserMapper {
List<User> findAll();

User findById(int id);

List<User> findByCondition(User user);

List<User> findByIds(List<Integer> ids);

void save(User user);

void update(User user);

void delete(int id);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class UserMapperTest {

private UserMapper userMapper;

@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("myBatis/sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userMapper = sqlSession.getMapper(UserMapper.class);
}

@Test
public void testSave() throws Exception {
User user = new User();
user.setName("钱老板");
user.setAge(90);
userMapper.save(user);
}

@Test
public void testUpdate() throws Exception {
User user = userMapper.findById(3);
user.setAge(99);
userMapper.update(user);
}

@Test
public void testDelete() throws Exception {
userMapper.delete(4);
}

@Test
public void testFindById() throws Exception {
User user = userMapper.findById(3);
System.out.println(user);
}

}

注解开发CRUD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface UserMapper {
@Select("select * from user")
List<User> findAll();

@Select("select * from user where id = #{id}")
User findById(int id);

@Insert("insert into user (name, age) values (#{name}, #{age})")
void save(User user);

@Update("update user set age=#{age}, name=#{name} where id = #{id}")
void update(User user);

@Update(" delete from user where id = #{id}")
void delete(int id);
}
1
2
3
4
5
<!-- 加载映射关系 -->
<mappers>
<!-- 指定接口所在的包 -->
<package name="com.myspring.dao"/>
</mappers>

调用不变

评论




🧡💛💚💙💜🖤🤍