springboot基礎、註解等

SpringBootjava

1springboot概念

Spring Boot是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置它默認配置了不少框架的使用方式,就像maven整合了全部的jar包,spring boot整合了全部的框架(不知道這樣比喻是否合適)。mysql

 

2SpringBoot目錄結構

1com.*.*

Application.java 建議放到跟目錄下面,主要用於作一些框架配置web

2com.*.*.domain

domain目錄主要用於實體(Entity)與數據訪問層(Repository)redis

3com.*.*. service

service 層主要是業務類代碼spring

4com.*.*. controller

Controller層 負責頁面訪問控制sql

3springBoot註解

1@GeneratedValue註解

主鍵產生策略mongodb

strategy屬性數據庫

-AUTO主鍵由程序控制, 是默認選項 ,不設置就是這個緩存

-IDENTITY 主鍵由數據庫生成, 採用數據庫自增加, Oracle不支持這種方式安全

-SEQUENCE 經過數據庫的序列產生主鍵, MYSQL 不支持

-Table 提供特定的數據庫產生主鍵, 該方式更有利於數據庫的移植

2@Transient

Entity中不映射成列的字段得加@Transient註解

3@ConditionalOnProperty

   註解可以控制某個configuration是否生效。具體操做是經過其兩個屬性name以及havingValue來實現的,其中name用來從application.properties中讀取某個屬性值,若是該值爲空,則返回false;若是值不爲空,則將該值與havingValue指定的值進行比較,若是同樣則返回true;不然返回false。若是返回值爲false,則該configuration不生效;爲true則生效。

4@ConfigurationPropertiesprefix=xxx」)

讀取配置文件中以xxx開頭的配置

5@EnableCaching

使用緩存

6@EnableScheduling

     開啓定時功能

7@Scheduled

     參數能夠接受兩種定時的設置,一種是咱們經常使用的cron="*/6 * * * * ?",一種是 fixedRate = 6000,兩種都表示每隔六秒打印一下內容。

  • @Scheduled(fixedRate = 6000) :上一次開始執行時間點以後6秒再執行
  • @Scheduled(fixedDelay = 6000) :上一次執行完畢時間點以後6秒再執行
  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒後執行,以後按fixedRate的規則每6秒執行一次

 

4log4j日誌輸出級別

log4j規定了默認的幾個級別:trace<debug<info<warn<error<fatal

5Spring Data JPA數據庫配置

1pom依賴

<dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jpa</artifactId>

    </dependency>

     <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

    </dependency>

2添加配置文件

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

spring.datasource.username=root

spring.datasource.password=123

spring.datasource.driver-class-name=com.mysql.jdbc.Driver  //driver能夠不用配置

spring.jpa.properties.hibernate.hbm2ddl.auto=update

spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

spring.jpa.show-sql=true

 

spring.redis.database=0  

spring.redis.host=localhost

spring.redis.port=6379  

spring.redis.password=  

spring.redis.pool.max-active=8  

spring.redis.pool.max-wait=-1  

spring.redis.pool.max-idle=8  

spring.redis.pool.min-idle=0  

spring.redis.timeout=0  

其實這個hibernate.hbm2ddl.auto參數的做用主要用於:自動建立|更新|驗證數據庫表結構,有四個值:

  1. create: 每次加載hibernate時都會刪除上一次的生成的表,而後根據你的model類再從新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是致使數據庫表數據丟失的一個重要緣由。
  2. create-drop :每次加載hibernate時根據model類生成表,可是sessionFactory一關閉,表就自動刪除。
  3. update:最經常使用的屬性,第一次加載hibernate時根據model類會自動創建起表的結構(前提是先創建好數據庫),之後加載hibernate時根據 model類自動更新表結構,即便表結構改變了但表中的行仍然存在不會刪除之前的行。要注意的是當部署到服務器後,表結構是不會被立刻創建起來的,是要等 應用第一次運行起來後纔會。
  4. validate :每次加載hibernate時,驗證建立數據庫表結構,只會和數據庫中的表進行比較,不會建立新表,可是會插入新值。

dialect 主要是指定生成表名的存儲引擎爲InneoDB
show-sql 是否打印出自動生產的SQL,方便調試的時候查看

    spring.jpa.hibernate.ddl-auto的屬性設置爲 create or create-drop的時候,spring boot 啓動時默認會掃描classpath下面(項目中通常是resources目錄)是否有import.sql,若是有機會執行import.sql腳本。

spring:

    datasource:

      schema: database/data.sql

      sql-script-encoding: utf-8

    jpa:

      hibernate:

        ddl-auto: none

    schema :設置腳本的路徑

    sql-script-encoding:設置腳本的編碼

3dao

dao只要繼承JpaRepository類就能夠,幾乎能夠不用寫方法,還有一個特別的功能很是贊,就是能夠根據方法名來自動的生產SQL,好比findByUserName 會自動生產一個以 userName 爲參數的查詢方法,好比 findAlll 自動會查詢表裏面的全部數據,好比自動分頁等等。

public interface UserRepository extends  JpaRepository<User, Long> {

    User findByUserName(String userName);

User findByUserNameOrEmail(String username, String email);

}

4、測試

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserRepositoryTests {

@Autowired

private UserRepository userRepository;

@Test

public void test() throws Exception {

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        

String fdate = dateFormat.format(date);

userRepository.save(new User("aa","aa123456", "aa@126.com", "aa1",fdate));

userRepository.save(new User("bb","bb123456", "bb@126.com", "bb1",fdate));

userRepository.save(new User("cc","cc123456", "cc@126.com", "cc1",fdate));

System.out.println(userRepository.findAll().size());

System.out.println(userRepository.findByUnameOrEmail("bb", "bb@126.com").getNickName());

userRepository.delete(userRepository.findByUname("aa"));

}

}

Assert類中的方法調用的時候報錯,不是程序的問題,而是斷言與預期結果不符

5、開啓緩存配置類

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

@Bean

public KeyGenerator keyGenerator() {

return new KeyGenerator() {

@Override

public Object generate(Object target, Method method, Object... params) {

StringBuilder sb = new StringBuilder();

sb.append(target.getClass().getName());

sb.append(method.getName());

for (Object obj : params) {

sb.append(obj.toString());

}

return sb.toString();

}

};

}

@SuppressWarnings("rawtypes")

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate) {

RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

// 設置緩存過時時間

rcm.setDefaultExpiration(60*60*24);//

return rcm;

}

@SuppressWarnings({ "rawtypes", "unchecked" })

@Bean

public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

StringRedisTemplate template = new StringRedisTemplate(factory);

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

template.setValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

}

 

6、開啓自動緩存

@RequestMapping("/getUser")

@Cacheable(value="user")

public User getUser() {

    User user=urepo.findByUname("bb");

    return user;

}

其中value的值就是緩存到redis中的key

7redissession共享

1、引入依賴

<dependency>

    <groupId>org.springframework.session</groupId>

    <artifactId>spring-session-data-redis</artifactId>

</dependency>

2Session配置:

@Configuration

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)

public class SessionConfig {

}

maxInactiveIntervalInSeconds: 設置Session失效時間,使用Redis Session以後,原Bootserver.session.timeout屬性再也不生效

3、測試

@RequestMapping("/uid")

    String uid(HttpSession session) {

        UUID uid = (UUID) session.getAttribute("uid");

        if (uid == null) {

            uid = UUID.randomUUID();

        }

        session.setAttribute("uid", uid);

        return session.getId();

    }

4如何在兩臺或者多臺中共享session

其實就是按照上面的步驟在另外一個項目中再次配置一次,啓動後自動就進行了session共享。

8、多數據源配置

1properties文件配置

spring.datasource.primary.url=jdbc:mysql://localhost:3306/temp

spring.datasource.primary.username=root

spring.datasource.primary.password=123

 

spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test

spring.datasource.secondary.username=root

spring.datasource.secondary.password=123

 

spring.jpa.properties.hibernate.hbm2ddl.auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

spring.jpa.show-sql=true

2、數據源配置

@Configuration

public class DataSourceConfig {

@Bean(name = "primaryDataSource")

@Qualifier("primaryDataSource")

@Primary

@ConfigurationProperties(prefix = "spring.datasource.primary")

public DataSource primaryDataSource() {

return DataSourceBuilder.create().build();

}

@Bean(name = "secondaryDataSource")

@Qualifier("secondaryDataSource")

@ConfigurationProperties(prefix = "spring.datasource.secondary")

public DataSource secondaryDataSource() {

return DataSourceBuilder.create().build();

}

}

3、添加數據源的spring data jpa支持

主數據源:

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",       transactionManagerRef="transactionManagerPrimary",

        basePackages= { "com.sl.u" }) //設置Repository所在位置

public class PrimaryConfig {

    @Autowired 

    @Qualifier("primaryDataSource")

    private DataSource primaryDataSource;

    @Primary

    @Bean(name = "entityManagerPrimary")

    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {

        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();

    }

    @Primary

    @Bean(name = "entityManagerFactoryPrimary")

    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {

        return builder

                .dataSource(primaryDataSource)

                .properties(getVendorProperties(primaryDataSource))

                .packages("com.sl.u") //設置實體類所在位置

                .persistenceUnit("primaryPersistenceUnit")

                .build();

    }

    @Autowired

    private JpaProperties jpaProperties;

    private Map<String, String> getVendorProperties(DataSource dataSource) {

        return jpaProperties.getHibernateProperties(dataSource);

    }

    @Primary

    @Bean(name = "transactionManagerPrimary")

    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {

        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());

    }

}

其它數據源:

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",      transactionManagerRef="transactionManagerSecondary",

        basePackages= { "com.sl.b" }) //設置Repository所在位置

public class SecondaryConfig {

    @Autowired @Qualifier("secondaryDataSource")

    private DataSource secondaryDataSource;

    @Bean(name = "entityManagerSecondary")

    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {

        return entityManagerFactorySecondary(builder).getObject().createEntityManager();

    }

    @Bean(name = "entityManagerFactorySecondary")

    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {

        return builder

                .dataSource(secondaryDataSource)

                .properties(getVendorProperties(secondaryDataSource))

                .packages("com.sl.b") //設置實體類所在位置

                .persistenceUnit("secondaryPersistenceUnit")

                .build();

    }

    @Autowired

    private JpaProperties jpaProperties;

    private Map<String, String> getVendorProperties(DataSource dataSource) {

        return jpaProperties.getHibernateProperties(dataSource);

    }

    @Bean(name = "transactionManagerSecondary")

    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {

        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());

    }

}

9異構數據庫多源支持

  • 項目中,即須要對mysql的支持,也須要對mongodb的查詢等。

實體類聲明@Entity 關係型數據庫支持類型、聲明@Document mongodb支持類型,不一樣的數據源使用不一樣的實體就能夠了

  • 若是User用戶既使用mysql也使用mongodb呢,也能夠作混合使用
  • 也能夠經過對不一樣的包路徑進行聲明,好比A包路徑下使用mysql,B包路徑下使用mongoDB

@EnableJpaRepositories(basePackages =

"com.neo.repositories.jpa")

@EnableMongoRepositories(basePackages =

"com.neo.repositories.mongo")

 public interface Configuration { }

 

 

 

6SpringBoot熱啓動實時生效

熱啓動在正常開發項目中改動項目後重啓老是報錯;但springBoot對調試支持很好,修改以後能夠實時生效,須要添加配置:

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-devtools</artifactId>

        <optional>true</optional>

   </dependency>

</dependencies>

<build>

    <plugins>

        <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

            <configuration>

                <fork>true</fork>

            </configuration>

        </plugin>

   </plugins>

</build>

7springboot整合mybatis(註解)

1pom配置

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

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

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

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

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

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

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

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

<version>1.1.1</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

<optional>true</optional>

</dependency>

</dependencies>

2、配置文件

mybatis.type-aliases-package=com.sl.entity

3mapper類掃描

  • 在啓動類上加@MapperScan("mapper類包")
  • mapper類上加@Mapper註解

4mapper

public  interface  UserMapper {

    @Select("SELECT * FROM users")

    @Results({

        @Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),

        @Result(property = "nickName", column = "nick_name")

    })

    List<UserEntity> getAll();

 

    @Select("SELECT * FROM users WHERE id = #{id}")

    @Results({

        @Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),

        @Result(property = "nickName", column = "nick_name")

    })

    UserEntity getOne(Long id);

 

    @Insert("INSERT INTO users(userName,passWord,user_sex)           VALUES(#{userName}, #{passWord}, #{userSex})")

    void insert(UserEntity user);

 

    @Update("UPDATE users SET userName=#{userName},

    nick_name=#{nickName} WHERE id =#{id}")

    void update(UserEntity user);

 

    @Delete("DELETE FROM users WHERE id =#{id}")

    void delete(Long id);

}

user_sex使用了枚舉

@Select 是查詢類的註解,全部的查詢均使用這個

@Result 修飾返回的結果集,關聯實體類屬性和數據庫字段一一對應,若是實體類屬性和數據庫屬性名保持一致,就不須要這個屬性來修飾。

@Insert 插入數據庫使用,直接傳入實體類會自動解析屬性到對應的值

@Update 負責修改,也能夠直接傳入對象

@Delete 負責刪除

8springboot整合mybatis(極簡xml)

1pom配置

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

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

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

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

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

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

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

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

<version>1.1.1</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

<optional>true</optional>

</dependency>

</dependencies>

2、配置文件

mybatis.type-aliases-package=com.sl.entity

mybatis.config-locations=classpath:mybatis/mybatis-config.xml

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

mybatis-config.xml 配置

<configuration>

    <typeAliases>

        <typeAlias alias="Integer" type="java.lang.Integer" />

        <typeAlias alias="Long" type="java.lang.Long" />

        <typeAlias alias="HashMap" type="java.util.HashMap" />

        <typeAlias  alias="LinkedHashMap"    type="java.util.LinkedHashMap" />

        <typeAlias alias="ArrayList" type="java.util.ArrayList" />

        <typeAlias alias="LinkedList" type="java.util.LinkedList" />

    </typeAliases>

</configuration>

這裏也能夠添加一些mybatis基礎的配置

3xxxMapper.xml

<mapper namespace="com.neo.mapper.UserMapper" >

    <resultMap id="BaseResultMap" type="com.neo.entity.UserEntity" >

        <id column="id" property="id" jdbcType="BIGINT" />

        <result column="userName" property="userName" jdbcType="VARCHAR" />

        <result column="passWord" property="passWord" jdbcType="VARCHAR" />

        <result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum"/>

        <result column="nick_name" property="nickName" jdbcType="VARCHAR" />

    </resultMap>

 

    <sql id="Base_Column_List" >

        id, userName, passWord, user_sex, nick_name

    </sql>

 

    <select id="getAll" resultMap="BaseResultMap"  >

       SELECT

       <include refid="Base_Column_List" />

       FROM users

    </select>

 

    <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap" >

        SELECT

       <include refid="Base_Column_List" />

       FROM users

       WHERE id = #{id}

    </select>

 

    <insert id="insert" parameterType="com.neo.entity.UserEntity" >

       INSERT INTO

            users

            (userName,passWord,user_sex)

        VALUES

            (#{userName}, #{passWord}, #{userSex})

    </insert>

 

    <update id="update" parameterType="com.neo.entity.UserEntity" >

       UPDATE

            users

       SET

        <if test="userName != null">userName = #{userName},</if>

        <if test="passWord != null">passWord = #{passWord},</if>

        nick_name = #{nickName}

       WHERE

            id = #{id}

    </update>

 

    <delete id="delete" parameterType="java.lang.Long" >

       DELETE FROM

             users

       WHERE

             id =#{id}

    </delete>

</mapper>

4mapper

public  interface  UserMapper {

    List<UserEntity> getAll();

    UserEntity getOne(Long id);

    void insert(UserEntity user);

    void update(UserEntity user);

    void delete(Long id);

}

9springboot+mybatis+多數據源

1、配置文件

mybatis.config-locations=classpath:mybatis/mybatis-config.xml

2、數據源配置

@Configuration

@MapperScan(basePackages = "com.neo.mapper.test1",

sqlSessionTemplateRef  = "test1SqlSessionTemplate")

public class DataSource1Config {

    @Bean(name = "test1DataSource")

    @ConfigurationProperties(prefix =

"spring.datasource.test1")

    @Primary

    public DataSource testDataSource() {

        return DataSourceBuilder.create().build();

    }

    @Bean(name = "test1SqlSessionFactory")

    @Primary

    public SqlSessionFactory

testSqlSessionFactory(@Qualifier("test1DataSource")

DataSource dataSource) throws Exception {

        SqlSessionFactoryBean bean = new

SqlSessionFactoryBean();

        bean.setDataSource(dataSource);

        bean.setMapperLocations(new

PathMatchingResourcePatternResolver().getResource

s("classpath:mybatis/mapper/test1/*.xml"));

        return bean.getObject();

    }

    @Bean(name = "test1TransactionManager")

    @Primary

    public DataSourceTransactionManager

testTransactionManager(@Qualifier("test1DataSource")

DataSource dataSource) {

        return new

DataSourceTransactionManager(dataSource);

    }

    @Bean(name = "test1SqlSessionTemplate")

    @Primary

    public SqlSessionTemplate

testSqlSessionTemplate(@Qualifier("test1SqlSessionFac

tory") SqlSessionFactory sqlSessionFactory) throws

Exception {

        return new SqlSessionTemplate(sqlSessionFactory);

    }

}

10springboot+shiro

1Apache Shiro

1、概念

    Apache Shiro是一個功能強大、靈活的,開源的安全框架。它能夠乾淨利落地處理身份驗證、受權、企業會話管理和加密

2、應用場景

  • 驗證用戶身份
  • 用戶訪問權限控制,好比:1、判斷用戶是否分配了必定的安全

   角色。2、判斷用戶是否被授予完成某個操做的權限

  • 在非 web EJB 容器的環境下能夠任意使用Session API
  • 能夠響應認證、訪問控制,或者 Session
  • 生命週期中發生的事件
  • 可將一個或以上用戶安全數據源數據組合成一個複合的用戶

   "view"(視圖)

  • 支持單點登陸(SSO)功能
  • 支持提供Remember Me」服務,獲取用戶關聯信息而無需登陸
相關文章
相關標籤/搜索