• 12、Mybatis框架-1


    JDBC执行数据库操作的步骤

    JDBC连接数据库的七个步骤:

    1、加载驱动:

    成功加载后,会将Driver类的实例注册到DriverManager类中

    Class.forName("com.mysql.jdbc.Driver") ; 
    
    • 1

    2、创建数据库连接:

    要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

    使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

    //test指的是数据库的名称
    String url = "jdbc:mysql://localhost:3306/test" ;  
    //用户名
    String username = "root" ;   
    //密码
    String password = "123456" ;   
    try{   
    	Connection con = DriverManager.getConnection(url , username , password ) ;   
    }catch(SQLException e){   
    	System.out.println("数据库连接失败!");   
    	e.printStackTrace() ;   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、编写sql语句:

    String sql = "select * from dept where id=? and name=?";
    
    • 1

    4、获得执行者对象:

    try {
        PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
        pstmt.setString(1,id);
        pstmt.setString(2,name);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、执行sql语句:

    //执行查询数据库的SQL语句,返回一个结果集
    ResultSet rs = pstmt.executeQuery();
    
    • 1
    • 2
    //用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句
    int i = pstmt.executeUpdate();
    
    • 1
    • 2

    6、处理结果:

    两种情况:
    1>执行更新返回的是本次操作影响到的记录数。
    2>执行查询返回的结果是一个ResultSet对象。

    while(rs.next()){
        String name = rs.getString("name") ;
        String pass = rs.getString(1) ; // 此方法比较高效
    }
    
    • 1
    • 2
    • 3
    • 4

    7、处理异常,关闭JDBC对象资源:

    操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:
    1>先关闭requestSet
    2>再关闭preparedStatement
    3>最后关闭连接对象connection

    JDBC的问题:

    1、每次连接都要加载驱动

    2、步骤重复

    3、处理结果集Rs,字段多的情况下很麻烦

    4、sql语句和Java代码混合在一起,可读写差,维护不便

    Mybatis:

    1、什么是mybatis

    MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目由Apache software foundation 迁移到了google code ,并且改名为MyBatis;

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架;

    MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;MyBatis使用简单的做配置和定义映射关系,将Java的POJOs ( Plain Old Java Objects )映射成数据库中的记录。

    2、MyBatis与JDBC比较

    减少了62%的代码量
    最简单的持久化框架
    架构级性能增强
    SQL代码从程序代码中彻底分离,可重用
    增强了项目中的分工
    增强了移植性

    3、到maven仓库中查找mybatis依赖

    在这里插入图片描述

    在这里插入图片描述

    
    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>3.4.6version>
    dependency>
    
    
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>5.1.48version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、配置连接池

    xml文件示例:

    <books>
    	<book id="100">
            <name>javaname>
            <price>30price>
            <autho>张三autho>
        book>
        
        <book id="101">
            <name>cname>
            <price>26price>
            <autho>张三autho>
        book>
        
        <book id="102">
            <name>pythonname>
            <price>32price>
            <autho>张三autho>
        book>
        
    books>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    1>在resources目录下创建mybatis-config.xml
    2>复制官网的web.xml头部内容
    
    DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    //头部:定义了这个xml文件下可以使用哪些标签
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    3>配置环境
    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="enviroment01">
            <environment id="enviroment01">
                <transactionManager type="JDBC">transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/train12306-2?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                dataSource>
            environment>
        environments>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    4>获得MyBatis连接

    在使用MyBatis框架时,主要涉及以下几个API

    1)SqlSessionFactoryBuilder
    该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory 实例。

    2)SqlSessionFactory
    每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例

    3)SqlSession
    该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句

    package com.cykj;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    /**
     * mybatis管理连接的类
     */
    public class MybatisDbHelper {
        //得到连接
        public static SqlSession getSession(){
            SqlSession sqlSession = null;
    
            try {
                //1、创建一个连接工厂构建器
                SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
                //2、拿到工厂实例
                String fpath = "mybatis-config.xml";
    //            SqlSessionFactory sf = sfb.build(new FileInputStream(new File(fpath)));
                SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream(fpath));
                //3、通过工厂实例获得一个连接
                sqlSession = sf.openSession();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sqlSession;
        }
    
        public static void main(String[] args) {
            System.out.println(getSession());
        }
    }
    
    //关闭连接的方法
        public static void closeSession(SqlSession sqlSession){
            try {
                if(null!=sqlSession){
                    sqlSession.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
    • 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
    5>增删改查
    1>创建实体类
    2>dao包下创建接口和实现类
    //增加用户
        public boolean addForeUser(Foreuser foreuser);
        //删除用户
        public boolean delForeUser(long fuId);
        //修改用户密码
        public boolean updateForeUser(long fuId,String fuPwd);
        //查询所有用户列表
        public List<Foreuser> selectAllForeUser();
    
        //根据用户名模糊查找,带分页
        public List<Foreuser> selectForeUserByName(String fuName,int pageNo);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    package com.cykj.dao;
    
    import com.cykj.bean.Foreuser;
    import com.cykj.dao.ForeUserDao;
    import com.cykj.tools.MybatisDbHelper;
    import org.apache.ibatis.session.RowBounds;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ForeUserDaoImpl implements ForeUserDao {
        @Override
        public boolean addForeUser(Foreuser foreuser) {
            boolean flag = false;
            try {
                //得到连接
                SqlSession sqlSession = MybatisDbHelper.getSession();
                //执行sql
                int i = sqlSession.insert("addForeUser",foreuser);
                //提交
                sqlSession.commit();
                if(i>0){
                    flag = true;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return flag;
        }
    
        @Override
        public boolean delForeUser(long fuId) {
            boolean flag = false;
            try {
                //得到连接
                SqlSession sqlSession = MybatisDbHelper.getSession();
                //执行sql
                int i = sqlSession.delete("delForeUser",fuId);
                //提交
                sqlSession.commit();
                if(i>0){
                    flag = true;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return flag;
        }
    
        @Override
        public boolean updateForeUser(long fuId, String fuPwd) {
            boolean flag = false;
            try {
                //得到连接
                SqlSession sqlSession = MybatisDbHelper.getSession();
                //执行sql
                Map map = new HashMap();
                map.put("fuId",fuId);
                map.put("fuPwd",fuPwd);
    
                int i = sqlSession.update("updateForeUser",map);
                //提交
                sqlSession.commit();
                if(i>0){
                    flag = true;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return flag;
        }
    
        @Override
        public List<Foreuser> selectAllForeUser() {
            List<Foreuser> foreUserList = null;
            try {
                //得到连接
                SqlSession sqlSession = MybatisDbHelper.getSession();
                //执行sql
                foreUserList = sqlSession.selectList("selectAllForeUser");
            }catch(Exception e){
                e.printStackTrace();
            }
            return foreUserList;
        }
    
        @Override
        public List<Foreuser> selectForeUserByName(String fuName, int pageNo) {
            List<Foreuser> foreUserList = null;
            try {
                //得到连接
                SqlSession sqlSession = MybatisDbHelper.getSession();
                RowBounds rb = new RowBounds(pageNo,5);
                //执行sql
                foreUserList = sqlSession.selectList("selectForeUserByName",fuName,rb);
            }catch(Exception e){
                e.printStackTrace();
            }
            return foreUserList;
        }
    }
    
    
    • 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
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    3>编写sql语句-----对应的mapper.xml

    在这里插入图片描述

    在这里插入图片描述

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="aa">
        <insert id="addForeUser" parameterType="com.cykj.bean.Foreuser">
            insert into foreUser (fuName,fuPwd,realName,cardType,cardNo,email,phone,travelType)
                values(#{fuName},#{fuPwd},#{realName},#{cardType},#{cardNo},#{email},#{phone},#{travelType});
        insert>
        
        <delete id="delForeUser" parameterType="java.lang.Long">
            delete from foreUser where fuId = #{fuId}
        delete>
    
        <update id="updateForeUser" parameterType="java.util.Map">
            update foreUser set fuPwd=#{fuPwd} where fuId=#{fuId}
        update>
    
        <select id="selectAllForeUser" resultType="com.cykj.bean.Foreuser">
            select * from foreUser
        select>
    
        <select id="selectForeUserByName" resultType="com.cykj.bean.Foreuser" parameterType="java.lang.String">
            select * from foreUser where fuName like concat("%",#{fuName},"%")
        select>
    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

    4>mybatis-config.xml中引用xml:加载sql

    <mappers>
            <mapper resource="mapper/ForeUserMapper.xml">mapper>
        mappers>
    
    • 1
    • 2
    • 3

    5、单元测试

    1>依赖:

    <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.11version>
          <scope>testscope>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、创建一个文件夹,标记为test

    3、在测试目录下新建一个Java类(注意:类名不能为Test)

    4、创建测试方法:public,void,方法前面要加上注解@Test

    ForeUserDao foreUserDao = new ForeUserDaoImpl();
    
        @Test
        public void addForeUser(){
            Foreuser foreuser = new Foreuser();
            foreuser.setFuName("cykj001");
            foreuser.setRealName("张三");
            foreuser.setCardType(1);
            foreuser.setCardNo("3522666666");
            foreuser.setEmail("110@qq.com");
            foreuser.setPhone("152....");
            foreuser.setTravelType(1);
            boolean f = foreUserDao.addForeUser(foreuser);
            System.out.println(f);
        }
    
        @Test
        public void delForeUser(){
            boolean f =  foreUserDao.delForeUser(3);
            System.out.println(f);
        }
    
        @Test
        public void updateForeUser(){
            boolean f = foreUserDao.updateForeUser(1,"666666");
            System.out.println(f);
        }
    
        @Test
        public void selectForeUserByName(){
            List list = foreUserDao.selectForeUserByName("cykj",0);
            for(Foreuser foreUser:list){
                System.out.println(foreUser);
            }
        }
    
        @Test
        public void selectAllForeUser(){
            List list = foreUserDao.selectAllForeUser();
            for(Foreuser foreUser:list){
                System.out.println(foreUser);
            }
        }
    
    • 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

    6、常见错误

    1>数据库名称写错

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvYRV0fn-1660807720606)(C:\Users\66496\AppData\Roaming\Typora\typora-user-images\image-20211021125103282.png)]

    2>驱动名称写错

    3>没有包含sql的xml文件

    。。。

  • 相关阅读:
    HTTP vs RPC:理解两种通信协议的区别
    Hadoop3教程(二十六):(生产调优篇)NameNode核心参数配置与回收站的启用
    Linux下apt与dpkg的详解
    11.外观模式
    机器学习——支持向量机(SVM)
    最新面试必问:怎么写一个又好又快的日志库
    更快更稳更安全!天翼云CDN了解一下
    图神经网络关系抽取论文阅读笔记(六)
    SpringBoot-JWT生成
    如何从单体架构迁移到微服务架构
  • 原文地址:https://blog.csdn.net/qq_37917691/article/details/126406817