(1.2)、MyBatis介绍及其环境搭建-程序员宅基地

技术标签: MyBatis框架  

MyBatis介绍:

数据库持久化概念:

数据库持久化将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、文件的存储、数据的读取等都是数据持久化操作。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。

MyBatis框架简介:

  MyBatis的前身是iBatis,本是Apche的一个开源项目,2010年这个项目有Apache Software Foundation 迁移到Google Code,并改名为MyBatis。2013年迁移到Githud。

  MyBatis 官网:http://mybatis.org

  Github:https://github.com/mybatis

什么是ORM?

  ORM即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。

在实际开发中,程序员使用面向对象的技术操作数据,而当存储数据时,使用的确实关系型数据库,这样造成了很多不便。ORM在对象模型和关系数据库的表之间建立了一座桥梁。有了ORM,程序员就不需要在使用SQL语句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据库的存储、查询、更改和删除等操作。MyBatis通过简单的XML或者注解进行配置和原始映射,将实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。

什么是 MyBatis ?

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis框架的优点?

1. 与JDBC相比,减少了50%以上的代码量。

2. MyBatis是最简单的持久化框架,小巧并且简单易学。

3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL卸载XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

4. 提供XML标签,支持编写动态SQL语句。

5. 提供映射标签,支持对象与数据库的ORM字段关系映射。

MyBatis框架的缺点?

1. SQL语句的编写工作量较大,对开发人员编写SQL语句功底有一定要求。

2. SQL语句依赖于数据库,导致数据库的移植性差,不能随意更换数据库。

MyBatis框架使用场合?

1. MyBatis专注SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,如互联网项目,那么MyBatis将是不错的选择。

MyBatis 环境搭建步骤:

一、MyBatis需要使用的jar包:

mybatis-3.3.0.jar 下载 密码:vq9w

mysql-connector-java-5.1.0-bin.jar 下载 密码:zxx8

 

二、部署jar包

右键项目 --> Properties --> Add Library --> User Library --> Next --> User Libraries --> New -->  Add External JARs -->选择jar路径 --> Apply and Close

 

 新建包和配置文件

三、编写MyBatis核心配置文件:

 mybatis.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="db.properties"/>
    
    <!-- 实体类定义别名 -->
    <typeAliases>
        <typeAlias type="bean.User" alias="_User"/>
    </typeAliases>
    
    <environments default="cybatis">
        <environment id="cybatis">
            <!-- type="JDBC" 代表使用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}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8
username=root
password=root

新建测试表

user.sql

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `uId` int(4) NOT NULL AUTO_INCREMENT,
  `uName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `uPwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`uId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

四、创建实体类

User.java

package bean;

public class User {
    private int uId;
    private String uName;
    private String uPwd;
    private double account;
    public int getuId() {
        return uId;
    }
    public void setuId(int uId) {
        this.uId = uId;
    }
    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public String getuPwd() {
        return uPwd;
    }
    public void setuPwd(String uPwd) {
        this.uPwd = uPwd;
    }
    public double getAccount() {
        return account;
    }
    public void setAccount(double account) {
        this.account = account;
    }
        
}

五、编写SQL映射接口

package mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import bean.User;

/**
 * @author Mr.Tong
 *    SQL映射接口
 */
public interface UserMapperI {
    
    /** 使用@Insert注解指明insertUser方法要执行的SQL
     * @param user 新增的用户对象
     * @return 新增执行结果
     */
    @Insert("insert into user(uName,uPwd,account) value(#{uName},#{uPwd},#{account});")
    public int insertUser(User user);
    
    /** 使用@Delete注解指明delUser方法要执行的SQL
     * @param uId 删除的用户编号
     * @return 删除执行结果
     */
    @Delete("delete from user where uId = #{uId}")
    public int delUser(int uId);
    
    
    /** 使用@Select注解指明getUser方法要执行的SQL
     * @param uId 查询的用户编号
     * @return uId用户对象
     */
    @Select("select * from user where uId = #{uId}")
    public User getUser(int uId);
    
    
    /** 使用@Update注解指明updUser方法要执行的SQL
     * @param user User对象
     * @return 执行修改结果
     */
    @Update("update user set uName=#{uName},uPwd=#{uPwd},account=#{account} where uId = #{uId}")
    public int updUser(User user);
    
    /** 使用@Select注解指明getAllUser方法要执行的SQL
     * @return 所有用户集合
     */
    @Select("select * from user")
    public List<User> getAllUser();
    
}

六、编写SQL映射文件

userMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="mapper.UserMapper">
        <!-- 根据id查询到一个User对象 -->
        <select id="getUser" parameterType="int" resultType="_User">
                select * from user where uId=#{uId}
        </select>
        <!-- 创建用户信息 -->
        <insert id="insertUser" parameterType="_User">
            insert into user(uName,uPwd,account) value(#{uName},#{uPwd},#{account});
        </insert>
        <!-- 修改用户信息 -->
        <update id="updateUser" parameterType="_User">
            update user set uName = #{uName},uPwd=#{uPwd},account=#{account} where uId = #{uId}
        </update>
        <!-- 删除用户信息 -->
        <delete id="deleteUser" parameterType="int">
            delete from user where uId = #{uId};
        </delete>
        <select id="getUserList" parameterType="int" resultType="_User">
            select * from user
        </select>
    </mapper>

七、JUnit测试

demo.java

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import bean.User;
import mapper.UserMapperI;
import tool.MyBatisUtil;

public class demo {

    @Test
    public void getUser() {
        SqlSession session = MyBatisUtil.getSqlSession();
        UserMapperI userMapperI = session.getMapper(UserMapperI.class);
        User user = userMapperI.getUser(1);
        System.out.println(user.getuName());
    }
    
    @Test
    public void addUser() {
        SqlSession session = MyBatisUtil.getSqlSession(true);
        UserMapperI userMapperI = session.getMapper(UserMapperI.class);
        User user = new User();
        user.setuName("李四");
        user.setuPwd("123123");
        user.setAccount(123.93);
        int result = userMapperI.insertUser(user);
        System.out.println(result);
    }
    
    @Test
    public void updateUser() {
        SqlSession session = MyBatisUtil.getSqlSession(true);
        UserMapperI userMapperI = session.getMapper(UserMapperI.class);
        User user = new User();
        user.setuId(3);
        user.setuName("王五");
        user.setuPwd("123456");
        user.setAccount(200.93);
        int result = userMapperI.updUser(user);
        System.out.println(result);
    }
    
    @Test
    public void deleteUser() {
        SqlSession session = MyBatisUtil.getSqlSession(true);
        UserMapperI userMapperI = session.getMapper(UserMapperI.class);
        int result = userMapperI.delUser(1);
        System.out.println(result);
    }
    
    @Test
    public void getUserList() {
        SqlSession session = MyBatisUtil.getSqlSession(true);
        UserMapperI userMapperI = session.getMapper(UserMapperI.class);
        List<User> uList = userMapperI.getAllUser();
        System.out.println(uList.size());
    }
    
}

运行结果:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42726314/article/details/82501514

智能推荐

Run Windows in Ubuntu with VMware Player 使用 VMware Player 在 Ubuntu 下运行 Win_open ‘ubuntu_abc’ using the vmware player-程序员宅基地

文章浏览阅读1.9k次。你是一个经常使用 Win 下的程序的 Ubuntu Linux 爱好者吗?这篇文章介绍了如何通过免费的 VMware Player ,在 Ubuntu 下完整的运行 Win 。虽然 Linux 的界面变得越来越友好,但是多数商业软件依然只支持 Win 和 Mac 。同时安装 Win 和 Linux 比较流行的做法,但是这个方法并不好,因为您每次运行 Win 下的程序时都要重新启动操作系统。使用虚拟机后,您就不需要在两个系统中进行取舍了。VMware Player 虚拟机中能够快速、简单地安装各种版本_open ‘ubuntu_abc’ using the vmware player

Ubuntu的NVIDIA安装问题building module_building kernel modules卡住-程序员宅基地

文章浏览阅读3k次,点赞5次,收藏5次。安装方法如传送门:https://blog.csdn.net/qq_37643960/article/details/88953336我照着上面的方法进行安装时,卡在了installing dkms kernel module:Building module(This may take a moment): 5%这个时候其实是要你设置内核的密码(8位以上数字+字母),但是NVIDIA没有给显示出来,你就需要自己盲打,而且密码要输入两次,即输入一次密码然后回车,再输_building kernel modules卡住

抽象类的定义及运用_本关任务:掌握抽象类的定义及用法。-程序员宅基地

文章浏览阅读625次。对于抽象类与抽象方法的限制如下: (1)凡是用abstract 修饰符修饰的类被称为抽象类。凡是用abstract修饰符修饰的成员方法被称为抽象方法。  (2)抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。  (3)抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。  (4)对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。  (5)抽象类可以派生子类,在抽象类派生的子类中必须实现抽象类中定义的所有抽象方法。  (6)抽象类不能创建对象,创建对象的工_本关任务:掌握抽象类的定义及用法。

【技术】纯Java编写算数验证码_java totp 验证码计算-程序员宅基地

文章浏览阅读582次。纯Java编写算数验证码工具类测试类工具类工具类包含两个核心方法:getCode(Integer width, Integer height):生成算数验证吗getCode(Integer width, Integer height, Integer count, Integer size):生成普通验证码public class Captcha { /** * 生成验证码图片 * * @param width 图片宽度,默认:130 * @p_java totp 验证码计算

区分Transfer-Encoding,TE,Content-Encoding,Accept-Encoding四个首部字段_accept-encoding 和te-程序员宅基地

文章浏览阅读3.6k次,点赞5次,收藏9次。关于Transfer-Encoding,TE,Content-Encoding,Accept-Encoding四个首部字段的区分。_accept-encoding 和te

libevent源码学习(14):IO复用模型之epoll的封装_epoll_init-程序员宅基地

文章浏览阅读545次。目录Libevent提供的epoll后端结构体初始化epoll_init何时调用epoll_init事件添加epoll_nochangelist_add何时调用epoll_nochangelist_add事件删除epoll_nochangelist_del何时调用epoll_nochangelist_del事件监听epoll_dispatch为什么evmap_io_active的第三个参数需要或上一个EV_ET?何时调用epoll_dispatchepoll销毁e_epoll_init

随便推点

Jmeter 正则提取和json提取用法_jmeter正则提取list-程序员宅基地

文章浏览阅读6.8k次。1.jmeter 正则方式提取响应的参数http 访问接口根据返回进行获取响应引用名称是获取的参数的别名,后面如需用到该参数,直接用${参数名} 就可以了, 如新加的http请求${msg}就是列子,多个值,用逗号隔开2. jmeter json提取器多个参数请用分号隔开..._jmeter正则提取list

SpringBoot+shiro 注解事务不起作用探究-程序员宅基地

文章浏览阅读126次。现象:springboot1和shiro 配合时,service中的 @Transactional 不起作用。一、shiro配置代理引起Shiro在使用注解的时的配置是:<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifec..._securitymanager不起作用

二、ubuntu虚拟机上创建发布.NetCore程序 --ubuntu上通过Docker部署.NetCore +MySQL程序_ubuntu中部署.net core程序需要使用docker吗-程序员宅基地

文章浏览阅读656次。通过上次,我们已经搭建起了ubuntu虚拟机的环境。现在我们在此环境上安装下Docker.1、通过图形界面操作安装Docker网上一大堆通过命令进行配置Docker的教程,但作为一名资深的Windows用户,习惯了通过“点点点”进行环境配置,继续继承了多年来得优秀传统,具体安装步骤如下:2、重启虚拟机3、打开命令创库,测试Docker安装是否成功。通过【Ctrl+Alt+T】打开终端,具体如下图:当然,也可以在已安装程序中去找“终端”,通过鼠标打开.在“终端”输入sudo docker _ubuntu中部署.net core程序需要使用docker吗

UnityC#接阿里云头像自动分割API_unity使用阿里云人像抠图-程序员宅基地

文章浏览阅读4.5k次。UnityC#接入阿里云api实现人像抠图_unity使用阿里云人像抠图

VS2015如何在同一个解决方案下建立多个项目_vs2015解决方案 添加项目-程序员宅基地

文章浏览阅读9k次。1.先按照常规的方法建一个项目:2.点击解决方案:右键=》添加=》新建项目_vs2015解决方案 添加项目

你真的懂peek方法嘛?_peek方法 set多个值-程序员宅基地

文章浏览阅读777次。java 8 Stream中操作类型和peek的使用1.简介java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢?Stream<String> stream = Stream.of("one", "two", "three","four"); stream.peek(System.out::println);上面的例子中,我们的本意是打印出Stream的值,但实际上没有任何输出。2.中间操作和终止操作?一个java 8的s._peek方法 set多个值