mybatis-初学到会用

   mybatis,我认为大部分人在学习ssm框架的时候第一个学习的就是mybatis这个框架(嗯,反正我第一个学的就是mybatis)。然后我就想到了一个问题,为什么要先学习mybatis,而不是先去学习spring?
在这里插入图片描述
嗯,当我把ssm框架都学习了之后,我就懂了!mybatis无论从学习难度上还是理解度上都是最简单的!非常适合作为框架入门学习。

1、什么是mybatis

   根据官方的说法是:

  • MyBatis 是一款优秀的持久层框架

  • 支持自定义 SQL、存储过程以及高级映射

  • 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作

  • 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    我的理解就是:简化了原有的jdbc操作


2、学习前我们需要了解的知识

  1. 首先要知道什么是持久层
  2. sql语句的书写
  3. jdbc的知识(更容易理解mybatis)

3、入门

3.1、依赖

 在使用mybatis前,我们需要做的第一件事情是什么?答案当然是要导入mybatis的依赖,如果是maven项目就很简单了直接去中央仓库,将依赖的代码放在pom.xml中就可以了,代码如下:

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

我本人推荐大家在学习mybatis的时候可以根据mybatis的官方文档来进行学习,附:MyBatis3的中文官方文档

3.2、配置

  首先大家都知道mybatis主要就是需要和数据库进行交互,竟然要和数据库交互的话,mybatis就肯定需要进行配置来进行连接数据库。
  现在我们可以先来对比一下jdbc与mybatis连接方式的不同:

 // jdbc通用的连接数据库方法
 public static Connection getConnection(){
        Connection conn = null;
        // url,username,password 也可以通过properties配置文件获取
        // 数据库连接的地址
        String url = "";
        // 数据的用户名
        String username = "";
        // 数据库的密码
        String password = "";
        try{
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获取数据库连接
            conn = DriverManager.getConnection(url, username, password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return conn;
    }

从这段代码不难看出jdbc的连接配置都是写在类中的,接下来我们看一下mybatis的配置mybatis-config.xml:

<?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(配置):在configuration内进行连接数据库的配置-->
<configuration>
	<!--环境配置(environments):用来配置环境,
	可以有多个环境配置
	根据environment中的id来选择使用那个环境配置
	-->
    <environments default="development">
        <environment id="development">
        	<!--事务管理器(transactionManager):处理事务-->
            <transactionManager type="JDBC"/>
           	<!--dataSource :获取数据源-->
            <dataSource type="POOLED">
            	<!--连接数据库的驱动,地址,用户名,密码-->
                <property name="driver" value=""/>
                <property name="url" value=""/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <!--这里我后面会说-->
    <!--每一个Mapper.XML都需要在Mybatis核心配置中注册-->
    <mappers>
        <mapper resource="com/zj/dao/UserMapper.xml"></mapper>
    </mappers>
</configuration>

  嗯,看到这里大家可能发现一个问题就是为啥感觉用了mybatis以后感觉配置上更麻烦了?jdbc连接数据库就那么一点代码,而mybatis却要在xml配置这么多东西呐?其实这点大家可以思考一点就是,你认为把所有的配置都写在java类中好,还是放在一个配置文件然后取读取好。在这里多说一点就是xml中的driver、url、username、password最好写一个db.properties配置文件中,这样以后修改数据库不需要修改xml配置文件直接修改properties配置文件就可以了。
  如果大家想详细的了解mybatis配置文件中那些属性的含义可以去mybatis的官方文档去看,写的很详细。

3.3、mybatis的使用

 数据的连接搞定了,那么下一步就是使用了,这个文章我只会告诉初学者mybatis如何使用,其他的内容我其实也不知道如何说的比较详细让我思考思考在说!这里说一下mybatis的使用需要获取SqlSession对象,因为SqlSession完全包含了面向数据库执行SQL命令所需的所有方法(当然等我们学习晚spring以后我们就不需要手动获取SqlSession对象了,就全部交给spring了)。附上获取SqlSession对象的通用类;

//sqlSessionFactory-->sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用mybatis第一步获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = 
            Resources.getResourceAsStream(resource);
            sqlSessionFactory =
             new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 既然有了SqlSessionFactory,
    //顾名思义,我们就可以从中获得SqlSession实例
    // SqlSession完全包含了面向数据库执行SQL命令所需的所有方法
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

那么我们就开始来写我们的第一个mybatis程序
第一步:创建我们的数据库以及建表;

create DATABASE `mybatis`;

USE `mybatis`;

create table `user`(
	`id` INT(20) not null primary key,
	`name` varchar(30) DEFAULT null,
	`pwd` varchar(30) default null
)ENGINE=INNODB DEFAULT CHARSET=utf8;

insert into `user`(`id`,`name`,`pwd`)values
(1,'狂神','123456'),
(2,'张三','123456'),
(3,'李四','123890')

第二步:导入maven依赖;

<!--导入依赖-->
<dependencies>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--Junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

第三步:创建mybatis的配置文件;
第四步:写工具类获取SqlSession;
第五步:写实体类;

// 实体类
public class User {
    private Integer id;
    private String name;
    private String pwd;

    public User() {
    }
    
    public User(Integer id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

第六步:写我们dao层的接口;

public interface UserDao {

    List<User> getUserList();
}

第七步:
 到了这里大家其实发现除了获取数据库连接不同以外,jdbc和mybatis没有什么差别,那么到了这一步,就能看出两者的不同,以及为什么选择使用mybatis,jdbc如何写UserDaoImpl;

public class UserDaoImpl implements UserDao{


	public List<User> getUserList(){
	// 定义sql
	 String sql = "select* from user ";
	// 连接对象
	Connection conn = null;
	// 预编译对象 PreparedStatement
	PreparedStatement ps= null;
	// 结果集
	ResultSet rs= null;


	try {
		conn = DButils.getConnection();
		// 获取preparedStatement
		ps= conn.prepareStatement(sql);
		// 执行sql语句,并返回结果集到resultSet中
		rs= preparedStatement.executeQuery();
		List<User> list = new ArrayList();

	// 遍历结果集
	while (rs.next()) {
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setName(rs.getString("name");
		user.setPwd(rs.getString("pwd");
		list.add(user);
	}
	return list;
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		// 释放资源
		if (resultSet != null) {
		resultSet.close();
	}
	if (preparedStatement != null) {
		preparedStatement.close();
	}
	if (connection != null) {
		connection.close();
	}
		}
			return null;
	}			
}

嗯,看完这个代码以后,那么你会发现这个 代码好乱,sql语句预编译全部都是放在类中来实现,而mybatis并不是在类中来写sql语句而是在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">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.zj.dao.UserDao">
    <select id="getUserList" resultType="com.zj.pojo.User">
        select * from user
    </select>
</mapper>

这里我就解释一下前面配置文件里面那个mappers,它是一个映射器,为什么需要映射器,因为我们是把代码和sql分离了,可最后我们还是需要获取sql语句那么怎么获取就需要使用映射器来告诉 MyBatis 到哪里去找映射文件。
  回到主题,通过jdbc和mybatis的对比,会发现在代码的可读性上mybatis十分简单明了,把代码和sql分开,而jdbc把代码和sql放在一起无论是可读性还是维护上都不如mybatis。
最后让我们看看通过mybatis的测试类:

@Test
public void test(){
    // 第一步:获取SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    // 方式一:getMapper
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    List<User> userList = mapper.getUserList();

    for (User user : userList){
        System.out.println(user);
    }

    // 关闭SqlSession
    sqlSession.close();
}

这就是mybatis如何使用的一个流程,建库建表、导入依赖、工具类、实体类、dao层方法、以及通过映射文件来获取sql到最后的测试方法;
在这里我也说出了mybatis和jdbc的不同

为什么要使用mybatis

  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的JDBC代码太复杂了。简化。框架:自动化
  • 不用Mybatis也可以。更容易上手。技术没有高低之分
    优点:
    1、 简单易学
    2、灵活
    3、sql和代码的分离
    4、提供映射标签
    5、提供对象关系映射标签
    5、提供xml标签

最主要的一点是因为用的人多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值