applicationContext.xmljava
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" > <!-- 数据源 数据库链接池 建立 entityManagerFactory这件事 叫spring去作 事务 spring-data-jpa 相关配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///springdata"/> <property name="user" value="root"/> <property name="password" value="root"/> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <!--告诉框架 实体类所在包--> <property name="packagesToScan" value="com.itcast.pojo"></property> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- Vendor 产商 提供者 实现者的意思 Adapter 适配器 --> <property name="database" value="MYSQL"/> <!--<property name="databasePlatform" value=""/>--> <!--<property name="generateDdl" value=""/> <property name="showSql" value=""/>--> </bean> </property> <property name="jpaProperties"> <props> <prop key="hibernate.show_sql" >true</prop> <prop key="hibernate.format_sql" >true</prop> <prop key="hibernate.hbm2ddl.auto" >update</prop> </props> </property> </bean> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven></tx:annotation-driven> <bean id="xx" class="com.itcast.demo.MyBean"></bean> <!--dao--> <jpa:repositories base-package="com.itcast.dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" ></jpa:repositories> </beans>
dao接口mysql
package com.itcast.dao; import com.itcast.pojo.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; public interface UserDao extends JpaRepository<User,Integer>,JpaSpecificationExecutor<User> { }
实现spring
package com.itheima; import static org.junit.Assert.assertTrue; import com.itheima.dao.UserDao; import com.itheima.domain.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:beans.xml") public class AppTest { @Autowired private UserDao userDao; @Test @Transactional public void testSave() { User user = new User("小明", "111", 18); userDao.save(user); } @Test @Transactional @Rollback(false) public void testUpdate() { User user = new User("小明的爸爸", "111123", 28); user.setId(1); userDao.save(user); } @Test @Transactional public void testFindOne1() { //Optional 是jdk1.8 之后 额外增长的一个类 //增长这个类目的是为了防止空指针的 //jdk设计人员想 强制你考虑空指针问题 Optional<User> optional = userDao.findById(1); /*if (optional.isPresent()){ User user = optional.get(); //可是官方说 这么用 落入下风 鼓励这个 }*/ //鼓励 orElse 传入参数备选项 User user = optional.orElse(new User()); System.out.println(user); } //懒加载 @Test @Transactional public void testFindOne2() { User user = userDao.getOne(1); System.out.println(user.getUsername()); } @Test @Transactional @Rollback(false) public void testRemove() { User user = userDao.findById(1).get(); userDao.delete(user); } @Test @Transactional @Rollback(false) public void testFindByUsername() { User user = userDao.findByUsername("xiaohei"); System.out.println(user); } @Test @Transactional @Rollback(false) public void testFindByUsernameAndPassword() { User user = userDao.findByUsernameAndPassword("xiaolv","11"); System.out.println(user); } @Test @Transactional @Rollback(false) public void testFindByAgeAndPassword() { User user = userDao.findByAgeAndPassword(11,"123"); System.out.println(user); } @Test @Transactional @Rollback(false) public void testDeleteByUsername() { userDao.deleteByUsername("xiaolv"); } @Test @Transactional @Rollback(false) public void testDeleteByUsername2() { userDao.deleteByUsername("xiaohu"); } }
注解:
@Entity//这是个实体类
@Id主键
@Column
@Transactional事物
@Rollback(false)回滚关闭sql
Bean工厂:数据库
注入的
UserDao接口继承JpaRepository<User,Integer>
JpaSpecificationExecutor<User>
在xml中配置了包扫描()
FactoryBean 建立工厂的bean
工厂建立好以后会直接调用afterPropertiesSet方法实现实例化~app
repository就是Dao!框架
ProxyFactory动态代理工厂
动态代理生成对象后走invokedom
UserDao中加入
@query("")语句
"from User where username=?1"spa
"from User where username=?1andpassword=?2"hibernate
"from User where username=:a"
java被编译后 参数名会消失 因此:
@Param("a") 声明占位符 JVM不能改
"delete from User where username=?1"
@Modifying请支持删除操做
原生"delete from user where username=? ,后面加声明nativeQuery = true"
特殊的物种:
find By Username
以查询为例 以如下名命名规则的
find|read|query|get|stream+By+属性名+[查询方式]
_>规则在PartTree/class文件中
查询方式:大于小于 模糊 等
删除
remove|delete
判断
Exist
计数
count
还有个没看清 and all
规则:关键字+By+[查询方式]+And|Or+属性名+[查询方式]......
.handeler .scanmerwww.jk1123.com/?p=124 老师的官网