一、单数据源
1、创建项目,pom.xml添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</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.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
在pom.xml中添加
MyBatis
、数据库驱动
和数据库连接池
3个依赖。
2、在application.properties中配置数据库连接信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=GMT%2B8&
spring.datasource.username=root
spring.datasource.password=admin
3、建数据库springboot,库中建表Book,并创建实体类Book.java
(1)数据库
(2)实体类
public class Book {
private Integer id;
private String name;
private String author;
private double price;
private Date publicationDate;
public Book() {
}
public Book(Integer id, String name, String author, double price, Date publicationDate) {
this.id=id;
this.name = name;
this.author = author;
this.price = price;
this.publicationDate = publicationDate;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public Date getPublicationDate() {
return publicationDate;
}
public void setPublicationDate(Date publicationDate) {
this.publicationDate = publicationDate;
}
}
4、创建数据库访问层 Mapper
(1)XML 配置文件形式
在 mapper 包下创建 BookMapper.java
//BookMapper.java
@Repository
@Mapper
public interface BookMapper {
Book selectBookById(Integer id);
List<Book> getAllBooks();
int addBook(Book book);
int updateBookById(Book book);
int deleteBookById(Integer id);
}
有两种方式指明该类是一个 Mapper:
①在 BookMapper.java 文件上添加注解 @Mapper
;
②在启动类或者配置类上添加注解 @MapperScan("newstar.springboot.mapper")
创建BookMapper.xml文件
<?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="newstar.springboot.mapper.BookMapper">
<select id="selectBookById" resultType="newstar.springboot.entity.Book">
select * from Book where id =#{id}
</select>
<select id="getAllBooks" resultType="newstar.springboot.entity.Book">
select * from Book
</select>
<insert id="addBook" parameterType="newstar.springboot.entity.Book">
insert into Book values (#{id},#{name},#{author},#{price},#{publicationDate})
</insert>
<update id="updateBookById" parameterType="newstar.springboot.entity.Book">
update Book set price=#{price},author=#{author} where id=#{id}
</update>
<delete id="deleteBookById" parameterType="int">
delete from Book where id=#{id}
</delete>
</mapper>
● 针对 BookMapper 接口中的每一个方法都在 BookMapper.xml 中列出了实现。
● #{}用来代替接口中的参数,实体类中的属性可以直接通过#{实体类属性名}获取。
BookMapper.xml 文件的存放位置有两种:
①
newstar.springboot.mapper 包下
:在 Maven工程中,XML 配置文件建议写在 resources 目录下,但是上文的 BookMapper.xml 文件写在 src/main/java 的包下了,在Maven 运行过程中 src/main/java 下默认只会加载 .java 源文件
,因此需要在 pom.xml 文件中设置加载 src/main/java 下的 .xml 文件。
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
②
classpath:mapper/下
:此种方式需要在application.properties配置文件下配置BookMapper.xml文件的位置。
//application.properties 配置文件下配置 BookMapper.xml 文件的位置 mybatis.mapper-locations=classpath:mapper/BookMapper.xml
(2)注解方式
在 mapper 包下创建 BookMapper.java
@Repository
@Mapper
public interface BookMapper {
@Select("select * from Book where id = #{id}")
Book selectBookById(Integer id);
@Select("select * from Book")
List<Book> getAllBooks();
@Insert("insert into Book values(#{id},#{name},#{author},#{price},#{publicationDate})")
int addBook(Book book);
@Update("update Book set name=#{name}, author=#{author} where id = #{id}")
int updateBookById(Book book);
@Delete("delete from Book where id = #{id}")
int deleteBookById(Integer id);
}
关于select查询的几点说明:
①
接口中方法的返回值类型决定了查询结果封装到哪个 JavaBean 中,相当于 resultType
。
②若实体类属性与数据库字段不一致,需要使用 @Results 注解完成映射
。
@Select("select * from Book where id = #{id}")
@Results({
//property实体类属性、column数据库字段
@Result(property = "name", column = "bookname"),
@Result(property = "author", column = "bookauthor")
})
Book selectBookById(Integer id);
③
在查询时如果只需要数据库表的部分字段,可以使用Map进行接收。
//例如只查询Book表的书名和价格字段
public interface BookMapper1 {
@Select("select name,price from Book")
List<Map<String,Object>> selectAllBooks(); //name和price分别是String和Double类型,所以Map的值类型为Object可以统一接收。
}
5、Service+Controller
(1)Service
//BookService.java
@Service
public class BookService {
@Autowired
BookMapper bookMapper;
public int addBook(Book book) {
return bookMapper.addBook(book);
}
public int updateBook(Book book) {
return bookMapper.updateBook(book);
}
public int deleteBookById(Integer id) {
return bookMapper.deleteBookById(id);
}
public Book getBookById(Integer id) {
return bookMapper.getBookById(id);
}
public List<Book> getAllBooks() {
return bookMapper.getAllBooks();
}
}
(2)Controller层
//BookController.java
@RestController
public class BookController {
@Autowired
BookService bookService;
@GetMapping("/addbook")
public void addBook() {
Book book1 = new Book();
book1.setId(1);
book1.setName("西游记");
book1.setAuthor("吴承恩");
book1.setPrice((float) 40.0);
book1.setPublicationDate(new Date());
Book book2 = new Book();
book2.setId(2);
book2.setName("三国演义");
book2.setAuthor("罗贯中");
book2.setPrice((float) 45.0);
book2.setPublicationDate(new Date());*/
bookService.addBook(book1);
bookService.addBook(book2);
Book b3 = bookService.getBookById(1);
System.out.println("getBookById>>>"+b3);
List<Book> allBooks = bookService.getAllBooks();
System.out.println("getAllBooks>>>"+allBooks);
}
}
6、启动类
@SpringBootApplication
@MapperScan("newstar.springboot.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在启动类上添加注解@MapperScan("newstar.springboot.mapper")使得mapper接口生效
7、接口访问
接口访问http://localhost:8080/{context-path}/addbook即可。
二、多数据源
1、创建项目,pom.xml添加依赖
同上
2、创建两个数据库springboot1和springboot2
分别在两个数据库中建表book1和book2
3、创建实体类
分别创建对应的实体类Book1和Book2
4、在application.properties中配置数据库连接信息
server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
#数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/springboot1?serverTimezone=GMT%2B8&
spring.datasource.one.username=root
spring.datasource.one.password=admin
#数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/springboot2?serverTimezone=GMT%2B8&
spring.datasource.two.username=root
spring.datasource.two.password=admin
5、配置数据源DataSourceConfig
@Configuration
public class DataSourceConfig {
@Bean
@Primary
//通过配置文件来创建不同的DataSource实例。
@ConfigurationProperties("spring.datasource.one")
DataSource dsOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.two")
DataSource dsTwo() {
return DruidDataSourceBuilder.create().build();
}
}
● DataSourceConfig中提供了两个数据源dsOne和dsTwo,默认方法名即实例名。
●@ConfigurationProperties注解表示使用不同前缀的配置文件来创建不同的DataSource实例
6、创建Mybatis配置
(1)对DataSource实例dsOne进行配置
@Configuration
@MapperScan(value = "newstar.springboot.mapper1",sqlSessionFactoryRef = "sqlSessionFactoryBean1")
public class MyBatisConfigOne {
@Autowired
@Qualifier("dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactoryBean1() throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dsOne);
return factoryBean.getObject();
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() throws Exception{
return new SqlSessionTemplate(sqlSessionFactoryBean1());
}
}
(2)对DataSource实例dsTwo进行配置
@Configuration
@MapperScan(value = "newstar.springboot.mapper2",sqlSessionFactoryRef = "sqlSessionFactoryBean2")
public class MyBatisConfigTwo {
@Resource(description = "dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactoryBean2() throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dsTwo);
return factoryBean.getObject();
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() throws Exception{
return new SqlSessionTemplate(sqlSessionFactoryBean2());
}
}
●
在@MapperScan注解中指定Mapper接口所在的位置,同时指定SqlSessionFactory的实例名,该位置下的Mapper将使用SQLSessionFactory实例。
● 提供SqlSessionFactory实例,同时将DataSource的实例设置给SqlSessionFactory。
● 提供SqlSessionTemplate实例。这是一个线程安全类,主要用来管理MyBatis的SQLSession操作。
7、创建数据访问层Mapper
(1)xml文件方式
分别在newstar.springboot.mapper1和newstar.springboot.mapper2包下创建两个不同的Mapper及相应的Mapper映射文件。
①newstar.springboot.mapper1包下
Mapper接口
@Repository
public interface Book1Mapper {
List<Book1> getAllBooks();
}
Mapper映射文件
<?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="newstar.springboot.mapper1.Book1Mapper">
<select id="getAllBooks" resultType="newstar.springboot.entity.Book1">
select * from book1;
</select>
</mapper>
②newstar.springboot.mapper2包下
Mapper接口
@Repository
public interface Book2Mapper {
List<Book2> getAllBooks();
}
Mapper映射文件
<?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="newstar.springboot.mapper2.Book2Mapper">
<select id="getAllBooks" resultType="newstar.springboot.entity.Book2">
select * from book2;
</select>
</mapper>
(2)注解方式
方式同上