Mybatis

Mybatis 快速入门程序

1.准备工作(创建springboot项目,实体类User,数据库表User)

2.引入Mybatis的相关依赖,配置Mybatis(数据库连接信息如下)

#驱动类名称

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连接的url

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

#连接数据库的用户名

spring.datasource.username=root

#连接数据库的密码

spring.datasource.password=

3. 编写sql语句 (注解/xml)

@Mapper

//在运行时,会自动生成该接口的实现类对象(代理对象),并且会将该对象交给ioc容器管理

public interface UserMapper{

        //这是一个接口 然后执行SQL语句

        @Select("select * from user")

        public List<User> list();

}

4.单元测试 (查询所有用户信息)

@SpringBootTest

class SpringbootMybatisQuickstart1ApplicationTests{

        @Autowired

        //进行依赖注入

        private UserMapper userMapper; 

        

        @Test

        public void test1(){

                List<User> userList = userMapper.list();

                //利用stream流的方式进行遍历输出

                userList.stream().forEache(user->{

                        System.out.println(user);

                 });

        }

}

jdbc是sum公司提供的一套操作关系型数据库的api(规范)(接口) ,需要各个厂商自己提供实现(驱动)(jar包),真正实现的代码是驱动里的实现类。

数据库连接池

切换Druid数据库连接池,添加配置文件到pom.xml即可

<dependency>

        <groupId>com.alibaba</groupId>

         <artifactId>druid-spring-boot-starter</artifactId>

         <version>1.2.8</version>

</dependency>

Lombok

一个实用的Java类库,通过注解的形式自动生成构造器,并可以自动化生成日志变量,简化Java开发、提高效率。

Lombok会在编译时,自动生成对应的Java代码。可以在package下找到自编译的代码。

基于注释 使用SQL语句进行增删改查

根据主键删除

sql语句:

delete from emp where id = 17;

接口方法:

这里使用到了mybatis中的参数占位符 #{ },其中参数就是传进去的参数。

注意:如果mapper接口方法形参只有一个普通类型的参数, #{ ...}里面的属性名可以随便写,如:#{id}、#{abc}..,因为这个接口传入的参数只有一个参数,只能给这一个占位符,但是建议是名称保持一致。

@Delete("delete from emp where id = #{id}")

public void delete(Inter id);

预编译 

性能更高;更安全(防止sql注入)

SQL注入:通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

譬如:

预编译会将输入作为一整个字符串从而预防SQL注入。占位符会先用?代替。

一般使用#占位符。

新增

接口方法

@insert("insert into emp (username,name,gender,image,job,entrydata,dept_id,create_time,update_time)"+"values(#{username},#{name},#{gender},#{image},#{jod},#{entrydate},#{depId},#{createTime},#{updateTime})")

public void insert(Emp emp);

注意:        属性名都是驼峰命名的,注意表格中为下划线的需要做出更改,不要写成字段型;

                  当需要传入的参数过多时候,可以封装成一个参数,然后再从中获取,例子中恰好有Emp这样一个实体类。

新增(主键返回)

在数据添加成功后,需要获取插入数据库数据的主键 。

如:添加套餐数据时,还需要维护套餐菜品关系表数据。

实现就是在上述新增代码前加上一行代码

@Options(keyProperty = "id ", userGeneratedKeys=true) //会自动将生成的主键值,赋值给emp对象的id属性

更新

和新增一样,先确定需要填写的SQL语句,然后编写接口方法,合理使用实体对象,在测试类里创建测试方法,在其中构造更新过的员工对象,执行更新员工信息操作(一开始自动注入生成了empmapper即bean实现类对象,直接调用update方法即可)

根据ID查询员工

在Mapper接口中添加方法

// 根据ID查询员工

        //查询是有返回值的

@Select("select *from emp where id = #{id} ")

public Emp getById(Interger id);

在测试类中定义test方法

@Test

 public void testGetById(){

        Emp emp= empMapper.getById(20);

        // 使用empMapper的getById方法,然后得到其Emp类型的返回值

        System.out.println(emp);

}

 数据封装

实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。

如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

这里由于字段名具有下划线,而实际变量名使用驼峰命名,两者不一致,不能实现自动封装,故有以下的解决方案。

方案一和方案二过于臃肿,一般不使用。

方案三:在application.properties 配置文件中添加配置

查询(条件查询)

由于like模糊匹配,需要在name这个字段前后加上百分号,所以这一块是一个字符串,但是在字符串中是不可以有#{ }的,所以改为${ },$是字符串拼接符号,生成的不是预编译的sql。

为了解决不安全的问题,使用concat 字符串拼接函数。

        譬如:concat ('a','b','c') 拼接得到的字符串就是abc

XML映射文件

使用mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用xml来配置映射语句。

Mybatis动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句

<if> 标签

用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

譬如以下代码:

但是有问题,如果有条件不成立,可能会多与一个and或者是where,所以使用<where>标签。

<where>标签

where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR。

<if test = "name !=null">

        name like concat('%',#{name},'%')

</if>        // 注意这里没有分号作为结束符

<set>标签

可以将所有的更新字段进行包裹,可以去除字段之后多余的逗号。

<foreach>标签

sql语句

delete from emp where id in (1,2,3);

接口方法

 // 批量删除

public void deleteByIds(List <Integer> ids);

XML映射文件

<delete id = "deleteByIds">

        delete from emp where id in

        <foreach collection = "ids" itea = "id" separator ="," open ="("  close =")" >

        #{id}

        </foreach>

</delete>

foreach 属性 

<include>标签

通过属性refid,指定包含的SQL片段

<sql>标签 

定义可重用的SQL片段

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值