动态sql(二):注解

表结构:
create table grade(
   gid number primary key,
   gname varchar2(20),
   sex number(1)
);


-- Add comments to the columns 
comment on column STUDENT.sex
  is '0男 1女';
  
create table student(
   sid number primary key,
   sname varchar2(20),
   gid number references grade(gid)
);


实体类:
public class Student {
private Integer sid;
private String sname;
private Integer gid;
private Integer sex;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}






接口:

public interface StudentMapper {


//静态内部类

static class StudentProvier{


//方法内的参数为Map

/**
* ${}在注解情况 失效  使用#{}
* 对象的属性 取值 别名.属性名
* 提供sql方法的参数 是 Map 键值对
* 提供sql语句方法

* @param map
* @return
*/
public String queryStudentSql( Map map){    //字符串拼接
Student student=(Student)map.get("stu");
String sql=" select * from student where 1=1 ";
if(student.getSname()!=null &&!"".equals(student.getSname())){
student.setSname("%"+student.getSname()+"%");
sql+=" and sname like #{stu.sname}";
}
if(student.getGid()!=null &&!"".equals(student.getGid())){

sql+="  and gid = #{stu.gid} ";
}
return sql;
}


public String queryStudentSql1( Map map){  //实体类
Student student=(Student)map.get("stu");
SQL sql=new SQL();
sql.SELECT("*").FROM("student");
if(student.getSname()!=null &&!"".equals(student.getSname())){
student.setSname("%"+student.getSname()+"%");
sql.WHERE(" sname like #{stu.sname}");
}
if(student.getGid()!=null &&!"".equals(student.getGid())){
sql.AND();
sql.WHERE(" gid = #{stu.gid}");
}
return sql.toString();

}

public String queryStudentSql1(Map<String,Map<String,String>> map){ //map
 Map<String,String> map=map.get("map");

String sname=map.get("sname");

String age=map.get("age");

SQL sql=new SQL();
sql.SELECT("*").FROM("student");
if(sname!=null &&!"".equals(sname)){

map.put("sname","%"+map.get("sname")+"%")

sql.AND();
sql.WHERE("sname like #{map.sname}");
}
if(age!=null &&!"".equals(age)){
sql.AND();
sql.WHERE("gid = #{map.gid}");
}
return sql.toString();

}



public String updateStudentSql(Map map){
Student student=(Student)map.get("stu");
SQL sql=new SQL();
sql.UPDATE("student");
if(student.getSname()!=null &&!"".equals(student.getSname())){
sql.SET("sname=#{stu.sname}");
}
if(student.getGid()!=null &&!"".equals(student.getGid())){
sql.SET("gid=#{stu.gid}");
}
if(student.getSex()!=null &&!"".equals(student.getSex())){
sql.SET("sex=#{stu.sex}");
}
sql.WHERE("sid =#{stu.sid}");
return sql.toString();
}

public String queryStudentbyAnyGradeSql(Map map){
List<Integer> list=(List<Integer>) map.get("gradeList");

String sql="select * from student where gid in(";

StringBuilder builder = new StringBuilder();
for (Integer in : list) {
builder.append(in + ",");
}

String s = builder.substring(0, builder.length()-1);

s=s+")";

return sql+s;
}
}


@SelectProvider(type=StudentProvier.class,method="queryStudentSql1")
public List<Student> queryStudent(@Param("stu") Student student);


//  直接使用<script>sql语句 </script> 这种方式不支持使用
@Select("<script>select * from student where 1=1 " +
"<choose>"+
      "<when test=\"sex!=null\">"+
      "   and sex=#{sex}"+
      "</when>"+
      " <otherwise>"+
      "   and sex=1 "+
      "</otherwise>"+
      "</choose></script>")
public List<Student> queryBySex(@Param("sex")Integer sex);
/**
* 更新学生信息
* @param sid
* @return

*/

--用实体类来接收字段变量

@UpdateProvider(type=StudentProvier.class,method="updateStudentSql")

public void updateStudent(@Param("stu") Student student);

--用map来接收字段变量 --假设传来参数String sname,String age

@UpdateProvider(type=StudentProvier.class,method="updateStudentSql")

public void updateStudent(@Param("map") Map<String,String> map);




/**
* 通过传入的班级查询所有学生
* 0,1,2
* 1,2
* 2,3,4

* @param gradeList
*/
@SelectProvider(type=StudentProvier.class,method="queryStudentbyAnyGradeSql")
public List<Student> queryStudentbyAnyGrade(@Param("gradeList")List<Integer> gradeList);
}


//测试类


public class MyBatisTest {
private  SqlSession getSession() throws IOException {
// mybatis核心配置文件路径
String resource = "cn/et/lesson4/annotion/mybatis.xml";


InputStream inputStream = Resources.getResourceAsStream(resource);
// 工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// session操作的是指向sql语句的一个唯一标识符
SqlSession openSession = sqlSessionFactory.openSession();
return openSession;
}


@Test
public  void selectStudent() throws IOException {
SqlSession openSession = getSession();

StudentMapper mapper = openSession.getMapper(StudentMapper.class);
Student student=new Student();

student.setGid(2);
student.setSname("飞");
List<Student> stList = mapper.queryStudent(student);

for(Student stu:stList){
System.out.println(stu.getGid()+"---"+stu.getSname());
}
}
@Test
public  void selectStudentBySex() throws IOException {
SqlSession openSession = getSession();
StudentMapper mapper = openSession.getMapper(StudentMapper.class);

List<Student> stList = mapper.queryBySex(1);

for(Student stu:stList){
System.out.println(stu.getSname());
}
}

@Test
public  void updateStudent() throws IOException {
SqlSession openSession = getSession();

StudentMapper mapper = openSession.getMapper(StudentMapper.class);
Student student=new Student();

student.setSname("gou飞");
student.setGid(1);
student.setSex(1);
student.setSid(1);
mapper.updateStudent(student);

openSession.commit();
}


@Test
public  void queryStudentbyAnyGrade() throws IOException {
SqlSession openSession = getSession();

StudentMapper mapper = openSession.getMapper(StudentMapper.class);

List<Integer> list=new ArrayList<>();
list.add(1);
list.add(3);

List<Student> sList = mapper.queryStudentbyAnyGrade(list);

for(Student stu:sList){
System.out.println(stu.getSname());
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值