文檔html
基礎的代碼結構:java
一個Application
做爲入口。IUserRepository
和UserRepository
做爲具體的實現。applicationContext.xml
定義spring的配置。db.properties
保存數據庫相關的信息。mysql
新建一個maven項目,編輯pom.xml
文件,以下。除了mysql的驅動,其餘是必須的。spring
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lou.spring.demo5.tx</groupId> <artifactId>lou-spring-demo5-tx</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--spring的核心--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.25.RELEASE</version> </dependency> <!--orm相關,好比jdbctemplate--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.25.RELEASE</version> </dependency> <!--mysql數據庫驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <!-- datasource 數據源 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version> </dependency> </dependencies> </project>
在resources下面添加spring的配置文件applicationContext.xmlsql
內容:數據庫
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1.無需定義repository註解,經過屬性設置的方式進行--> <bean id="userRepository1" class="com.lou.spring.demo5.tx.UserRepository"> <property name="jdbcTemplate" ref="dataSource"></property> </bean> <!-- 2.使用Component-scan的方式配合@repository註解--> <!-- <context:component-scan base-package="com.lou.spring.demo5.tx"></context:component-scan>--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.dirverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- 上面datasource用到的屬性值來自這個--> <context:property-placeholder location="db.properties"></context:property-placeholder> </beans>
在resources下面添加db.properties文件apache
jdbc.dirverClassName=com.mysql.cj.jdbc.Driver jdbc.username=root jdbc.password=123456 jdbc.url=jdbc:mysql://localhost:3306/test1?useSSL=false
添加IUserRepository和UserRepository用於數據庫的訪問。安全
IUserRepository.javaapp
package com.lou.spring.demo5.tx; public interface IUserRepository { //顯示總數 void showCount(); }
UserRepository.javamaven
package com.lou.spring.demo5.tx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; @Repository public class UserRepository implements IUserRepository { private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public void showCount() { Integer count = jdbcTemplate.queryForObject("select count(*) from account", Integer.class); System.out.println(count); } }
不使用Repository和Autowired註解方式
沒有開啓Repository和Autowired註解,因此,須要在xml中手動配置。確保set方法的後面部分和applicationContext.xml#userRepository1#property的name字段名字是同樣的。而後傳入一個DataSource參數,也就是property的ref引用
開啓Repository和Autowired註解方式
開啓了註解以後就須要定義在applicationContext.xml中定義component-scan
,而後spring本身去掃描查找須要的依賴。
新建Application.java 做爲程序入口。
package com.lou.spring.demo5.tx; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args) { ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); BasicDataSource dataSource = (BasicDataSource) classPathXmlApplicationContext.getBean("dataSource"); //用來測試數據源是否通 System.out.println(dataSource); //經過id的方式獲取 UserRepository userRepository = (UserRepository) classPathXmlApplicationContext.getBean("userRepository1"); userRepository.showCount(); //經過class的方式獲取 UserRepository userRepository1 = classPathXmlApplicationContext.getBean(UserRepository.class); userRepository1.showCount(); } }
先定義一個User對象
User.java
package com.lou.spring.demo5.tx; public class User { private Integer id; private String name; private Integer age; 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
修改一下IUserRepository,增長以下內容。
public interface IUserRepository { //總行數查詢 Integer getTotalCount(); //帶條件的總行數查詢 Integer getTotalCount(String name); //查詢一個String String getName(); //查詢一個對象 User getUser(); //查詢對象集合 List<User> getUsers(); }
具體實現:
@Repository public class UserRepository implements IUserRepository { private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate111(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public Integer getTotalCount() { Integer userCount = jdbcTemplate.queryForObject("select count(*) from user", Integer.class); return userCount; } @Override public Integer getTotalCount(String name) { Integer louCount = jdbcTemplate.queryForObject("select count(*) from user where name like ?", Integer.class, name); return louCount; } @Override public String getName() { String name = jdbcTemplate.queryForObject("select name from user where id=?", new Object[]{1}, String.class); return name; } @Override public User getUser() { User user = jdbcTemplate.queryForObject("select * from user where id = ?", new Object[]{1}, new UserMapper()); return user; } @Override public List<User> getUsers() { List<User> users = jdbcTemplate.query("select * from user", new UserMapper()); return users; } //抽取公共的RowMapper<User>,內部私有的class,放外面的話是要public,非static private static final class UserMapper implements RowMapper<User> { @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { User user = new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); return user; } } }
使用RowMapper對結果集作映射。UserMapper
是一個私有的靜態類。使用的時候須要new。
@Override public Integer insertUser(User u) { return jdbcTemplate.update("insert into user (name,age) values(?,?)", u.getName(), u.getAge()); } @Override public Integer updateUser(Integer userId, String name) { return jdbcTemplate.update("update user set name=? where id=?", name, userId); } @Override public Integer deleteUser(Integer userId) { return jdbcTemplate.update("delete from user where id = ?", userId); }
用來執行create table 或者調用存儲過程之類的sql語句。
this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))"); this.jdbcTemplate.update( "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)", Long.valueOf(unionId));
JdbcTemplate
一旦被配置以後,他的實例就是線程安全的。這一點比較重要,由於這樣你就能夠把他注入到多個DAO或者Repository中。按照前文先配置DataSource,而後在構造函數裏面實例化JdbcTemplate
。
新建項目,添加依賴,添加spring的xml配置文件,寫repo,寫application,獲取bean,運行。