Mybatis新手教程之简单入门

 

这篇文章主要给大家介绍了关于Mybatis新手教程之简单入门的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

 

1、Mybatis概述  

MyBatis 是支持普通 SQL 查询(相比较于Hibernate的封装,Mybatis是半自动化的JDBC封装,一个特点就是Mybatis执行的SQL查询语句需要自己在配置文件中写),存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。

2、Mybatis原理解析

下面以Mybatis简单的执行流程

Mybatis新手教程之简单入门_第1张图片

  1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着"findUserByUsername" parameterType="java.lang.String" resultType="cn.mybatis.po.User">

 SELECT * FROM t_user WHERE username LIKE '%${value}%'

 

Mybatis新手教程之简单入门_第8张图片

使用查询的时候碰到一个小错误,由于之前测试的insert方法,其中在User实体类中添加了有参构造函数,所以出现了下面的错误,分析原因就是:使用Mybatis查询的时候需要在实体类中加入无参构造方法(当然如果实体类本身没有构造函数,就会是默认的无参构造函数)

附上findByUsername的函数实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public void findUserByUsername() throws IOException {

 //得到配置文件的文件流信息

 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 SqlSession sqlSession = sqlSessionFactory.openSession();

 

 List userList = sqlSession.selectList("test.findUserByUsername","u");

 System.out.println(userList);

 //释放会话资源

 try {

  sqlSession.close();

 } catch (Exception e) {

  e.printStackTrace();

 }

 }

 

findByUsername函数实现

(3)删除操作

首先在Mapper中配置删除的操作

1

2

3

"deleteUser" parameterType="java.lang.Integer">

 DELETE FROM t_user WHERE id = #{value}

运行测试程序,同insert中一样,需要手动提交事务,如下面所示

Mybatis新手教程之简单入门_第9张图片

最终结果:

数据表中删除了编号为10的数据记录

Mybatis新手教程之简单入门_第10张图片

5.细节整理

 

(1)关于示例程序中一些相关类的理解

   a)SqlSessionFactoryBuilder

   用来创建SqlSessionFactory。因为SqlSessionFactory使用了单例模式,所以不需要使用单例模式来管理SqlSessionFactoryBuilder,只需要在创建SqlSessionFactory时 候使用一次就可以

   b)SqlSessionFactory

   会话工厂,用来创建SqlSession。可以使用单例模式来管理SqlSessionFactory这个会话工厂,工厂创建之后,就一直使用一个实例。

   c)SqlSession

   面向程序员的接口,提供了操作数据库的方法。SqlSession是线程不安全的(原因:在SqlSession实现类中除了接口中的操作数据库的方法之外,还有数据域的属性,比如说一些提交的数据等等,所以在多线程并发请求的时候,会导致线程不安全),所以我们可以将SqlSession使用在方法体里面,这样每个线程都有自己的方法,就不会冲突

(2)Mybatis中mapper映射文件

  如同解释Mybatis执行原理的时候一样,Mapper映射文件中配置的Sql语句,实际上在执行的时候都被封装称为一个个MapperStatment对象,即Mapper映射文件是按照statment来管理不同的Sql。在编写程序的时候,我们在使用SqlSession其中的操作数据库的方法(selectOne,selectList等等)的时候,传入的参数除了实参(id,模糊查询的字符串等等)之外,还需要传入的就是相应的Sql位置,而Sql是被Statment管理,所以就是传入namespace+statmentId

(3)占位符

   #{id}:其中的id表示的就是接受的输入参数,参数名称就是id,这里指出:如果输入参数是简单类型,#{}中的参数名可以任意设置(value或者其他名称)

   ${value}:表示将输入的参数不加任何的修饰,直接作为字符串拼接在SQL中但是这样直接拼接,容易导致SQL注入的隐患${value}中的value表示接受的输入参数,注意如果输入参数是简单类型,其中的形参只能用value

(4)别名定义

     ①单个别名的定义

1

2

3

4

 

 "cn.mybatis.po.User" alias="user">

 

      定义别名后的使用

1

2

3

     ②批量别名的定义

1

2

3

4

 

 <package name="cn.mybatis.po">package>

(5)在SqlMapConfig.xml中加载Mapper映射文件的时候,除了通过resource的方式,还可以使用mapper接口加载的方式来实现

  ①首先先注意一点:

     在配置mybatis-config.xml时,其中的节点是有顺序的,配置顺序依次为:

properties/settings/typeAliases/typeHandlers/objectFactory/objectWrapperFactory/plugins/environments/databaseIdProvider/mappers

     ②使用mapper加载的方式,要将mapper接口和mapper配置文件放在同一目录下面,并且文件名称一致,而且要遵循mapper代理的方式进行开发

1

2

3

 class="cn.mybatis.mapper.UserMapper">

6.Mybatis开发dao方法简介

  (1)使用dao接口+实现类的方式

   a)首先编写接口,如同一般编写模式方式进行编写

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package cn.mybatis.dao;

 

import cn.mybatis.po.User;

 

/**

 * 原始Dao方式开发:dao接口+dao实现类的方式

 */

public interface UserDao {

 

 //根据id查询信息

 public User findUserById(int id) throws Exception;

 //添加信息

 public void insertUser(User user) throws Exception;

 //删除信息

 public void deleteUser(int id) throws Exception;

}

 

dao接口

   b)然后编写接口实现

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

package cn.mybatis.dao.daoImpl;

 

import cn.mybatis.dao.UserDao;

import cn.mybatis.po.User;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.junit.Test;

 

public class UserDaoImpl implements UserDao {

 

 //使用构造方法注入SqlSessionFactory

 private SqlSessionFactory sqlSessionFactory;

 

 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

  this.sqlSessionFactory = sqlSessionFactory;

 }

 

 @Override

 @Test

 public User findUserById(int id) throws Exception {

  SqlSession sqlSession = sqlSessionFactory.openSession();

 

  User user = sqlSession.selectOne("test.findUserById",id);

 

  sqlSession.close();

  return user;

 }

 

 @Override

 public void insertUser(User user) throws Exception {

  SqlSession sqlSession = sqlSessionFactory.openSession();

//  User user1 = new User("test1","123","洪山区","男");

  sqlSession.insert("test.findUserById",user);

  sqlSession.commit();

  sqlSession.close();

 }

 

 @Override

 public void deleteUser(int id) throws Exception {

  SqlSession sqlSession = sqlSessionFactory.openSession();

 

  sqlSession.delete("test.findUserById",id);

  sqlSession.commit();

  sqlSession.close();

 }

}

 

dao接口实现类

   c)Mapper配置文件和SqlConfig配置文件不变

   d)使用Junit进行测试

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

package cn.mybatis.testdao;

 

import cn.mybatis.dao.UserDao;

import cn.mybatis.dao.daoImpl.UserDaoImpl;

import cn.mybatis.po.User;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

 

import java.io.InputStream;

 

public class UserDaoImplTest {

 

 private SqlSessionFactory sqlSessionFactory;

 

 @Before

 public void setUp() throws Exception {

  InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 }

 

 @Test

 public void testFindUserById() throws Exception{

  //创建UserDao的对象

  UserDao userDao = new UserDaoImpl(sqlSessionFactory);

 

  //调用UserDao的方法

  User user = userDao.findUserById(1);

 

  System.out.println(user );

 }

}

 

Junit测试

   e)测试结果

Mybatis新手教程之简单入门_第11张图片

   f)原始dao方法的问题

    ①dao接口实现中存在大量的模板方法(即很多重复性的代码 )

    ②调用SqlSession方法的时候将statmentid硬编码了

    ③条用SqlSession方法的时候传入的参数,由于使用泛型,所以在编译阶段不会报错(即使传入参数错误)

  (2)使用Mapper代理的方法(即只需要Mapper接口)

  (a)使用mapper方式的规范

    ①在使用mapper代理的方式中,namespace的值应该是mapper接口的路径

    ②在mapper.java接口文件中的接口方法名称和mapper.xml中的statment的id一致

    ③在mapper.java接口文件中的接口方法的输入参数和mapper.xml中的statment的parameterType一致

 

    ④在mapper.java接口文件中的接口方法的返回值类型和mapper.xml中的statment的resultType一致

  (b)查询、删除操作实例

    ①编写mapper.xml配置文件,其中包含select和delete的sql配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

xml version="1.0" encoding="UTF-8" ?>

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.mybatis.mapper.UserMapper">

 <select id="findUserById" parameterType="int" resultType="cn.mybatis.po.User">

  SELECT * FROM t_user WHERE id = #{id}

 select>

 

 <delete id="deleteUser" parameterType="java.lang.Integer">

  DELETE FROM t_user WHERE id = #{value}

 delete>

mapper>

 

mapper.xml配置文件

    ②编写mapper接口,按照mapper代理的方式开发规范来编写mapper的接口

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

package cn.mybatis.testmapper;

 

import cn.mybatis.mapper.UserMapper;

import cn.mybatis.po.User;

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.After;

import org.junit.Before;

import org.junit.Test;

 

import java.io.InputStream;

 

 

public class UserMapperTest {

 

 private SqlSessionFactory sqlSessionFactory;

 

 @Before

 public void setUp() throws Exception {

  InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 }

 

 @Test

 public void testFindUserById() throws Exception{

 

  SqlSession sqlSession = sqlSessionFactory.openSession();

  //得到UserMapper的代理对象

  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 

  User user = userMapper.findUserById(9);

 

  System.out.println(user);

 }

 

 @Test

 public void testDeleteUser() throws Exception {

  SqlSession sqlSession = sqlSessionFactory.openSession();

  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 

  userMapper.deleteUser(9);

  sqlSession.commit();

 }

 

 @After

 public void tearDown() throws Exception {

 }

}

 

mapper接口

    ③Junit测试

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

package cn.mybatis.testmapper;

 

import cn.mybatis.mapper.UserMapper;

import cn.mybatis.po.User;

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.After;

import org.junit.Before;

import org.junit.Test;

 

import java.io.InputStream;

 

 

public class UserMapperTest {

 

 private SqlSessionFactory sqlSessionFactory;

 

 @Before

 public void setUp() throws Exception {

  InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 }

 

 @Test

 public void testFindUserById() throws Exception{

 

  SqlSession sqlSession = sqlSessionFactory.openSession();

  //得到UserMapper的代理对象

  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 

  User user = userMapper.findUserById(8);

 

  System.out.println(user);

 }

 

 @Test

 public void testDeleteUser() throws Exception {

  SqlSession sqlSession = sqlSessionFactory.openSession();

  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

 

  userMapper.deleteUser(8);

 }

 

 @After

 public void tearDown() throws Exception {

 }

}

 

Junit测试

    ④查询结果展示

Mybatis新手教程之简单入门_第12张图片

    ⑤删除结果展示

Mybatis新手教程之简单入门_第13张图片

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

你可能感兴趣的:(Mybatis新手教程之简单入门)