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
它可以限制查询出来的结果集的内容。