MyBatis学习笔记一

15 篇文章 0 订阅

1、mybatis简介

MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句
本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的
动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java
对象并返回。

1.1、普通JDBC操作数据库

public void findStudent() {
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	try {
		//注册 mysql 驱动
		Class.forName("com.mysql.jdbc.Driver");
		//连接数据的基本信息 url ,username,password
		String url = "jdbc:mysql://localhost:3306/dbname";
		String username = "root";
		String password = "123456";
		//创建连接对象
		conn = DriverManager.getConnection(url, username, password);
		//保存查询结果
		List<Student> stuList = new ArrayList<>();
		//创建 Statement, 用来执行 sql 语句
		stmt = conn.createStatement();
		//执行查询,创建记录集,
		rs = stmt.executeQuery("select * from student");
		while (rs.next()) {
			Student stu = new Student();
			stu.setId(rs.getInt("id"));
			stu.setName(rs.getString("name"));
			stu.setAge(rs.getInt("age"));
			//从数据库取出数据转为 Student 对象,封装到 List 集合
			stuList.add(stu);
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			//关闭资源
			if (rs != null) {
				rs.close();
			}
			if (stmt != null) {
			stmt.close();
			}
			if (conn != null) {
			conn.close();
			}
		} catch (Exception e) {
		e.printStackTrace();
		} 
	}
}

1.2、使用 JDBC 的缺陷

  1. 代码比较多,开发效率低
  2. 需要关注 Connection ,Statement, ResultSet 对象创建和销毁
  3. 对 ResultSet 查询的结果,需要自己封装为 List
  4. 重复的代码比较多些
  5. 业务代码和数据库的操作混在一起

1.3、MyBatis 解决的主要问题

MyBatis 可以完成:

  1. 注册数据库的驱动,例如 Class.forName(“com.mysql.jdbc.Driver”))
  2. 创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象
  3. 从 xml 中获取 sql,并执行 sql 语句,把 ResultSet 结果转换 java 对象
List<Student> list = new ArrayLsit<>();
ResultSet rs = state.executeQuery(“select * from student”);
while(rs.next){
Student student = new Student();
student.setName(rs.getString(“name”));
student.setAge(rs.getInt(“age”));
list.add(student);
  1. 关闭资源
    ResultSet.close() , Statement.close() , Conenection.close()

2、使用mybatis

2.1搭建mybatis环境

数据库名 school ;表名 servant
在这里插入图片描述

2.2创建maven工程

2.2.1配置pom.xml

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>

2.2.2创建实体类

public class Servant {

    private String sno;
    private String sname;
    private String sgen;
    private Integer sage;

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

2.2.3创建dao接口

public interface ServantDao {
    List<Servant> queryAll();

2.2.4在dao包下创建ServantDao.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="com.chunxi.dao.ServantDao">
   <!--
       select:表示查询操作。
       id: 你要执行的sql语法的唯一标识, mybatis会使用这个id的值来找到要执行的sql语句
           可以自定义,但是要求你使用接口中的方法名称。

       resultType:表示结果类型的, 是sql语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
          值写的类型的全限定名称
    -->
 	<select id="queryAll" resultType="com.chunxi.entity.Servant">
        select sno,sname,sgen,sage from servant
    </select>
</mapper>  

sql映射文件(sql mapper): 写sql语句的, mybatis会执行这些sql

  1. 指定约束文件(mybatis-3-mapper.dtd是约束文件的名称, 扩展名是dtd的。)
 <!DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  1. 约束文件作用: 限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求。
  2. mapper 是当前文件的根标签,必须的。
    namespace:叫做命名空间,唯一值的, 可以是自定义的字符串。
    要求使用dao接口的全限定名称。
  3. 在当前文件中,可以使用特定的标签,表示数据库的特定操作。
    select:表示执行查询,select语句
    update:表示更新数据库的操作, 就是在update标签中 写的是update sql语句
    insert:表示插入, 放的是insert语句
    delete:表示删除, 执行的delete语句

2.2.5创建mybatis主配置文件(必须放在resources目录下)

<?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>
    <!-- 全局配置 -->
    <settings>
        <!-- 日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--
        配置连接的数据库
            default:要连接的数据库 与environment的id保持一致
    -->
    <environments default="development">
        <!-- 可配置多个数据库 -->
        <environment id="development">
            <!--
                transactionManager :mybatis的事务类型
                    type: JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:表示数据源,连接数据库的
                    type:表示数据源的类型, POOLED表示使用连接池
            -->
            <dataSource type="POOLED">
                <!--
                   driver, user, username, password 是固定的,不能自定义。
                -->
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://192.168.31.204:3306/school"/>
                <!--访问数据库的用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="111111"/>
            </dataSource>
        </environment>
    </environments>
    <!-- sql mapper(sql映射文件)的位置-->
    <mappers>
        <!--一个mapper标签指定一个文件的位置。
           从类路径开始的路径信息。  target/clasess(类路径)
        -->
        <mapper resource="com/chunxi/dao/ServantDao.xml"/>
    </mappers>
</configuration>

3、测试

测试类

public class ServantDaoTest {

    @Test
    public void queryAll() throws IOException {
        //访问mybatis读取student数据
        //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)
        String config = "mybatis.xml";
        //2.读取这个config表示的文件
        InputStream is = Resources.getResourceAsStream(config);
        //3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //4.获取 SqlSession,SqlSession 能执行 sql 语句
        SqlSession sqlSession = factory.openSession();
        //6.【重要】指定要执行的sql语句的标识。  sql映射文件中的namespace + "." + 标签的id值
        String sqlid = "com.chunxi.dao.ServantDao.queryAll";
        //7.【重要】执行sql语句,通过sqlId找到语句
        List<Servant> servants = sqlSession.selectList(sqlid);
        //8.循环输出查询结果
        servants.forEach(servant -> System.out.println(servant));
        //9.关闭 SqlSession,释放资源
        sqlSession.close();
    }

结果
在这里插入图片描述

4、总结

4.1 项目编译后target目录

在这里插入图片描述
主配置文件mybatis.xml在classes下,dao包下存在mapper映射文件ServantDao.xml
如果缺少报错解决办法:

  • 查看pom.xml下是否缺少resources配置(可查看本文配置)
  • 使用maven重新clean在compile
  • 重新rebuild工程
  • 实在不行就复制粘贴到对应目录

4.2主要类介绍

主要类的介绍
1、 Resources: mybatis中的一个类, 负责读取主配置文件

  InputStream in = Resources.getResourceAsStream("mybatis.xml");

2、SqlSessionFactoryBuilder : 创建SqlSessionFactory对象,

 SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);

3、SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。

SqlSessionFactory:接口 , 接口实现类: DefaultSqlSessionFactory
SqlSessionFactory作用: 获取SqlSession对象。
SqlSession sqlSession = factory.openSession();
openSession()方法说明:

  1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
  2. openSession(boolean): openSession(true) 获取自动提交事务的SqlSession.
    openSession(false) 非自动提交事务的SqlSession对象

4、SqlSession:

SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
SqlSession接口的实现类DefaultSqlSession。

  • 使用要求: SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用 openSession()获取SqlSession对象。
    在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值