spring-boot-blog项目代码解读

public class CoreApplication extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }

若打包成war包,则需要继承 SpringBootServletInitializer 并重写configure()方法:打包成war的话,如果打包之后的文件中没有web.xml文件的话它可以自己加进去一个最简单的web.xml(只有根节点的定义,而没有子元素),防止因缺乏web.xml文件而部署失败

@SpringBootApplication
@EnableTransactionManagement
public class CoreApplication extends SpringBootServletInitializer
{
    @Bean(initMethod = "init", destroyMethod = "close")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/*Mapper.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

@EnableTransactionManagement // 启动注解事务管理,等同于xml配置方式的 <tx:annotation-driven />,启动类中添加如下方法,(Debug测试—),就能知道自动注入的是 PlatformTransactionManager(平台事务管理) 接口的哪个实现类。通过添加@Bean,我们可以人为的指定使用哪个事务管理器,

在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

还可通过@Bean(name = "txManager1"),@Bean(name = "txManager2")进行多事务的处理。

@MapperScan

使用@MapperScan可以指定要扫描的Mapper类的包的路径。

插曲:

springboot的启动类可以理解为spring容器的初始化,它与xml配置形式启动类似,配置好事务,配置好bean,配置好数据库等等。

 

public class ContentVo implements Serializable {}

实体类实现序列化接口。Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。一个类只有实现了Serializable接口,它的对象才是可序列化的

什么情况下需要序列化:

        1.     当你想把的内存中的对象写入到硬盘的时候。(即对象的持久化操作的时候)

        2.     当你想用套接字在网络上传送对象的时候。

在进行Java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口。最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,这样做为的是将数据变为二进制来传输,所以可以在网络上传输。

            3.     当你想通过RMI(远程调用接口)传输对象的时候。

通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。(对象在计算机之间的传递调用)。

  /**
     * 内容生成时的GMT unix时间戳
     */
    private Integer created;

    /**
     * 内容更改时的GMT unix时间戳
     */
    private Integer modified;

UTC: Universal Time Coordinated 协调世界时,又称世界标准时间。

GMT: Greenwich Mean Time 格林尼治平均时。

 

精确记录时间的,在数据库中的存放类型为:int(长度为10)

  /**
     * 是否允许ping
     */
    private Boolean allowPing;

是否允许连接(在linux中表示网络是否连接)

 private static final long serialVersionUID = 1L;

定义一个序列号,进行对象的序列化操作的

什么是序列化:

• 把Java对象转换为字节序列的过程称为对象的序列化。

• 把字节序列恢复为Java对象的过程称为对象的反序列化。

通俗的讲,就是保存当前对象的所有状态,特征,以便进行后续的状态还原操作。(通过序列化,对对象进行转码存储,即对象存档),举个例子

public class Tank implements Serializable {
    private static final long serialVersionUID = 123456789L;
    public int positionX;
    public int positionY;

    public Tank() {
        Random rand = new Random();
        this.positionX = rand.nextInt(1024);
        this.positionY = rand.nextInt(768);
    }
--------------------- 
序列化操作

public class GameSave {

    public static void main(String[] args) throws IOException {
        Tank tank = new Tank();
        FileOutputStream fos = new FileOutputStream("Tank.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(tank);


-----------------------------------
反序列化操作:

 FileInputStream fis = new FileInputStream("Tank.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Tank tank = (Tank) ois.readObject();

--------------------- 

序列化结果:

反序列化结果:

 

//实体类:
public class UserVo implements Serializable {
    /**
     * user表主键
     */
    private Integer uid;

    /**
     * 用户名称
     */
    private String username;

实体类的拓展类:

public class UserVoExample {
    protected String orderByClause;

    protected boolean distinct;

    protected List<Criteria> oredCriteria;

    private Integer limit;

    private Integer offset;

    public UserVoExample() {
        oredCriteria = new ArrayList<Criteria>();
    }

    public void setOrderByClause(String orderByClause) {
        this.orderByClause = orderByClause;
    }

实体类的example类解释:

//Example类的成员:

//升序还是降序:字段+空格+asc(desc)
protected String orderByClause;
//去除重复:true是选择不重复记录,false,反之
protected boolean distinct;
//自定义查询条件
protected List<Criteria> oredCriteria;
需求:根据用户名查询查询user
sql:select id, username, birthday, sex, address from user WHERE ( username = ‘张三’ ) order by username asc

@Test
public void testFindUserByName(){

//通过criteria构造查询条件
UserExample userExample = new UserExample();
userExample.setOrderByClause("username asc"); //asc升序,desc降序排列
userExample.setDistinct(false); //去除重复,true是选择不重复记录,false反之
UserExample.Criteria criteria = userExample.createCriteria(); //构造自定义查询条件
criteria.andUsernameEqualTo("张三");

//自定义查询条件可能返回多条记录,使用List接收
List<User> users = userMapper.selectByExample(userExample);

System.out.println(users);
Criteria criteria = createCriteriaInternal();

Criteria(标准)是一种比hql面向对象的查询方式.Criteria可使用Criterion和Projection设置查询条件。可以设置FetchMode(联合查询抓取的模式),设置排序方式,Criteria还可以设置FlushModel(冲刷会话的方式)和LockMode

它可以限制查询出来的结果集的内容。

 

posted @ 2018-10-27 14:41  goodshred  阅读(282)  评论(0编辑  收藏  举报