当前位置: 首页 > 科技观察

说说Springboot集成Mybatis,你学会了吗?

时间:2023-03-20 23:08:32 科技观察

引入依赖官方说明:MyBatisSpring-Boot-Starter会帮你把MyBatis配合SpringBoot其实就是Mybatis看到SpringBoot这么火,开发了一个方案来凑热闹,不过这个确实解决了问题多多,用起来确实流畅多了。mybatis-spring-boot-starter主要有两种解决方案,一种是使用注解来解决所有问题,另一种是对老传统进行简化。org.mybatis.spring.bootmybatis-spring-boot-starter1.2.0mysqlmysql-connector-java5.1.39com.alibabadruid1.0.29是的注解和xml是两种开发模式,下面分别介绍两种模式。新表CREATETABLE`account`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(20)NOTNULL,`money`doubleDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=4默认字符集=utf8;插入“帐户”值(“1”、“aaa”、“1000”);插入“帐户”值(“2”、“bbb”、“1000”);插入“帐户”VALUES('3','ccc','1000');CREATETABLE`users`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键id',`userName`varchar(32)DEFAULTNULLCOMMENT'用户名',`passWord`varchar(32)DEFAULTNULLCOMMENT'密码',`user_sex`varchar(32)DEFAULTNULL,`nick_name`varchar(32)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;注解方式配置文件##数据源配置spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driver##Mybatis配置mybatis.typeAliasesPackage=org.spring.springboot.domain在启动类中添加mapper包扫描@MapperScan,或者直接在Mapper类上添加注解@Mapper。推荐使用@MapperScan进行扫描@SpringBootApplication@MapperScan("com.demo.dao")publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}MapperpublicinterfaceAccountMapper{@Insert("insertintoaccount(name,money)values(#{name},#{money})")intadd(@Param("name")Stringname,@Param("钱”)双倍钱);@Update("updateaccountsetname=#{name},money=#{money}whereid=#{id}")intupdate(@Param("name")Stringname,@Param("money")double钱,@Param(“id”)intid);@Delete("从账户中删除,id=#{id}")intdelete(intid);@Select("selectid,name,moneyfromaccountwhereid=#{id}")AccountfindAccount(@Param("id")intid);@Select("selectid,name,moneyfromaccount")ListfindAccountList();}@Select是查询类的注解,所有的查询都使用这个@Result来修改返回的结果集,以及关联的实体类属性与数据库字段一一对应。如果实体类属性和数据库属性名一致,则不需要修改该属性。@Insert用于插入数据库,直接传入实体类会自动将属性解析为对应的值@Update负责修改,或者直接传入对象@delete负责删除单元测试@RunWith(SpringRunner.class)@SpringBootTestpublicclassApplicationTest{@AutowiredAccountServiceaccountService;@Testpublicvoidtest(){账户账户=accountService.findAccount(1);System.out.println(账户);}}xml配置配置文件##数据源配置spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driver##Mybatis配置mybatis.typeAliasesPackage=com.demo.domainmybatis.mapper-locations=classpath:mapper/*.xml配置mapperpublicinterfaceUserMapper{ListgetAll();用户getOne(长id);无效插入(用户用户);无效更新(用户用户);voiddelete(Longid);id,userName,passWord,user_sex,nick_nameSELECTFROMusersSELECT来自用户WHEREid=#{id}<insertid="insert"parameterType="com.demo.domain.User">插入用户(userName,passWord,user_sex)VALUES(#{userName},#{passWord},#{userSex})更新用户SETuserName=#{userName},passWord=#{passWord},nick_name=#{nickName}WHEREid=#{id}DELETEFROMusersWHEREid=#{id}与使用注解的主要区别在于sql被拆分到了xml文件Mybatis#和$的区别1.#是占位符,$是一个拼接字符。#是占位符,$是拼接符。(1)当使用#parameterName方法引用参数时,Mybatis会把传入的参数当成一个字符串,并自动加上双引号。(2)在使用$parameterName引用参数时,不做任何处理,直接将值拼接到sql语句中。2、使用#可以防止sql注入,但是$不能避免注入攻击。#引用参数的方式,mybatis会先对sql语句进行预编译,然后对值进行引用,可以有效防止sql注入,提高安全性。$方式引用参数,sql语句不预编译。多数据源配置配置文件mybatis.type-aliases-package=com.demo.modelspring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truespring.datasource.test1.username=rootspring.datasource.test1.password=123456spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driversspring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truespring.datasource.test2.username=rootspring.datasource.test2.password=123456spring.datasource.test2.driver-class-name=com.mysql。cj.jdbc.Driver配置数据源//扫描不同的包,使用不同的数据源@Configuration@MapperScan(basePackages="com.demo.mapper.test1",sqlSessionTemplateRef="test1SqlSessionTemplate")publicclassDataSource1Config{@Bean(name="test1DataSource")@ConfigurationProperties(prefix="spring.datasource.test1")@PrimarypublicDataSourcetestDataSource(){返回DataSourceBuilder.create().build();}@Bean(name="test1SqlSessionFactory")@PrimarypublicSqlSessionFactorytestSqlSessionFactory(@Qualifier("test1DataSource")DataSourcedataSource)throwsException{SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();bean.setDataSource(dataSource);返回bean.getObject();}@Bean(name="test1TransactionManager")@PrimarypublicDataSourceTransactionManagertestTransactionManager(@Qualifier("test1DataSource")DataSourcedataSource){returnnewDataSourceTransactionManager(dataSource);@Bean(name="test1SqlSessionTemplate")@PrimarypublicSqlSessionTemplatetestSqlSessionTemplate(@Qualifier("test1SqlSessionFactory")SqlSessionFactorysqlSessionFactory)throwsException{返回新的SqlSessionTemplate(sqlSessionFactory);}}