封装Jpa中EntityManager的增删改查到BaseDao文件中并连接数据库测试

1 篇文章 0 订阅
1 篇文章 0 订阅

1.首先在idea中创建一个springboot的项目

选择新建的目录就好了

2.在application.properties中连接好数据库。

spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=***
spring.datasource.password=***
spring.jpa.hibernate.ddl-auto=update

2.在项目中新建文件夹。moudle包中的是测试BaseDao中封装的方法。

3.接下来就是封装EntityManager成为最主要的BaseDao。

package com.systop.core.dao;

import org.hibernate.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;


@Transactional
public class BaseDao<T,ID extends Serializable> {

    //首先是注入EntityManager
    @PersistenceContext
    private EntityManager entitymanager;

    private Class<T> entityClass;

    /**
     * 构造方法
     */
    public BaseDao() {
        //通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type
        Type genType = getClass().getGenericSuperclass();
        //返回参数数组
        Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
        entityClass=(Class)params[0];
    }

    public EntityManager getEntityManager() {
        return entitymanager;
    }

    /**
     * 保存
     */
    public void executeSave(T entity){
        //调用EntityManager中的保存方法persist
        this.entitymanager.persist(entity);
        //及时的存入数据库,如果不写这句的话,不会保存到数据库中
        this.entitymanager.flush();
    }

    /**
     * 修改
     */
    public void executeUpdate(T entity){
        //调用Merge修改的方法
        this.entitymanager.merge(entity);
        this.entitymanager.flush();
    }

    /**
     * 删除
     */
    public void executeDelete(ID id){
        //根据id查询出一个对象,然后删除这个对象
        T entity = find(id);
        this.entitymanager.remove(entity);
        this.entitymanager.flush();
    }

    /**
     * 查询
     * @param id
     * @return
     */
    public T find(ID id){
         T pojo = this.entitymanager.find(entityClass,id);
        return pojo;
    }

    /**
     * 查询所有
     * @param qlString
     * @return
     */
    public List<T> findAll(String qlString){
        //这个是根据自己写的sql语句查询所有
        Query query = this.entitymanager.createQuery(qlString);
        //转化为List集合
        return query.getResultList();
    }

4.在Student文件中写实体类。注意:在封装好的BaseDao在测试的时候,实体类中必须有id这个字段,还有写注解。

package com.systop.moudle.student.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")
public class Student {

    @Id
    private Long id;
    private String name;
    private int age;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }

    public Student() {
        super();
    }

    public Student(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

5.在StudentService文件中写接口。注意:这是一个接口文件。

public interface StudentService {
//  entityManager
    void save(Student student);//保存
    void delete(Long id);//根据id删除
    void update(Student student);//修改
    Student find(Long id);//查询一条
    List<Student> findAll();//查询所有
}

6.在StudentServiceImpl中调用baseDao中的方法。注意:写注解

package com.systop.moudle.student.service.impl;

import com.systop.core.dao.BaseDao;
import com.systop.moudle.student.entity.Student;
import com.systop.moudle.student.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service("studentService")
public class StudentServiceImpl implements StudentService {

    @Autowired
    private BaseDao baseDao;//注入BaseDao

    @Override
    public void save(Student student) {
        baseDao.executeSave(student);
    }

    @Override
    public void update(Student student) {
        baseDao.executeUpdate(student);
    }

    @Override
    public void delete(Long id) {
        baseDao.executeDelete(id);
    }

    @Override
    public Student find(Long id) {
       Student student = (Student) baseDao.find(id);
        return student;
    }

    @Override
    public List<Student> findAll() {
        String jql = "from Student";
        List<Student> studentsList =  baseDao.findAll(jql);
        return studentsList;
    }
}

7.在StudentDao中去继承BaseDao.    注意:记得写@Repository注解

package com.systop.moudle.student.dao;

import com.systop.core.dao.BaseDao;
import com.systop.moudle.student.entity.Student;
import org.springframework.stereotype.Repository;

@Repository
public class StudentDao extends BaseDao<Student,Long> {

}

8.在StudentController中测试。写注解

package com.systop.moudle.student.controller;

import com.systop.moudle.student.entity.Student;
import com.systop.moudle.student.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class StudentController {

    //注入StudentService
    @Autowired
    private StudentService studentService;

    @RequestMapping("/save")
    public void save(Student student){
        student.setId(7L);
        student.setAddress("石家庄辛集市");
        student.setAge(20);
        student.setName("王五");
        studentService.save(student);
    }

    @RequestMapping("/update")
    public void update(Student student){
        student.setId(7L);
        student.setAddress("石家庄11111");
        student.setAge(20);
        student.setName("张伟");
        studentService.update(student);
    }

    @RequestMapping("/delete/{id}")
    public void delete(@PathVariable("id") Long id){
        studentService.delete(id);
    }

    @RequestMapping("/find/{id}")
    public void find(@PathVariable("id") Long id){
        Student student = studentService.find(id);
    }

    @RequestMapping("/findAll")
    public void findAll(){
        List<Student> students = studentService.findAll();
        System.out.println(students);
    }
}

9.在浏览器中输入:http://localhost:8080/save就可以保存到数据库中。别的方法同理。

第一次写博客,那是因为我想与大家分享.Net世界.我原来是ASP程序员,与.Net结缘那是在两年多前.第一次接触它,就喜欢上了.哈哈 接着我给大家分享一下我在项目用到的数据访问层,这个是我用微软网站上得到的DBHepler数据库访问层的一次改编,让它支持实体类和用表达 式的方式生成SQL,而且更关键的是,他是采用参数的方式传值的,这样就避免了SQL的注入啦.. 以下是这个项目的结构 [SuperDAL] ---DbHelper.cs(来自MSDN的数据访问层) ---EntityManager.cs(实体类管理) ---Expressions.cs(实体类表达式查询) ---Expression.cs(实体类表达式) ---OrderByExpressions.cs(排序表达式查询) ---OrderByExpression.cs(排序表达式) ---ObjectValues -------OrderBy.cs(排序枚举类) ---DBManager.cs(数据访问类管理) ---DbParams.cs(数据库访问类参数) ---DataTableExtensions.cs(这个就是顾名思义啦,DataTable传实体类) 在这里最主要介绍的就是EntityManager这个啦,使用方法如下: 有数据库DB的一张表Customs CREATE TABLE [Customs] ( [Name] [varchar] (20) , [Password] [varchar] (20) , [Email] [varchar] (50) , [Phone] [varchar] (11) NULL , [Old] [int] , [Birthday] [DateTime] ) 有个实体类Customs.cs,结构如下: public class Customs { public string Name {get;set;} public string Password {get;set;} public string Email {get;set;} public string Phone {get;set;} public int Old{get;set} public DateTime Brithday {get;set;} } 数据库表与实体Customs结构是一一对应的.有了实体类CUstoms,下面就可以操作实体类跟操作数据库一样的啦,我们新建一个实体类管理类 CustomsManager.cs public class CustomsManager:EntityManager { public Customs GetByName(string name) { //创建表达式Expressions Expressions exps=new Expressions(); //向表达式添加条件 exps.Eq("name",name); //根据条件查询返回实体类 return EM_GetUnique(exps); } public List SearchByName(string name) { //同样像上面一样建立表达式类 Expressions exps=new Expressions(); exps.Like("name",name);//当然,有年朋友会说如果我要姓为"陈"的,那有些人的名字带陈的怎么办,没关系,可以改为 exps.LeftLike ("name",name); //根据条件查询返回实体类 return EM_GetEntity(exps); } /// /// 登录 /// /// 用户名 /// 密码 public List Login(string name,string password) { Expressions exps=new Expressions(); exps.Eq("name",name); exps.Eq("password",password); return EM_GetEntity(exps); } /// /// 选择年龄大于指定岁数的,并按年龄从小到大排序 /// /// 年龄 public List SelectOlder(int old) { Expressions exps=new Expressions(); exps.Gt("old",old); exp.OrderBys.Add("old", OrderBy.Asc); return EM_GetEntity(exps); } /// /// 选择年龄大于小于指定岁数段的,并按年龄从小到大,姓名从字母升序排序 /// /// 年龄 public List SelectByOld(int oldStart,int oldend) { Expressions exps=new Expressions(); exps.Between("old",oldStart,oldEnd); exp.OrderBys.Add("old", OrderBy.Asc); exp.OrderBys.Add("name",OrderBy.Asc); return EM_GetEntity(exps); } #region 增删改 操作 /// /// 更新操作 /// /// 实体类 public int Update(Customs customs) { return EM_Save(customs);//返回更新的记录数,当然,一般成功执行就会返回1;也可以改上面为public void Update(Customs customs) } /// /// 删除操作 /// /// public int DeleteByName(string name) { Expressions exps=new Expressions(); exps.Eq("name",name); return EM_Delete(exps); } /// /// 删除操作 /// /// 实体类 public int Save(Customs custom) { return EM_Save(custom); } #endregion } 当然还有更多的也就不一一贴出来了 Expressions支持的表达式有 1. Eq (等于)[name=value] 2. NotEq (不等于)[not name = value] 3. Ge (大于等于)[name >=value] 4. Gt (大于)[name>value] 5. Le (小于等于)[name<=value] 6. Lt (小于)[name<value] 7. In (包括)[name in (value)] 8. NotIn (不包括)[not name in (value) 9. IsNotNull (不为NULL)[not name is null] 10. IsNull (等于NULL)[name is null] 11. Between (之间)[name between valueStart and valueEnd] 12. Like (模糊) [name like ‘%value%’ ] 13. LeftLike (左模糊) [name like ‘%value’] 14. RightLike (右模糊) [name like ‘value%’] 其它功能待与Net爱好者探讨啦,希望你有更好的思路
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值