SSM之MyBatis框架的学习(上学期学的过于浅薄,复习加持续学习中,持续更新中)

 

 首先创建一个Maven工程,需要做的准备工作有,连接MySql数据库,在pom.xml中导入mysql驱动包、mubatis驱动包、log4j日志驱动包,还有junit测试驱动包,这些是环境的准备工作

准备完毕环境之后,简单介绍一下页面,右侧是我们的数据库和数据表,左侧java包下的mapper包里面放置的是Mapper接口,Mapper接口对应一个resource包下的mapper.xml配置文件

其次resources包下的mybatis-config.xml是我们的核心配置文件,主要的功能是连接数据库,而mapper.xml文件的作用是执行sql语句以及CRUD操作,核心配置文件里面需要写映射文件(mapper.xml)

<configuration>

    <!--
        MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?
    -->

    <properties resource="jdbc.properties"/>
    

    <!--        设置类的别名,只要是在pojo包下的javaBean类,在resultType属性的值不用写全类名了,直接不区分大小写了-->
    <typeAliases>

        <package name="com.atguigu.mybatis.pojo"/>
    </typeAliases>
<!-- 这里要主要property里面用的${},需要写jdbc.propertites配置文件,键就是{}里面的内容,值就是url、driver等等
--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--引入mybatis的映射文件--> <!-- 以包的形式引入映射文件,需要接口和xml在同一个包下--> <mappers> <package name="com.atguigu.mybatis.mapper"/> </mappers> </configuration>

在弄好核心配置文件之后,我们需要注意mapper.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">

<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">

    <!--
        mapper接口和映射文件要保证两个一致:
        1、mapper接口的全类名和映射文件的namespace一致
        2、mapper接口中的方法的方法名要和映射文件中的sql的id保持一致
    -->


    <!--User getUserById();-->
    <!--
        resultType:设置结果类型,即查询的数据要转换为的java类型
        resultMap:自定义映射,处理多对一或一对多的映射关系
    -->
    <select id="getUserByMap" resultType="user">
        select * from t_user where id = #{id} and username =#{username}
    </select>
<!--    insertUserByUser-->
    <insert id="insertUserByUser" >
        insert into t_user values (null,#{username},#{password},#{email},#{gender})
    </insert>


</mapper>

比如UserMapper.xml这个文件,首先要和UserMapper接口在同一个包下,目的是在映射的时候,可以直接使用包,这样就不用写一个Mapper.xml就写一个Mapper标签了

其次UserMapper.xml里面必须要书写<Mapper namespace="这里是Mapper接口的全路径"/>,然后是select、insert、delete、update标签,id是标签的唯一标识,需要和接口的方法名一一对应

resultType里面是返回值类型,不管select查询一条或多条记录,resultType里面的类都不用变,因为resultType是把sql语句封装成一个实体类对象,而集合的元素正是对应的实体类对象。

 

在介绍完基本的MyBatis使用之后,接下来解释一下查询和传递参数相关的知识。

首先是传递参数,当用户在浏览器端输入完毕数据传递到服务器端的时候,我们原来是通过传参至DAO来执行sql语句,学了MyBatis之后就把参数传递给Mapper接口,然后通过Mapper代理的方式得到mapper的实现类对象,再执行相应的方法。我们需要用到${}和#{}的形式来向映射文件传递参数,#{}的形式就是用?替代,然后再赋值的形式,而${}则是采用拼接字符串的形式

存在sql注入问题,使用的时候需要加上' ' 比如 ‘ #{username} ’,其他的话,井号和美元符的使用大致相同(Mybatis 3.5之后)

当方法的形参只有一个的时候,#{}里面放什么参数都行,但是最好要规范书写。

当方法的形参有两个甚至更多的时候,MyBatis会把我们方法中的参数转化成Map集合,需要使用arg0、arg1...或者param0、param1、...来传递参数

当然我们也可以手动创建Map集合,把用户输入的值放进Map集合中,然后通过#{}或${}里面书写map的key的名字就行。

若传递的参数是一个实体类,那么和EL表达式使用差不多,直接使用字段名就可以传递参数,获取到值(实质上使用的是get方法返回的值,就算javaBean类里面不写字段名,通过get方法也能获取到返回的值,把get去掉,然后第一个字母大写变成小写就是{}里面的内容)

最后是通过注解的形式,@Param("id"),使用注解的方法很简单,只需要在Mapper接口方法的形参中逐个添加注解就行,注解里面的value的字面值就作为{}里面的值,然后就可以传递参数。

查询实体类和实体类的集合时,resultType=“实体类的全类名或者别名”

查询单条字段名的数据时,因为都是基本数据类型,所以我们可以使用全类名,比如java.lang.Interger,不过MyBatis为我们提供了基本类型和包装类的别名

在使用的时候只需要记住别名即可,比如Integer的别名有int 、integer 、INT(这些都不区分大小写),还是非常的方便的。

当查询的内容没有对应的实体类时,比如需要统计不同字段的个数,这个时候就需要用到Map集合了

当查询的Map只有一条数据的时候,ResultType=“map”,直接返回一个Map对象即可

当查询的Map记录有多条的时候,我们有两种方法可以实现。

第一种方法,resultType的值还是map,Mapper接口方法的返回值用List集合来承接,LIst<Map<String,Object>这样做有好处,当一条记录的某个字段值为null时,该字段并不会记录到Map集合中,Map集合的key就是字段的名字,这里给大家试过了。

 

第二种方法就是使用注解MapKey,具体的使用如下

@MapKey("id")

Map<string, object> getAllUserToMap(); 

Mapper接口中的方法的返回值依旧是一个Map对象,只不过使用注解后,会把多个map对象放进一个更大的map中作为值的存在

而更大的map中key的值是注解中字段名所对应表的字段的值,比如@MapKey("id"),返回的key就是形如1 2 3 4 5这样的。

 

接下来是模糊查询,首先模糊查询的语句大致为 select * from t_user where username like '%a%'  %代表任意个字符

在MyBatis中,映射文件接收接口方法形参中的参数时,如果使用#{}的方式进行传参的话,因为写法是 select * from t_user where username like '%#{}%'

因为#{}是预编译,先形成一个? 但是因为?在单引号里面,所以?被认作是单纯的一个字符表示而不是一个占位符,会报错 setString的时候形参第一个索引值为1,但是没有占位符,所以在JDBC底层就会报错,具体的解决方法有三种

第一种:使用${}字符串拼接的方式  第二种,使用tomcat带的concat函数 具体使用为concat('%',#{},'%')

第三种:使用双引号的形式,具体使用如下:select * from where username like "%"#{}"%"

 

 

当表的字段名和实体类的属性名不一致是,有三种解决办法

第一种:设置下划线命名法和驼峰命名法的对应为true;

<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>


第二种方式:在sql标签里面写上字段名的别名

第三种方式也就是使用resultMap的方式进行映射,具体使用如上图所示。

 

 

 

 

 

 

 

 

 

 

Spring初体验

首先了解了传统javaWeb开发时,当使用MVC三层架构的时候,在我们的Servlet层会调用Service,然后Service再调用DAO层,耦合度比较强。

并且是我们自己主动创建对象去调用方法,如果想Tomcat容器一样,主动帮我们创建和调用比如Httpresponse对象,和一系列的方法,让容器帮我们创建对象,我们被动的调用方法,

这样可以减少耦合度,同时也可以提高开发的效率。

 

posted @ 2023-02-18 17:32  -她的梦-  阅读(20)  评论(0编辑  收藏  举报