<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    SpringBoot之旅-數(shù)據(jù)訪問

    共 11001字,需瀏覽 23分鐘

     ·

    2023-08-01 10:10

    走過路過不要錯(cuò)過

    點(diǎn)擊藍(lán)字關(guān)注我們


    一、引言
    大部分系統(tǒng)都離不開數(shù)據(jù)訪問,數(shù)據(jù)庫(kù)包括SQL和NOSQL,SQL是指關(guān)系型數(shù)據(jù)庫(kù),常見的有SQL Server,Oracle,MySQL(開源),NOSQL是泛指非關(guān)系型數(shù)據(jù)庫(kù),常見的有MongoDB,Redis。
    用spring開發(fā)時(shí)我們常用的ORM框架有JDBC、Mybatis,Hibernate,現(xiàn)在最常用的應(yīng)該是Mybatis。
    在Springboot中對(duì)于數(shù)據(jù)訪問層,無論是SQL還是NOSQL,都默認(rèn)采用整合Spring Data的方式進(jìn)行統(tǒng)一處理,Springboot會(huì)幫我們添加大量自動(dòng)配置,屏蔽了很多設(shè)置。并引入各種xxxTemplate,xxxRepository來簡(jiǎn)化我們對(duì)數(shù)據(jù)訪問層的操作。對(duì)我們來說只需要進(jìn)行簡(jiǎn)單的設(shè)置即可。這篇就來學(xué)習(xí)springboot整合JDBC,mybatis、JPA。
    我們需要用什么數(shù)據(jù)訪問,就引入相關(guān)的start進(jìn)行開發(fā)。
    二、JDBC
    jdbc是我們最先學(xué)習(xí)的一個(gè)數(shù)據(jù)庫(kù)框架,SpringBoot也進(jìn)行了相應(yīng)整合.
    2.1、 引入依賴
    <!--JDBC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--mysql 驅(qū)動(dòng)--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

    2.2、數(shù)據(jù)源配置
    我們可以做個(gè)測(cè)試:
    @Autowiredprivate DataSource dataSource;
    @Testpublic void test() throws SQLException { System.out.println(dataSource.getClass()); Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close();}

    輸出為:com.zaxxer.hikari.HikariDataSource
    說明默認(rèn)數(shù)據(jù)源是com.zaxxer.hikari.HikariDataSource,而在springboot 2.0之前為org.apache.tomcat.jdbc.pool.DataSource。我們也可以通過改變spring.datasource.type 屬性來更改我們想自定義的數(shù)據(jù)源。數(shù)據(jù)源的相關(guān)配置都在DataSourceProperties,我們可以參考這個(gè)類進(jìn)行配置。
    2.3、DataSourceInitializer
    DataSourceInitializer這里面有兩個(gè)方法runSchemaScripts()可以運(yùn)行建表語句,runDataScripts()可以運(yùn)行插入數(shù)據(jù)的sql語句。
    默認(rèn)使用schema-.sql創(chuàng)建建表語句,用data-.sql插入數(shù)據(jù)語句,當(dāng)然我們也可以自己配置:
    spring:datasource:schema:- classpath:department.sql

    2.4、操作數(shù)據(jù)庫(kù)
    由于spingboot已經(jīng)幫我們自動(dòng)配置了,那我們可以直接使用JdbcTemplate進(jìn)行數(shù)據(jù)庫(kù)操作:
    @AutowiredJdbcTemplate jdbcTemplate;
    @Testpublic void jdbcTest(){ List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from user "); System.out.println(mapList.get(0));}

    結(jié)果:{id=1, username=王五, birthday=null, sex=2, address=null}
    三、整合Druid數(shù)據(jù)源
    上面講到我們有默認(rèn)的數(shù)據(jù)源,但一般情況我們還是會(huì)使用阿里提供的Druid數(shù)據(jù)源,因?yàn)镈ruid提供的功能更多,并且能夠監(jiān)控統(tǒng)計(jì),這個(gè)時(shí)候我們需要先引入pom依賴,然后將spring.datasource.type 修改:
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency>

    Druid的常用配置如下:
    type: com.alibaba.druid.pool.DruidDataSource#   數(shù)據(jù)源其他配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true#   配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計(jì),'wall'用于防火墻filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

    配置之后不會(huì)立刻生效,我們還需要編寫配置類:
    @Configurationpublic class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DataSource druid(){return new DruidDataSource(); }}

    再次運(yùn)行上面查詢數(shù)據(jù)源的方法,可以得到如下結(jié)果:
    注:必須引入日志依賴,否則會(huì)報(bào)錯(cuò)
    <!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

    我們?cè)诩由螪ruid的監(jiān)控配置:
    //配置Druid的監(jiān)控//1、配置一個(gè)管理后臺(tái)的Servlet@Beanpublic ServletRegistrationBean statViewServlet(){    ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");    Map<String,String> initParams = new HashMap<>();
    initParams.put("loginUsername","admin"); initParams.put("loginPassword","123456"); initParams.put("allow","");//默認(rèn)就是允許所有訪問 initParams.put("deny","192.168.15.21");
    bean.setInitParameters(initParams);return bean;}

    //2、配置一個(gè)web監(jiān)控的filter@Beanpublic FilterRegistrationBean webStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter());
    Map<String,String> initParams = new HashMap<>(); initParams.put("exclusions","*.js,*.css,/druid/*");
    bean.setInitParameters(initParams);
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;}

    這樣我們可以直接通過后臺(tái)監(jiān)控?cái)?shù)據(jù)源訪問情況。
    四、Mybatis
    第一步也是引入依賴:
    <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency>

    也導(dǎo)入Druid數(shù)據(jù)源,并加入之前學(xué)習(xí)Mybatis時(shí)用到的實(shí)體,而后就可以進(jìn)行測(cè)試,Mybatis的使用也有兩種方法,注解版和配置文件版,注解版用的很少,一般都是配置文件。
    4.1、注解版
    @Mapperpublic interface DepartmentMapper {@Select("select * from department where id=#{id}")Department getDeptById(Integer id);
    @Delete("delete from department where id=#{id}")int deleteDeptById(Integer id);
    @Options(useGeneratedKeys = true,keyProperty = "id")@Insert("insert into department(departmentName) values(#{departmentName})")int insertDept(Department department);
    @Update("update department set departmentName=#{departmentName} where id=#{id}")int updateDept(Department department);}

    測(cè)試:
    @AutowiredUserMapper userMapper;
    @AutowiredDepartmentMapper departmentMapper;
    @Testpublic void mybatisTest(){ Department deptById = departmentMapper.getDeptById(1); System.out.println(deptById);
    }

    結(jié)果:Department(id=1, departmentName=AA)
    4.2、配置文件版
    使用配置文件版方式也很簡(jiǎn)單,也是先新增一個(gè)接口:
    @Mapperpublic interface UserMapper {User queryUserById(Integer id);}

    然后新增一個(gè)全局配置文件:SqlMapConfig.xml
    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>
    </configuration>

    里面暫時(shí)什么配置都不需要,然后再引入相應(yīng)的XXXMapper.xml文件,最后在配置文件中加上掃描文件配置即可
    mybatis:  config-location: classpath:mybatis/SqlMapConfig.xml  mapper-locations: classpath:mybatis/mapper/*.xml

    UserMapper.xml內(nèi)容:
    <?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.yuanqinnan.mapper.UserMapper"><select id="queryUserById" parameterType="int" resultType="com.yuanqinnan.model.User">    SELECT * FROM `user`where id=#{id}</select>
    </mapper>

    測(cè)試:
    @Testpublic void mybatisTest(){    Department deptById = departmentMapper.getDeptById(1);    System.out.println(deptById);    User userById = userMapper.queryUserById(1);    System.out.println(userById);}

    Mybatis的配置就是這么簡(jiǎn)單,基本不需要額外配置。
    五、JPA
    JDBC和Mybatis我們之前都學(xué)習(xí)過,SpringBoot只不過是幫我們整合配置,而JPA我們之前沒有接觸過,所以還是要先解釋下,了解JPA之前我們先了解Spring Data:
    Spring Data 項(xiàng)目的目的是為了簡(jiǎn)化構(gòu)建基于Spring 框架應(yīng)用的數(shù)據(jù)訪問技術(shù),包括非關(guān)系數(shù)據(jù)庫(kù)、Map-Reduce 框架、云數(shù)據(jù)服務(wù)等等;另外也包含對(duì)關(guān)系數(shù)據(jù)庫(kù)的訪問支持。
    Spring Data 主要特點(diǎn)是:
    SpringData為我們提供使用統(tǒng)一的API來對(duì)數(shù)據(jù)訪問層進(jìn)行操作;這主要是Spring Data Commons項(xiàng)目來實(shí)現(xiàn)的。Spring Data Commons讓我們?cè)谑褂藐P(guān)系型或者非關(guān)系型數(shù)據(jù)訪問技術(shù)時(shí)都基于Spring提供的統(tǒng)一標(biāo)準(zhǔn),標(biāo)準(zhǔn)包含了CRUD(創(chuàng)建、獲取、更新、刪除)、查詢、排序和分頁的相關(guān)操作。
    SpringData幫我們封裝了數(shù)據(jù)庫(kù)操作,我們只需要進(jìn)程接口,就可以進(jìn)行操作,SpringData有如下統(tǒng)一的接口
    Repository :統(tǒng)一接口 RevisionRepository<t, id="" extends="" serializable,="" n="" number="" &="" comparable >:基于樂觀鎖機(jī)制 CrudRepository :基本CRUD操作 PagingAndSortingRepository :基本CRUD及分頁
    我們要使用JPA,就是繼承JpaRepository,我們只要按照它的命名規(guī)范去對(duì)命名接口,便可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作功能,這樣說有些抽象,還是用一個(gè)例子來說明:
    第一步:引入依賴
    <!-- springdata jpa依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

    第二步:編寫表對(duì)應(yīng)實(shí)體:
    //使用JPA注解配置映射關(guān)系@Entity //告訴JPA這是一個(gè)實(shí)體類(和數(shù)據(jù)表映射的類)@Table(name = "order") //@Table來指定和哪個(gè)數(shù)據(jù)表對(duì)應(yīng);order;@Datapublic class Order {
    @Id //這是一個(gè)主鍵@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主鍵private Integer id;
    @Column(name = "user_Id")private Integer userId;//這是和數(shù)據(jù)表對(duì)應(yīng)的一個(gè)列@Column(name="number",length = 32)private String number;// 訂單創(chuàng)建時(shí)間,省略默認(rèn)列名就是屬性名private Date createtime;// 備注private String note;}

    第三步:編寫倉(cāng)庫(kù)接口:
    @Repositorypublic interface OrderRepository extends JpaRepository<Order, Integer> {}

    這個(gè)時(shí)候OrderRepository 已經(jīng)有了很多實(shí)現(xiàn)好的方法,我們只要跟著調(diào)用即可
    測(cè)試:
    @AutowiredOrderRepository orderRepository;
    @Testpublic void jpaTest(){ List<Order> all = orderRepository.findAll(); System.out.println(all);
    }

    一個(gè)簡(jiǎn)單的JPA實(shí)現(xiàn)完成,當(dāng)然JPA的內(nèi)容很多,這里只是一個(gè)非常簡(jiǎn)單的例子,要進(jìn)一步的學(xué)習(xí)的話還是要去看官方文檔。

    想進(jìn)大廠的小伙伴請(qǐng)注意,

    大廠面試的套路很神奇,

    早做準(zhǔn)備對(duì)大家更有好處,

    埋頭刷題效率低,

    看面經(jīng)會(huì)更有效率!

    小編準(zhǔn)備了一份大廠常問面經(jīng)匯總集

    剩下的就不會(huì)給大家一展出來了,以上資料按照一下操作即可獲得

    ——將文章進(jìn)行轉(zhuǎn)發(fā)評(píng)論,關(guān)注公眾號(hào)【Java烤豬皮】,關(guān)注后繼續(xù)后臺(tái)回復(fù)領(lǐng)取口令“ 666 ”即可免費(fèi)領(lǐng)文章取中所提供的資料。




    往期精品推薦



    騰訊、阿里、滴滴后臺(tái)試題匯集總結(jié) — (含答案)

    面試:史上最全多線程序面試題!

    最新阿里內(nèi)推Java后端試題

    JVM難學(xué)?那是因?yàn)槟銢]有真正看完整這篇文章


    結(jié)束


    關(guān)注作者微信公眾號(hào) — 《JAVA烤豬皮》


    了解了更多java后端架構(gòu)知識(shí)以及最新面試寶典



    看完本文記得給作者點(diǎn)贊+在看哦~~~大家的支持,是作者來源不斷出文的動(dòng)力~

    瀏覽 57
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    A∨在线免费观看 | 久久精品无码一区二区小草千夏 | 日本特黄三级片 | 夜夜爽妓女8888视频免费观看 | 女人十八岁毛片 |