Maven简介及作用

本文介绍了MyBatis的基本概念,包括pom.xml的作用、Lombok插件的应用、使用MyBatis进行CRUD操作、添加SQL日志、处理列名与属性名不一致的情况,以及动态SQL中的where标签和模糊查询等。MyBatis是一款优秀的持久层框架,通过XML或注解配置,简化了JDBC操作,支持动态SQL。

目录

MyBatis的简介

pom.xml:

lombok插件:

使用mabatis完成crud

添加SQL日志

添加时返回递增的主键值

解决列名和属性名不一致。

mybatis中动态sql标签有哪些?

where标签

动态SQL

mybatis中完成模糊查询


MyBatis的简介

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

并且可以简化jdbc的操作以及占位符赋值以及查询结果集的封装。

pom.xml:

“pom:是 Project Object Model的英文缩写,是项目对象模型的意思。通过xml可扩展标记语言(EXtensible Markup Language)格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。 作用:该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。”

在pom.xml中部署驱动器,就不用再引入驱动器,在大型项目汇总可以省很多内存

像下面这样直接引用就可以了

pom.xml


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

        <!--lombok的依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <!--log4f-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

lombok插件:

Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。

可以在pom.xml中引入lombok,代码如下:

        <!--lombok的依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

还可以在实体类中添加lombok,数据仅供参考

User

@Data //set和get方法以及toString方法
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //所有参数的构造方法
public class User {
    private int userid;
    private String username;
    private String realname;
}

使用mabatis完成crud

<?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">

<!--namespace:命名空间
       前期命名空间可以随便起名,但是后期我们要求命名空间的值必须和所对应的dao相同-->

<mapper namespace="qy151.user">
    <!--查询 根据id查询用户信息
          select标签用于查询的标签
             id:标签的唯一标识
             resultType: 定义返回的类型 把sql查询的结果封装到哪个实体类钟
         #{id}===表示占位符等价于?  这是mybatis框架的语法
    -->
    <select id="findById" resultType="com.yhm.entity.User">
        select * from tb_user where userid=#{id}
    </select>

    <!--添加
         parametertype: 参数类型
            #{必须和属性对应}
    -->
    <insert id="add" parameterType="com.yhm.entity.User">
        insert into tb_user(username,realname) values(#{username},#{realname})
    </insert>

    <!--删除-->
    <delete id="delete" parameterType="int">
        delete from tb_user where userid=#{id}
    </delete>

    <!--修改-->
    <update id="update" parameterType="com.yhm.entity.User">
         update tb_user set username=#{username},realname=#{realname} where userid=#{userid}
    </update>

    <!--查询所有-->
    <select id="findAll" resultType="com.yhm.entity.User">
          select * from tb_user
    </select>

</mapper>

添加SQL日志

在pom.xml中添加日志的jar包,代码如下

 		<!--log4f-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

创建映射文件

<?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">
<!--namespace:命名空间
       必须和dao相同
-->
<mapper namespace="com.yhm.dao.UserDao">
    <select id="findAll" resultType="com.yhm.entity.User">
        select * from tb_user
    </select>
</mapper>

注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样。

为了预防出错,可以写一个测试类

 @Test
    public void testFindAll() throws Exception{
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession session=factory.openSession();
		//获取相应接口的代理对象
        UserDao userDao=session.getMapper(UserDao.class);
        List<User> list = userDao.findAll();
        System.out.println(list);
        session.commit();
        session.close();
    }

我们在dao接口中某些方法可能需要传递多个参数,譬如: 登录(username,password),我们需要在参数处使用@Param()为参数起名。

添加时返回递增的主键值

需要返回添加数据库后的id值。

 <!--添加用户
          useGeneratedKeys:设置使用生成的主键
          keyProperty: 赋值给哪个属性
    -->
    <insert id="addUser" parameterType="com.yhm.entity.User"
            useGeneratedKeys="true" keyProperty="userId">
          insert into tb_user values(null,#{username},#{realname})
    </insert>

解决列名和属性名不一致。

查询时返回一个null,或者某个列没有值,可以有两种解决办法:

第一种: 为查询的列起别名,而别名和属性名一致。

 <!--根据id查询学生信息-->
    <select id="findOne" resultType="com.yhm.entity.Student">
        select stu_id id,stu_name name,stu_age age from tb_stu where stu_id=#{id}
    </select>

第二种: 使用resultMap完成列和属性之间的映射关系。


    <resultMap id="StuMapper" type="com.yhm.entity.Student">

         <!--主键的映射关系 column:列名 property:属性名-->
         <id column="stu_id" property="id"/>

         <!--普通列的映射关系-->
         <result column="stu_name" property="name"/>
         <result column="stu_age" property="age"/>
    </resultMap>

 <!--resultType和ResultMap二者只能用一个-->
    <select id="findOne" resultMap="StuMapper">
        select * from tb_stu where stu_id=#{id}
    </select>

注意:如果列名和属性名有些一致的,可以在resultMap中不写映射关系

mybatis中动态sql标签有哪些?

1.if标签--用于单条件判断

 //如果name不为null则按照name查询 如果为null则查询所有
    public List<Account> findByCondition(@Param("name")String name,@Param("money") Double money);
    
    <select id="findByCondition" resultType="com.yhm.entity.Account">
        select * from account where 1=1
        <if test="name!=null and name!=''">
             and  name=#{name}
        </if>
        <if test="money!=null">
             and  money=#{money}
        </if>
    </select>

choose标签--用于多条件分支查询

<select id="findByCondition02" resultType="com.yhm.entity.Account">
        select * from account where 1=1
        <choose>
             <when test="name!=null and name!=''">
                 and  name=#{name}
             </when>
            <when test="money!=null">
                and  money=#{money}
            </when>
            <otherwise>
                and isdeleted=0
            </otherwise>
        </choose>
    </select>

where标签

我们观察到上面的sql都加了 where 1=1 ,如果不使用where 1=1 那么动态sql可能会出错。 我们能不能不加where 1=1呢! 可以 那么就可以使用where标签。

作用:可以自动为你添加where关键字,并且可以帮你去除第一个and或者or

 <select id="findByCondition" resultType="com.yhm.entity.Account">
        select * from account
        <where>
            <if test="name!=null and name!=''">
                 and  name=#{name}
            </if>
            <if test="money!=null">
                 and  money=#{money}
            </if>
        </where>
    </select>

动态SQL

1.set标签:

        这个配合if标签一起用,一般用在修改语句。如果传递的参数值为null,那么应该不修改该列的值。

<!--set:可以帮我们生成关键字 set 并且可以去除最后一个逗号-->
    <update id="update">
          update account
          <set>
             <if test="name!=null and name!=''">
                name=#{name},
             </if>
             <if test="money!=null">
                money=#{money},
             </if>
             <if test="isdeleted!=null">
                 isdeleted=#{isdeleted},
             </if>
             <if test="created!=null">
                  created=#{created},
             </if>
             <if test="updated!=null">
                  updated=#{updated},
             </if>
          </set>
          where id=#{id}
    </update>

2.foreach标签

循环标签

通过id查询所有

<!-- select * from account where id in(2,3,5,7,0)
        如果你使用的为数组array  如果你使用的为集合 那么就用list
        collection:类型
        item:数组中每个元素赋值的变量名
        open: 以谁开始
        close:以谁结束
        separator:分割符
    -->
    <select id="findByIds" resultType="com.yhm.entity.Account">
        select * from account where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
             #{id}
        </foreach>
    </select>

删除:

 <delete id="batchDelete">
        <foreach collection="array" item="id" open="delete from account where  id in(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

添加

SQL批量函数添加

insert into account(name,isdeleted) values('ldh',0),('ldh2',0),('ldh4',0)
    <insert id="saveBatch">
        insert into account(name,isdeleted) values
        <foreach collection="list" item="acc" separator=",">
            (#{acc.name},#{acc.isdeleted})
        </foreach>
    </insert>

mybatis中完成模糊查询

select * from 表名 where 列名 like '%a%'

(1)使用字符串函数 完成拼接 concat

<select id="findByLike" resultType="com.yhm.entity.Account">
        select * from account where name like concat('%',#{name},'%')
    </select>

(2) 使用${}

<select id="findByLike" resultType="com.yhm.entity.Account">
        select * from account where name like '%${name}%'
    </select>

通过观察: 发现使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement.

联表查询

  1. 多对一 : 从多的一方来查询一的一方。

班级表:

        例如:一个班级可以有很多学生,但是一个学生只能隶属于一个班级,不能同时在多个班级出现,这就是多对一和一对多。

学生表:

        根据学生id查询学生信息并携带班级信息。

给两个表设置链接关系

select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1

实体类:

Student:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private Integer classId;

    private Clazz clazz;//学生所属的班级
}

Class:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
    private Integer cid;
    private String cname;

}

.xml

<resultMap id="baseMap" type="com.yhm.entity.Student">
            <id column="stu_id" property="id"/>
            <result column="stu_name" property="name"/>
            <result column="stu_age" property="age"/>
            <result column="sex" property="sex"/>
            <result column="class_id" property="classId"/>
            <!--association: 表示一的一方
                 property: 它表示属性名
                 javaType: 该属性名对应的数据类型
            -->
            <association property="clazz" javaType="com.yhm.entity.Clazz">
                <id column="cid" property="cid"/>
                <result column="cname" property="cname"/>
            </association>
    </resultMap>
    <select id="findStudentById" resultMap="baseMap">
         select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}
    </select>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yu_HM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值