SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

沙海
沙海
沙海
994
文章
2
评论
2021年4月27日03:59:55
评论
2 6547字阅读21分49秒
摘要

SpringBoot项目开发(六):Mybatis持久层框架

SpringBoot项目开发(六):Mybatis持久层框架

SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

闪耀的瞬间
2018-07-25 16:42:20
SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架
3832

SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

收藏

4

分类专栏:
spring boot
java
SpringBoot 项目开发

版权

SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

上一篇介绍了 集成数据库连接池与使用JPA 增删改查操作数据库,本篇将介绍 mybatis 的集成,内容多篇幅较长,耐心看完会有收获

1.什么是 MyBatis ?

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

2.SpringBoot整合mybatis有两种模式,分别是“全注解版” 和 “xml版”,下面图片是注解版,楼主在项目中使用xml版

  • 全注解版 :在方法上加注解,在注解中写sql,下面的截图是注解模式的运用,小项目比较方便
  • 图片中有使用 @Select( sql ) 注解的方式,@Results是返回结果集,如果实体类与字段一致则不需要手动对应,这是注解版,Sql写在java类的注解中,我感觉xml版的好用点

    SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

    注解版源码:https://download.csdn.net/download/zhuyu19911016520/10676379

3.开始整合mybatis,先说整合流程,1.添加mybatis与generator的maven依赖,2.使用generator代码生成器生成实体类与mapper.xml文件,以简化重复工作

(1)添加mybatis依赖

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.2</version>
</dependency>

<!-- mybatis generator 自动生成代码插件 -->
<plugin>
	<groupId>org.mybatis.generator</groupId>
		<artifactId>mybatis-generator-maven-plugin</artifactId>
		<version>1.3.6</version>
	    <configuration>     
	       <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
		   <overwrite>true</overwrite>
		   <verbose>true</verbose>
		</configuration>
</plugin>
1234567891011121314151617

(2)把主体结构添加好,dao、entity、mapping里面的文件由代码生成器生成 dao:放数据操作接口,会直接调用mapping下的 mapper.xml里面的sql entity:数据实体 mapping:放 mapper.xml 文件 generator:代码生成器的配置文件 SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架 (3)在generator下创建generatorConfig.xml,用来生成 entity、dao接口、mapper.xml,减少人工手动创建工作,生成器需要mysql-connector-java-5.1.25-bin.jar,下载资源,下面是generatorConfig.xml的代码,关键是要使用mysql-connector-java-5.1.25-bin.jar驱动包,设置好文件生成的位置,需要生成那些数据库表

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
    <classPathEntry  location="D:\software\database\mybatis-generator-core-1.3.2\lib\mysql-connector-java-5.1.25-bin.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3" defaultModelType="flat">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" userId="root" password="root" connectionURL="jdbc:mysql://localhost:3306/bigdata?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;maxReconnects=15000&amp;allowMultiQueries=true">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.zypcy.expend.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.zypcy.expend.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <!-- 注意:已生成的不要再生成,不然会覆盖已生成的文件 -->
        <!-- -->
        <table tableName="customers" domainObjectName="Customer" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>

    </context>
</generatorConfiguration>
123456789101112131415161718192021222324252627282930313233343536373839

要配置IDEA ,来运行 generatorConfig.xml,点击Run----Edit Configurations SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架 添加Maven配置,输入Name与Command line: mybatis-generator:generate -e SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架 这样就可以通过 generatorConfig.xml 生成你需要的实体类、dao接口、 mybatis.xml文件 选中 generator ,点击右边的箭头,开始生成 SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架 数据库有个customers表,在generatorConfig.xml中配置了这个表,会分别在dao、entity、mapping包下生成对应的文件 SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架

在启动类上添加 @MapperScan(“com.zypcy.expend.dao”) 扫描dao下的数据接口类 再创建服务接口与实现类,在服务实现类中调用dao接口,mybatis框架会自动映射到 mapping/customer.xml 中的sql 为什么能自动映射,因为 application.properties 配置了xml的地址与实体,而xml中的namespace与dao接口关联

# application.properties mybatis 配置
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.zypcy.expend.entity
123

(4)创建ICustomerService、CustomerServiceImpl

public interface ICustomerService {

    void add(Customer customer);

    void edit(Customer customer);

    void delete(int id);

    Customer getById(int id);
}
12345678910
@Service
public class CustomerServiceImpl implements ICustomerService {

    @Autowired private CustomerMapper customerMapper;

    @Override
    public void add(Customer customer) {
        customerMapper.insert(customer);
    }

    @Override
    public void edit(Customer customer) {
        customerMapper.updateByPrimaryKey(customer);
    }

    @Override
    public void delete(int id) {
        customerMapper.deleteByPrimaryKey(id);
    }

    @Override
    public Customer getById(int id) {
        return customerMapper.selectByPrimaryKey(id);
    }
}
12345678910111213141516171819202122232425

编写一个测试类,调用上面的方法:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomerTest {
    @Autowired private ICustomerService customerService;
    @Test
    public void add(){
        Customer customer = new Customer();
        customer.setAge(26);
        customer.setIsUse(true);
        customer.setName("zy");
        customerService.add(customer);
    }
    @Test
    public void edit(){
        Customer customer = new Customer();
        customer.setId(13);
        customer.setAge(27);
        customer.setIsUse(false);
        customer.setName("zy1");
        customerService.edit(customer);
    }
    @Test
    public void getById(){
        Customer customer = customerService.getById(13);
        System.out.println("customer:"+ JSON.toJSONString(customer));
    }
}
123456789101112131415161718192021222324252627

测试结果如下: SpringBoot项目开发(六):Mybatis持久层框架_zhuyu19911016520-CSDN博客_mybatis持久层框架 一次执行多条sql,mysql驱动开启批量执行sql的开关。allowMultiQueries参数,设置为true

spring.datasource.url=jdbc:mysql://localhost:3306/bigdata?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=15000&allowMultiQueries=true&useSSL=false
1

到此,mybatis的集成就完成了,感谢观看。 更多mybatis使用介绍,请参考:https://www.cnblogs.com/kenhome/p/7764398.html

4.SQL注入攻击

在编写MyBatis的映射语句时,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入,mybatis中的 # 和 $ 的区别:

  • 1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

    如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=“111”, 如果传入的值是id,则解析成的sql为where username=“id”.

  • 2、$

    s

    q

    l

    w

    h

    e

    r

    e

    u

    s

    e

    r

    n

    a

    m

    e

    =

    将传入的数据直接显示生成在sql中。 如:where username=

    sqlwhereusername={username},如果传入的值是111,那么解析成sql时的值为where username=111;

    如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;

  • 3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
  • 4、$方式一般用于传入数据库对象,例如传入表名.
  • 5、一般能用#的就别用

    使

    ,若不得不使用“

    使${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

  • 6、在MyBatis中,

    x

    x

    S

    Q

    L

    使

    { xx }这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“

    xxSQL使{xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。

下一篇:项目热部署

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: