美文网首页
年轻人的第一个MyBatis项目就要这样来学习,不走弯路

年轻人的第一个MyBatis项目就要这样来学习,不走弯路

作者: java架构师联盟 | 来源:发表于2020-11-24 16:07 被阅读0次

    之前的时候写过一篇关于mybatis插件--mybatis plus的文章:

    我自己的博客平台发布之后,有小粉丝跟我说,现在刚开始学习Java,是不是可以不用学mybatis了直接学这个啊,听得我心里一阵后怕,总感觉自己带偏了他们的想法

    其实我个人觉得,这不仅仅是他这种初学者,也是很多人的错误想法,就是觉得新的技术就是好的,不信?看这个,这也是一个初学者,在写代码的过程中遇到这样一个问题

    原因,我直接上聊天记录吧

    怎么样,这个问题简单吗?但是也凸显了一个问题,学习,尤其是开发这一行,真的不能激进,所以我借着今天的这个引子,整理今天的这份文章--mybatis,从最一开始的mybatis入门直到整合spring,并且附代码实现,刚开始学习的朋友可以实际操作一下,老牌程序员可以回顾一下当年的青葱岁月,哈哈哈哈哈

    我们来看今天的正题吧

    MyBatis前世

    原生JDBC操作数据库的流程

    加载驱动

    获取链接 connection

    获取statement

    设置sql

    给占位符 set值

    执行sql,获取结果集

    对结果集进行解析、封装

    释放资源

    原生的jdbc操作数据库的缺点:

    频繁地进行获取链接、关闭链接,资源浪费。 数据库连接池

    sql语句属于硬编码,维护不方便。并且需求变得可能性大,要经常地修改sql

    占位符设置参数也属于硬编码,维护不方便

    结果集解析过程也是硬编码,希望是能够自动地封装成我们自己开发的pojo对象中去

    mybatis入门

    mybatis 是一个持久层框架 ORM,他可以对jdbc的操作过程进行封装,使开发者只需关注sql本身,而无需去处理 注册驱动、获取链接、获取statement、结果集解析、资源释放等工作。

    ORM :Object Ralational Mapping 对象关系映射

    简单地说,是通过描述

    对象和关系数据库之间的元数据的映射关系,将java中的对象持久化到关系数据库中。

    mybatis配置

    1、全局配置文件mybatis.xml(名字任意)

    配置mybatis的运行环境,包括连接池、事务等。

    2、配置映射文件(配置sql)mapper.xml

    3、SqlSessionFactory(会话工厂,通过配置文件获取的)

    创建SqlSession。

    4、SqlSession(会话)

    操作数据库。

    5、Executor(执行器)

    sqlSession是通过执行器来操作数据库的。

    6、mapped Statement(底层封装对象)

    对数据库的操作进行封装,包括sql、输入参数、输出结果。

    支持的输入输出参数类型

    java基本类型

    hashmap

    自定义pojo对象

    简单的Mybatis入门程序

    项目架构

    jar包

    log4j.properties

    # Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    mybatis.xml

    <?xml version="1.0" encoding="UTF-8" ?><!--mybatis的运行环境

            mybatis与Spring整合后就不需要了

        --><!-- 事务--><!--数据库连接池-->

    Users.java

    publicclassUsers {privateStringusername;privateDatebirthday;privateStringsex;privateStringaddress;publicStringgetUsername() {returnusername;    }publicvoidsetUsername(Stringusername) {this.username = username;    }publicStringgetSex() {returnsex;    }publicvoidsetSex(Stringsex) {this.sex = sex;    }publicDategetBirthday() {returnbirthday;    }publicvoidsetBirthday(Datebirthday) {this.birthday = birthday;    }publicStringgetAddress() {returnaddress;    }publicvoidsetAddress(Stringaddress) {this.address = address;    }}

    Users.mapper

    <?xml version="1.0" encoding="UTF-8" ?><!--

        namespace;命名空间

        作用:分割sql

        --><!--根据姓名查询用户信息--><!--

            id用于标识映射文件中的sql,其实是statement的id

            parameterType:参数类型

            resultType:输出结果类型,单条结果的类型

            #{}:占位符。如果为简单类型,则可以通过#{value}来取值,也可以通过#{任意名字}来取值

        -->select * from users where id=#{id}<!--${}字符串拼接,不能防止sql注入-->/*传参为‘李%’*/        select * from users where username like #{value}        /*传参为‘李’*/        /*select * from users where username like '${value}%'*/

    UsersTest.java

    package com.me.test;importcom.me.pojo.Users;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Before;importorg.junit.Test;importjava.io.IOException;importjava.io.InputStream;importjava.util.List;publicclassUsersTest{privateSqlSessionFactorysqlSessionFactory;    @Beforepublicvoidinit()throwsIOException{//获取全局配置文件InputStreamin=Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in);    }    @Testpublicvoid test()throwsIOException{//获取sqlSessionSqlSessionsqlSession=sqlSessionFactory.openSession();//执行sqlUsersuser=sqlSession.selectOne("UsersMapper.selectById",1);System.err.println(user.getUsername());        sqlSession.close();    }    @Testpublicvoid test2(){SqlSessionsqlSession=sqlSessionFactory.openSession();List usersList=sqlSession.selectList("UsersMapper.selectByUserName","李%");/*List<Users> usersList=sqlSession.selectList("UsersMapper.selectByUserName","李");*/System.err.println(usersList);/*System.out.println(usersList.get(0).getUsername());

            System.out.println(usersList.get(1).getUsername());*/}}

    mybatis对数据库的常用操作

    一、查询

    select*fromuserswhereid=#{id}        /*传参为‘李%’*/select*fromuserswhereusername like#{value}/*传参为‘李’*//*select * from users where username like '${value}%'*/

    测试方法

    @TestpublicvoidselectByUserName(){        SqlSession sqlSession=sqlSessionFactory.openSession();        List usersList=sqlSession.selectList("UsersMapper.selectByUserName","李%");/*List<Users> usersList=sqlSession.selectList("UsersMapper.selectByUserName","李");*/System.err.println(usersList);/*System.out.println(usersList.get(0).getUsername());

            System.out.println(usersList.get(1).getUsername());*/}

    二、新增

    <!--添加用户信息-->insert into users(id,username,password,address,birthday,sex) values(#{id},#{username},        # {password},#{address},#{birthday},#{sex})insert into users(id,username,password,address,birthday,sex) values(#{id},#{username},#        {password},#{address},#{birthday},#{sex})

    测试方法

    @TestpublicvoidaddUser(){        SqlSession sqlSession=sqlSessionFactory.openSession();        Users users=newUsers(4,"王五","123",newDate(),"男","北京");intres=sqlSession.insert("UsersMapper.addUser",users);        sqlSession.commit();        sqlSession.close();    }@TestpublicvoidaddUser2(){        SqlSession sqlSession=sqlSessionFactory.openSession();        Users user=newUsers(5,"王五","123",newDate(),"男","北京");intres=sqlSession.insert("UsersMapper.addUser",user);        System.err.println("res:"+res);        System.err.println("users.getId:"+user.getId());        sqlSession.commit();        sqlSession.close();    }

    三、修改

            update userssetpassword=#{password},address=#{address} where id=#{id}

    测试方法

    @TestpublicvoidupdateUser(){        SqlSession sqlSession=sqlSessionFactory.openSession();        Users user=newUsers();        user.setPassword("newPass123456");        user.setAddress("济南");        user.setId(4);intres=sqlSession.update("UsersMapper.updateUser",user);        sqlSession.commit();        sqlSession.close();    }

    四、删除

    /*这里是简单类型,# { value } 中的value可以任意写*/deletefrom users where id=#{id}   

    测试方法

    @TestpublicvoiddeleteUser(){        SqlSession sqlSession=sqlSessionFactory.openSession();intres=sqlSession.delete("UsersMapper.deleteUser",5);        System.err.println("res:"+res);        sqlSession.commit();        sqlSession.close();    }

    mybatis.xml的一些配置项

    1、加载外部资源文件

    2、起别名

    <!--

                起别名第一种方式

                type:给哪个类起别名 alias:别名

            --><!--<typeAlias type="com.me.pojo.Users" alias="user"></typeAlias>--><!--

                起别名第二种方式:批量起别名

                name:包,起的别名就是类名的全名,首字母大写、小写皆可

            -->

    3、SqlSessionFactory和SqlSession

    //获取全局配置文件InputStream in= Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in);//获取sqlSessionqlSession sqlSession=sqlSessionFactory.openSession();//执行sql

    SqlSessionFactory:它是通过全局配置文件获取的,SqlSessionFactoryBuilder创建的。一旦它被创建,就会在程序的执行期一直存在,因此只需要一个实例。也就是说希望它是单例的。

    SqlSession:作用是操作数据库,是线程不安全的。因而希望每个线程都有自己的sqlSession的实例。

    4、工具类

    package com.me.utils;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importjava.io.InputStream;publicclassMybatisUtils{privatestaticSqlSessionFactorysqlSessionFactory;static{try{//获取全局配置文件InputStreamin=Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in);        }catch(IOExceptione) {            e.printStackTrace();        }    }publicstaticSqlSessionFactorygetSqlSessionFactory(){returnsqlSessionFactory;    }}

    5、测试类

    @TestpublicvoidselectById()throwsIOException{//获取sqlSessionSqlSession sqlSession= MybatisUtils.getSqlSessionFactory().openSession();//执行sqlUsers user=sqlSession.selectOne("UsersMapper.selectById",1);        System.err.println(user.getUsername());        sqlSession.close();    }

    Spring与Mybatis整合

    mybatis:dao层,操作数据库,需要单例的SqlSessionFactory工厂。

    spring:容器,管理对象。

    可以将SqlSessionFactory、事务、连接池以及mapper的动态代理交给spring来做。

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>

            http://www.springframework.org/schema/beans/spring-beans.xsd

            http://www.springframework.org/schema/context

            http://www.springframework.org/schema/context/spring-context.xsd

            http://www.springframework.org/schema/aop

            http://www.springframework.org/schema/spring-aop.xsd"><!--加载外部资源文件--><!--数据库连接池--><!--配置SqlSessionFactory,通过Spring来管理会话工厂--><!--配置数据源:因为要使用SqlSession操作数据库--><!--加载mybatis的全局配置文件--><!--<property name="configLocation" value="classpath:mybatis.xml"></property>--><!--Spring起别名--><!--mapper动态代理 通过扫描批量加载mapper接口来创建代理bean,这些bean的名字是接口名字(首字母小写)--><!--指定mapper接口的包路径--><!--注解扫描-->

    UsersService.java

    publicinterfaceUsersService{publicUsersselectById(intid);}

    UsersServiceImpl

    @Service("userService")publicclassUsersServiceImplimplementsUsersService{@AutowiredprivateUsersMapper usersMapper;@OverridepublicUsersselectById(intid){returnusersMapper.selectById(id);    }}

    测试类

    publicclassAppTest{@TestpublicvoidselectById(){        ApplicationContext applicationContext=newClassPathXmlApplicationContext("applicationContext.xml");        UsersService usersService= (UsersService) applicationContext.getBean("userService");        Users user=usersService.selectById(1);        System.err.println(user.getUsername());    }}

    总结

    好了,不知道看完今天的内容大家感觉怎么样,有没有收获,我基本是按照从入门开始,逐步的往里面填充一些知识的顺序将mybatis进行了整理,那这个时候,我想,在实际的学习过程中你肯定还会遇到一些这样那样的问题,但是千万不要突进,脚踏实地,就从一些基础的,无聊的东西开始一点点的学习,网络上那些说这个牛,哪个好的,他肯定有一门傍身的技术作为基础,所以才能打到他说的那个层次

    最后,所有程序员都能当架构师,哈哈哈哈哈

    相关文章

      网友评论

          本文标题:年轻人的第一个MyBatis项目就要这样来学习,不走弯路

          本文链接:https://www.haomeiwen.com/subject/pmoiiktx.html