添加
使用注解方式进行添加特殊情况,获取最新主键的id
- 查询最新数据的主键last_insert_id
@Insert(value = {"insert into student(name,age,score) values(#{name},#{age},#{score})"})
@selectKey(statement="select last_insert_id()",keyProperity="id",before=false,resultType="int".class)
void insertStudentCatchId(Student student);
- 查询最新数据的主键用@@identify
@Insert(value = {"insert into student(name,age,score) values(#{name},#{age},#{score})"})
@selectKey(statement="select @@identify",keyProperity="id",before=false,resultType="int".class)
void insertStudentCatchId(Student student);
//statement:sql语句
//keyProperty:将查询的结果封装到属性
//resultType:将查询的结果封装成的类型
//before:不是在selectKey执行之前
使用注解不将sql语句写在注解中,放入指定类的方法,方便动态sql语句。
-
普通查询
接口中:
@SelectProvider(type = xxx.class,method = "getSelectSql")
Student selectStudentById(int id);
//type为sql语句存放的类名,method为该存放该sql语句的方法
@SelectProvider(type = xxx.class,method = "getSelectSql")
Student selectStudentAll();
存放SQL语句的类xxx.java:
public String getSelectSql(Integer id){
if(id == null){
return "select id,name,age,score from where id=#{id}"
}else{
return "select id,name,age,score from student where id = #{id}";
}
}
-
模糊查询
接口中:
@SelectProvider(type = xxx.class,method = "getSelectSql2")
List<Student> selectStudentByName(String name);
//type为sql语句存放的类名,method为该存放该sql语句的方法
存放SQL语句的类xxx.java:
public String getSelectSql2(){
return "select id,name,age,score from student where name like '%' #{name} '%'";
}
-
复合条件查询1
接口中:
@SelectProvider(type = xxx.class,method = "getSelectSql3")
List<Student> selectStudentByCondition(Student student);
//type为sql语句存放的类名,method为该存放该sql语句的方法
存放SQL语句的类xxx.java:
public String getSelectSql3(Student student){
StringBuffer sql = new StringBuffer();
sql.append("select id,name,age,score from student where 1=1");
if(student.getName()=!null && student.getName()!=""){
sql.append(" and name like '%' #{name} '%'");
}
if (student.getAge()>0){
sql.append(" and age < #{age}");
}
return sql.toString();
}
//注意第一个sql语句中要加上where 1=1,下面添加的sql语句才会符合语句。
//两个添加的sql语句要先空格
//最会返回的类型改为字符串类型
- 复合条件查询2
接口中:
@SelectProvider(type = xxx.class,method = "getSelectSql4")
List<Student> selectStudentByCondition2(Map map);
//type为sql语句存放的类名,method为该存放该sql语句的方法
存放SQL语句的类xxx.java:
public String getSelectSql4(Map map){
StringBuffer sql = new StringBuffer();
sql.append("select id,name,age,score from student where 1=1");
if(map.get("name")=!null && map.get("name") != ""){
sql.append(" and name like '%' #{name} '%'");
}
if ((Integer)map.get("age")>0){
sql.append(" and age < #{age}");
}
return sql.toString();
}
//注意第一个sql语句中要加上where 1=1,下面添加的sql语句才会符合语句。
//两个添加的sql语句要先空格
//最会返回的类型改为字符串类型
测试类中:
public void test3{
map.put("age",13);
map.put("name","小");
List<Student> students = studentDao.selectStudentByCondition3(map);
for (Student s:students){
System.out.println(s)
}
}
- 复合条件查询3
接口中:
@SelectProvider(type = xxx.class,method = "getSelectSql5")
List<Student> selectStudentByCondition3(@Param("name")String name,@Param("age") int age);
//type为sql语句存放的类名,method为该存放该sql语句的方法
测试类中:
public void test3{
List<Student> students = studentDao.selectStudentByCondition3("小",19);
for (Student s:students){
System.out.println(s)
}
}
存放SQL语句的类xxx.java:
public String getSelectSql5(Map map){
//注意如果用参数进行传递,要用map接受。
StringBuffer sql = new StringBuffer();
sql.append("select id,name,age,score from student where 1=1");
if(map.get("name")=!null && map.get("name") != ""){
sql.append(" and name like '%' #{name} '%'");
}
if ((Integer)map.get("age")>0){
sql.append(" and age < #{age}");
}
return sql.toString();
}
//注意第一个sql语句中要加上where 1=1,下面添加的sql语句才会符合语句。
//两个添加的sql语句要先空格
//最会返回的类型改为字符串类型
修改
- 利用注解进行修改
接口中:
@UpdateProvider(type = MySqlProvider.class,method = "getUpdateSql2")
void updateStudent2(Student student);
存放SQL语句的类 MySqlProvider.java:
public String getUpdateSql2(Student student){
StringBuffer sql = new StringBuffer();
sql.append("update student set id=#{id} ");
if (student.getName() != null && student.getName() != ""){
sql.append(",name=#{name}");
}
if (student.getAge() > 0){
sql.append(",age=#{age}");
}
if (student.getScore() > 0){
sql.append(",score = #{score}");
}
sql.append(" where id = #{id}");
return sql.toString();
}
//注意这里由于不知道需要修改几个属性,所以使用了动态sql语句,sql.append第一句加上set id=#{id}作用于上面的1=1一样,id是不会变的。
测试类:
@Test
public void Test11()
{
Student student = new Student("小二",22,98);
student.setId(25);
studentDao.updateStudent2(student);
session.commit();
//注意这里要进行提交
}
- 使用匿名内部类进行修改
接口中:
@UpdateProvider(type = MySqlProvider.class,method = "getUpdateSql3")
void updateStudent3(Student student);
存放SQL语句的类 MySqlProvider.java:
public String getUpdateSql3(final Student student){
//public class extends People{}
//new SQL(){}表示创建一个SQL类的子类对象,只不过这个子类叫什么名字不知道,没有指定。
//这种写法叫匿名内部类。
String sql = new SQL(){
{
this.UPDATE("student");
this.SET("id = #{id}");
if (student.getName() != null && student.getName() != ""){
this.SET("name = #{name}");
}
if (student.getAge() > 0){
this.SET("age = #{age}");
}
if (student.getScore() > 0){
this.SET("score = #{score}");
}
this.WHERE("id = #{id}");
}
}.toString();
return sql;
}
测试类:
//修改学生信息3
@Test
public void Test12()
{
Student student = new Student("小二",22,98);
student.setId(24);
studentDao.updateStudent3(student);
session.commit();
}
网友评论