一、单数据源
1、配置pom.xml,增加jdbc、HikariCP连接池、MySQL驱动。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
2、DataSourceConfig.java
package com.idodo.demo.conf; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import com.zaxxer.hikari.HikariDataSource; @Configuration public class DataSourceConfig { @Bean(name = "dataSource") public DataSource datasource(Environment env) { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl(env.getProperty("spring.datasource.url")); ds.setUsername(env.getProperty("spring.datasource.username")); ds.setPassword(env.getProperty("spring.datasource.password")); ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); return ds; } }
3、application.properties
# 端口号 server.port=8080 # 数据库url spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 # 数据库用户名 spring.datasource.username=root # 数据库密码 spring.datasource.password=root # 数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4、User.java
package com.idodo.demo.entity; import java.io.Serializable; public class User implements Serializable{ private static final long serialVersionUID = 7914100053493869907L; private Integer user_id ; private String user_code ; private String user_name ; public User() { } public Integer getUser_id() { return user_id; } public void setUser_id(Integer user_id) { this.user_id = user_id; } public String getUser_code() { return user_code; } public void setUser_code(String user_code) { this.user_code = user_code; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } }
5、UserService.java
package com.idodo.demo.service; import com.idodo.demo.entity.User; public interface UserService { public User geUserById(Integer user_id); public void test(Integer user_id); }
6、UserDao.java
package com.idodo.demo.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import com.idodo.demo.entity.User; @Repository public class UserDao { @Autowired JdbcTemplate jdbcTempalte; public Integer getUserTotal(Integer user_id) { String sql = "select count(1) from app_users where user_id=?"; Integer count = jdbcTempalte.queryForObject(sql, Integer.class, user_id); return count; } public User findUserById(Integer user_id) { String sql = "select * from app_users where user_id=?"; User user = jdbcTempalte.queryForObject(sql, new UserRowMapper(), user_id); return user; } public List<User> getUserList(String user_code) { String sql = "select * from app_users where user_code=?"; List<User> list = jdbcTempalte.query(sql, new UserRowMapper(), user_code); return list; } public void update(User user) { String sql = "update app_users set user_code=?, user_name=? where user_id = ?"; jdbcTempalte.update(sql, user.getUser_code(), user.getUser_name(), user.getUser_id()); } public Integer insertUser(final User user) { final String sql = "insert into app_users (user_code, user_name) values (?, ?)"; // Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法。 // user_id 为 自增主键 KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTempalte.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement(sql, new String[] { "user_id" }); ps.setString(1, user.getUser_code()); ps.setString(2, user.getUser_name()); return ps; } }, keyHolder); // 返回新增记录对应的主键值 return keyHolder.getKey().intValue(); } // 实现RowMapper接口,返回User对象 static class UserRowMapper implements RowMapper<User> { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setUser_id(rs.getInt("user_id")); user.setUser_code(rs.getString("user_code")); user.setUser_name(rs.getString("user_name")); return user; } } }
7、UserServiceImpl.java
package com.idodo.demo.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.idodo.demo.dao.UserDao; import com.idodo.demo.entity.User; import com.idodo.demo.service.UserService; @Service public class UserServiceImpl implements UserService { @Autowired UserDao userDao; public User geUserById(Integer user_id) { User user = userDao.findUserById(user_id); return user; } public void test(Integer user_id) { System.out.println(userDao.getUserTotal(user_id)); List<User> list = userDao.getUserList("9002"); for (User u : list) { System.out.println(u.getUser_name()); } User user = new User(); user.setUser_id(1); user.setUser_code("90001"); user.setUser_name("jzhjzh"); userDao.update(user); User vo = new User(); //vo.setUser_id(1); vo.setUser_code("9009"); vo.setUser_name("jiangzhihao2018"); userDao.insertUser(vo); } }
8、UserController.java
package com.idodo.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.idodo.demo.entity.User; import com.idodo.demo.service.UserService; @Controller public class UserController { @Autowired UserService userService; // http://localhost:8080/user/1 // {"user_id":1,"user_code":"9001","user_name":"jzh"} @RequestMapping("/user/{user_id}") public @ResponseBody User getUser(@PathVariable Integer user_id) { User user = userService.geUserById(user_id); // 测试 userService.test(user_id); return user; } }
二、多数据源【2023-03-16 更新】
1、application.properties。需要注意的是url要改成jdbc-url。
# 端口号 server.port=8080 # 数据库url spring.datasource.jdbc-url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 # 数据库用户名 spring.datasource.username=root # 数据库密码 spring.datasource.password=root # 数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库url spring.datasource.iot.jdbc-url=jdbc:mysql://127.0.0.1:3306/iot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 # 数据库用户名 spring.datasource.iot.username=root # 数据库密码 spring.datasource.iot.password=root # 数据库驱动 spring.datasource.iot.driver-class-name=com.mysql.cj.jdbc.Driver
2、DataSourceConfig.java。需要注意的是要增加主数据源描述@Primary。第二个数据源、自定义JdbcTemplate。
package com.aotuo.iot.conf; import com.zaxxer.hikari.HikariDataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @Configuration public class DataSourceConfig { // 主数据源 @Bean(name = "dataSource") @Primary public DataSource datasource(Environment env) { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl(env.getProperty("spring.datasource.jdbc-url")); ds.setUsername(env.getProperty("spring.datasource.username")); ds.setPassword(env.getProperty("spring.datasource.password")); ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); return ds; } // 从数据源 @Bean(name= "iotDataSource") @ConfigurationProperties(prefix = "spring.datasource.iot") public DataSource iotDataSource() { DataSource ds = DataSourceBuilder.create().build(); return ds; } @Bean(name="jdbcTempalteIot") public JdbcTemplate jdbcTempalteIot (@Qualifier("iotDataSource") DataSource dataSource ) { return new JdbcTemplate(dataSource); } }
3、UserDao.java。增加JdbcTemplate jdbcTempalteIot 调用。
package com.aotuo.iot.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import com.aotuo.iot.entity.User; @Repository public class UserDao { @Autowired JdbcTemplate jdbcTempalte; @Autowired JdbcTemplate jdbcTempalteIot; public Integer getUserTotal(Integer user_id) { String sql = "select count(1) from app_users where user_id=?"; Integer count = jdbcTempalte.queryForObject(sql, Integer.class, user_id); return count; } public User findUserById(Integer user_id) { String sql = "select * from app_users where user_id=?"; User user = jdbcTempalte.queryForObject(sql, new UserRowMapper(), user_id); return user; } public List<User> getUserList(String user_code) { String sql = "select * from app_users where user_code=?"; List<User> list = jdbcTempalte.query(sql, new UserRowMapper(), user_code); return list; } public void update(User user) { String sql = "update app_users set user_code=?, user_name=? where user_id = ?"; jdbcTempalte.update(sql, user.getUser_code(), user.getUser_name(), user.getUser_id()); } public void update_iot(User user) { String sql = "update app_users set user_code=?, user_name=? where user_id = ?"; jdbcTempalteIot.update(sql, user.getUser_code(), user.getUser_name(), user.getUser_id()); } public Integer insertUser(final User user) { final String sql = "insert into app_users (user_code, user_name) values (?, ?)"; // Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法。 // user_id 为 自增主键 KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTempalte.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement(sql, new String[] { "user_id" }); ps.setString(1, user.getUser_code()); ps.setString(2, user.getUser_name()); return ps; } }, keyHolder); // 返回新增记录对应的主键值 return keyHolder.getKey().intValue(); } // 实现RowMapper接口,返回User对象 static class UserRowMapper implements RowMapper<User> { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setUser_id(rs.getInt("user_id")); user.setUser_code(rs.getString("user_code")); user.setUser_name(rs.getString("user_name")); return user; } } }