MyBatis

MyBatis

1.什么是MyBatis

MyBatis本来是Apache的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到Google code,并且改名为MyBatis。2013年11月迁移带GitHub。

MyBatis队JDBC的数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要话费经理去处理注册驱动。创建连接,创建statement,手动设置参数、结果集检索等繁琐的过程代码。

MyBatis通过xml或者注解的方式将要执行的各种statement配置起来,并且通过java对象和是他特闷他中的sql进行映射生成最终执行的SQL语句,最终由MyBatis框架执行SQL语句并且将结果映射成java对象并且返回。

在这里插入图片描述

  • mybatis-comfig.xml文件是MyBatis的核心配置文件,通过其中配置可以生成SqlSessionFactory,也就是SqlSession工厂
  • 基于SqlSessionFactory可以生成SqlSession对象
  • SqlSession可以发送SQL去执行,并且返回结果,类似于JDBC中的Connection对象,也是MyBatis中至关重要的一个对象
  • Executor是SqlSession底层的对象,用于执行SQL语句
  • MapperStatement对象也是sqlSession底层的对象,用于接收输入映射,并且及时输出映射
2.为什么使用MyBatis
2.1传统JDBC访问数据库
  • 使用JDBC访问数据库会出现大量的重复代码,造成冗余
  • JDBC自身没有连接池频繁的创建连接,关闭连接,效率低下
  • SQL语句在代码中硬编译,造成代码不易维护,实际应用sql变化的可能性较大,sql变动的话同时需要改变java代码,前一发动全身

以下为原始JDBC操作:

public void con(){
		//把几个用于连接数据库的字符串定义成常量,不必每次去创建,这些字符串也可以通过配置文件方式读取
		String USER = "root";//数据库用户名
		String UPWD = "root";//数据库密码
		//本地数据库shop
		String URL = "jdbc:mysql://localhost:3306/db_book";
		//驱动
		String DRIVER = "com.mysql.jdbc.Driver";
		Statement st = null;
		Connection con = null;
		try {
			//加载驱动
			Class.forName(DRIVER);
			//获取连接对象
			con = DriverManager.getConnection(URL, USER, UPWD);
			//获取执行对象
			st = con.createStatement();
			String sqlString = "create table stu(id int,name varchar(25),age int)";
			//执行sql
			int row = st.executeUpdate(sqlString);
			System.err.println(row);
			
		} catch (Exception e) {
			try {
				if(st != null) {
					st.close();
				}
			} catch (SQLException e2) {
				e2.printStackTrace();
			}
			try {
				if(con != null) {
					con.close();
				}
			} catch (SQLException e3) {
				e3.printStackTrace();
			}
		}
	}
2.2使用MyBatis框架访问数据库
  • MyBatis对JDBC进行了封装,可以简化JDBC代码;
  • MyBatis自身就可以支持连接数据库(也可以配置其他的连接池),因此可以提高程序的效率
  • MyBatis将SQL语配置在mapper文件中,修改SQL语句只是修改配置文件,类则不需要再重新编译
  • 对查询回来的数据ResultSet对象,MyBatis会帮我们进行处理,转换成Java对象,不需要程序员去处理
2.3总结

JDBC中出现的所有问题,在MyBatis框架中几乎都得到了解决。

3.MyBatis开发步骤
3.1创建数据库并且导入数据

建立数据库并且创建表(smbms_user)

在这里插入图片描述

导入随机数据(注意这里面的数据全部都是随机生成的,没有真实地址;modifyBy和modifyDate两个字段有内容的是因为小编之前测试过的,无伤大雅,直接忽略就好了,栓Q)

3.2添加依赖
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.11</version>
        </dependency>
		<!-- 数据库依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <!-- junit测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
3.3创建实体类
package com.csi.domain;

import java.util.Date;

public class User {
    private Integer id;
    private String userCode;    //用户编码
    private String userName;
    private String userPassword;
    private Integer gender;
    private Date birthday;
    private String phone;
    private String address;
    private Integer userRole;
    private Integer createdBy;  //创建者
    private Date creationDate;
    private Integer modifyBy;   //更新者
    private Date modifyDate;    //更新时间

    private Integer age;    //年龄
    private String userRoleName;    //用户角色名称

    public Integer getAge() {
        Date date = new Date();
        Integer age = date.getYear()-birthday.getYear();
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUserRoleName() {
        return userRoleName;
    }

    public void setUserRoleName(String userRoleName) {
        this.userRoleName = userRoleName;
    }

    public Integer getId() {
        return id;
    }

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

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getUserRole() {
        return userRole;
    }

    public void setUserRole(Integer userRole) {
        this.userRole = userRole;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getcreationDate() {
        return creationDate;
    }

    public void setcreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}
3.4编写映射文件
3.4.1dtd约束头
<?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">

可以直接上官网上查看

3.4.2配置mapper(UserMapper)

我这里写的是查询语句,如果是换其他的操作语句,写法是一样的

<mapper namespace="UserMapper">

    <select id="findAllUsers" resultType="User">
        select * from smbms_user
    </select>

</mapper>
  • namespace:命名空间名字虽然是随便起,但是尽量符合符合查询的语义,例如我们要查询的对象是User,那就可以起UserMapper
  • resultType:结果类型,从数据库查询到的数据库封装到那个位置,比如说我们这里查询语句查询到的结果要封装到User实体类中,但是这里用User而不适合domain.User是因为在接下来的核心配置文件mybatis-config.xml文件中我们通过typeAliases标签将domain.User更名为User
3.5编写核心配置文件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>

<!--    引入配置文件(下面会展示出来)-->
    <properties resource="jdbc.properties" />
<!--        设置mybatis的全局设置-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!--包的别名-->
    <typeAliases>
        <package name="com.csi.domain"/>
    </typeAliases>
    <!--指定默认的环境路径-->
    <environments default="development">
        <!--指定当前环境的名称-->
        <environment id="development">
            <!--指定事务管理类型是JDBC-->
            <transactionManager type="JDBC"/>
            <!--指定当前数据类型是连接池-->
            <dataSource type="POOLED">
                <!--如果引入外部配置文件可以这样写,如果没有的话用下面注释起来的方式写,我这里引入了-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
                
                
<!--                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--                <property name="url" value="jdbc:mysql://localhost:3306/smbms"/>-->
<!--                <property name="username" value="root"/>-->
<!--                <property name="password" value="root"/>-->

            </dataSource>
        </environment>
    </environments>
    <mappers>
 <!-- resource的方式加载映射文件 -->
        <mapper resource="com/csi/mapper/UserMapper.xml"/>
        <!-- 完全限定资源定位符的方式加载映射文件 -->
<!--        <mapper url="file:E:/桌面/作业m/mybatistest/src/main/resources/com/csi/mapper/UserMapper.xml" />-->
    </mappers>
</configuration>

typeAliases:设置类型别名。比如这里我们使用自己定义的user更换本来的domain。所以在UserMapper.xml中我们就可以把sql语句中的resultType字段写成“user”。

mybatis本身也为我们提供了一些别名来方便简写,如下:

别名数据类型
stringjava.lang.String
longjava.lang.long
Integerlava.lang.Integer
doublejava.lang.Double
booleanjava.lang.Boolean

外部引入jdbc.properties文件


##
driver = com.mysql.cj.jdbc.Driver


##
username = root

##
password = root

##
url = jdbc:mysql://localhost:3306/smbms
3.6测试
public class UserMapperTest {

    @Test
    public void  findUsers() throws IOException {
        //创建SqlSessionFactory对象,声明mybatis全局配置文件的路径
        String mybatsConfigFilePath = "mybatis-config.xml";

        //以输入流的方式加载mybatis配置文件
        InputStream is = Resources.getResourceAsStream(mybatsConfigFilePath);

        //基于读取mybatis配置文件创建SqlSessionFactory对象
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

        //使用SqlSessionFactory对象开启一个会话
        SqlSession session = sessionFactory.openSession();

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

        List<User> users = userMapper.findAllUsers();

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

        session.commit();
        session.close();
    }
}

测试结果

将输出的数据与数据库作对比,判断输出结果为正确~~~

在这里插入图片描述

4.总结

原来直接使用JDBC的sql代码被我们写入到了映射文件UserMapper.xml中,后续一些动态sql的加入更加简化了xml中代码量的书写。而在Java代码中,我们只需要新建一些SqlSession对象便可以将xml中的sql语句直接使用。耦合度大大降低,但是同时我们也发现,这样的配置还是相对复杂的,我们也可以通过注解配置Mapper,从而达到更进一步的简化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值