1.查询
查询的标准模板
id:当前SQL定义的id,方便在代码中查找当前SQL语句
parameterType:传入SQL语句中占位符的参数类型:int,string,map,double,object对象类型
resultType:SQL语句执行完成后封装的结果类型:int,string,map,double,object对象类型
SQL语句字段引用模板
详解基本案例:
// 第一个参数 Sql定义的id 第二个参数 占位符的参数值
// 通过Session工厂获取的session对象调用selectOne方法获取到一个User对象,即为查询到的对象
User user = session.selectOne("findUserById", 1);
2>查询所有数据.?
// 如果多个映射文件有相同的sql定义id可以使用namespace.id名来
List users = session.selectList("user.findAll");
3>根据名字进行模糊查询?
// 通过session工厂创建的session对象调用selectList方法查询,注意%与_返回一个List集合
List users = session.selectList("findThem", "%张%");
4>根据账号密码查询一个账户?
// 传入的对象不同,所以参数的类型和查询的方式也不同
// 传入一个Bean对象
User user = new User("张三", "123", 0, "");
List u = session.selectList("findOneByUAP", user);
System.out.println(u);
session.close();
// 传入一个map集合
Map map = new HashMap();
map.put("username", "张三");
map.put("password", "123");
User user = session.selectOne("findOneByUAP2", map);
System.out.println(user);
session.close();
5>根据id只查询账号和密码?(封装成Map集合)
// 返回值的类型为Map则需要将返回Object数据封装成一个Map对象,存放在list数组中
List
6>查询所有用户的账号和密码?
// 不用传入参数获取到所有的对象封装成Map存入list集合中
List
7>当实体类中属性名和表中字段名不一致时怎么查询?
方案1:给列起别名,别名的名字和实体类属性名相同
方案2:借助resultType标签做实体类中属性名和表中字段之间映射关系
1.实体类属性名与表中字段之间关系映射.
2.查询结果类型上resultMap="映射标签id"
8>分页查询 (分页查询还有一种拦截器查询,也是比较好的查询方式,建议参考)
// 获取到一个链表对象,向其中存入页码和页容值,然后进行查询
HashMap maps = new LinkedHashMap();
maps.put("page", 2);
maps.put("pageSize", 3);
List lists = session.selectList("user.getUserByLimit", maps);
2.增加
SQL语句
INSERT INTO user
(username,password,age,gender) VALUES
(#{username},#{password},#{age},#{gender})
User user = new User("宋豪", "123456", 80, "男");
int rows = session.insert("saveUser", user);
// 提交事务
session.commit();
System.out.println("成功插入数据的行数:" + rows);
// 关闭对象
session.close();
3.删除
SQL语句
DELETE FROM user WHERE id=#{id}
// 直接调用delete方法并传入值
int rows = session.delete("deleteUserById", 6);
System.out.println("删除记录行数:" + rows);
session.commit();
session.close();
4.修改
SQL语句
UPDATE user SET username=#{username},password=#{password},age=#{age},gender=#{gender} WHERE id=#{id}
// 先根据id获取一个user对象
User user = session.selectOne("findUserById", 3);
user.setUsername("哈哈哈");
user.setPassword("呵呵呵");
user.setAge(18);
user.setGender("女");
int rows = session.update("user.updateUser", user);
System.out.println("修改记录行数:" + rows);
session.commit();
session.close();
5.其他配置
片段提取:对多条SQL定义中相同SQL片段的提取
1>.提取定义
2>.引用定义
SqlMapConfig主配置文件
1>引入配置文件
a.
b.使用${key}值进行使用
2>给类起别名
3.调用Log4j打印SQL语句
1.$和#都可以充当占位符,$底层是由Statement实现的;#底层是由PrepareStatement实现的.
2.#是先编译SQL语句然后再传值,给传入的值都加上双引号;$传值是直接拼接字符串,不会给传入的值加双引号.
3.$会造成SQL注入的问题,#不会
4.只有在传入数据库对象时才使用$
4.1>按照某个表名进行查询时传入表名
4.2>按照某个列名进行查询时传入列名
5.传入非数据库参数时最好使用#不使用$符号
案例:
六、MyBatis动态SQL语句
1.什么是动态SQL
动态SQL是MyBatis特性之一,可以根据用户传入的条件,借助xml标签对SQL语句进行动态拼接,生成符合条件的SQL语句
2.动态SQL语句的用法
2.1>分支判断
2.2>关键字标签
where关键字:1.充当SQL语句中的一个where关键字;2.去掉拼接完SQL语句后多余的and,or关键字.
set关键字:1.充当SQL语句中的一个set关键字;2.去掉拼接完SQL语句后多余的逗号.
2.3>案例
a.员工信息查询:如果传入了部门编号,就查询该部门下所有员工信息;如果没有传入员工部门编号,就查询所有员工信息
b.根据薪资来查询员工信息
c.根据性别查询员工信息
d.根据job和salary两个条件查询员工信息(两种方式)
e.修改Emp员工信息
UPDATE emp
name=#{name},
sex=#{sex},
job=#{job},
salary=#{salary},
hiredate=#{hiredate},
deptno=#{deptno},
WHERE id=#{id}
总:
UPDATE emp
name=#{name},
sex=#{sex},
job=#{job},
salary=#{salary},
hiredate=#{hiredate},
deptno=#{deptno},
WHERE id=#{id}
INSERT INTO emp (name,sex,job,salary,hiredate,deptno) VALUES
(#{name},#{sex},#{job},#{salary},#{hiredate},#{deptno})
DELETE FROM emp WHERE id=#{id}
UPDATE emp
name=#{name},
sex=#{sex},
job=#{job},
salary=#{salary},
hiredate=#{hiredate},
deptno=#{deptno},
WHERE id=#{id}
测试结果:
package com.hekaikai666.test;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.lanou.bean.Emp;
import com.lanou.dao.EmpMapper;
import com.lanou.util.MyBatisUtil;
/**
*
*@author sh
*@time 2018年9月18日上午11:40:19
**/
public class Test2 {
SqlSessionFactory factory;
SqlSession session;
@Before
public void init() {
factory=MyBatisUtil.getFactory();
session = factory.openSession();
}
@Test
public void test1() {
Emp emp=new Emp();
emp.setDeptno(30);
List emps = session.selectList("emp.findEmps", emp);
System.out.println(emps);
}
@Test
public void test2() {
Emp emp=new Emp();
emp.setSalary(5000);
List emps = session.selectList("emp.findEmpBySalary", emp);
System.out.println(emps);
}
@Test
public void test3() {
Emp emp=new Emp();
List emps = session.selectList("emp.findEmpsBySex", emp);
System.out.println(emps);
}
@Test
public void test4() {
Emp emp=new Emp();
emp.setSalary(5000);
emp.setJob("销售");
List emps = session.selectList("emp.findEmpBySalaryAndJob", emp);
System.out.println(emps);
}
@Test
public void test5() {
Emp emp = session.selectOne("emp.findEmpById", 7);
emp.setName("pop");
emp.setSex("男");
int update = session.update("emp.updateEmpById", emp);
System.out.println("修改了"+update+"条数据");
}
@Test
public void test6() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp findEmpById = mapper.findEmpById(7);
System.out.println(findEmpById);
}
@Test
public void test7() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
mapper.addEmp(new Emp("氢气", "男", "教学", 5000, new Date(), 10));
}
@Test
public void test8() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
System.out.println(mapper.findAll());
//mapper.deleteEmpById(8);
Emp emp = mapper.findEmpById(1);
emp.setName("杰克");
mapper.updateEmp(emp);
}
@After
public void end() {
session.commit();
session.close();
}
}
定义:通过一定的映射规则,根据我们定义的接口,可以自动生成对应的实现类,然后重写接口满足映射规则的方法,那么满足这个规则的接口一般被称为映射接口.
映射规则:
1.SQL映射文件的namespace的值必须和映射接口的全限定名(包名.接口名)一致;
2.SQL定义的ID名称必须和映射接口中的方法名一致;
3.SQL定义的parameterType类型必须和映射接口方法中的参数类型,个数一致;
4.SQL定义的resultType和映射接口方法的返回值类型一致,增删改SQL语句没有resultType,映射接口的返回值类型写void.
建议规范:
1>SQL映射文件放在和映射接口同一包下;
2>映射接口名以Mapper结尾便于区分其他接口
映射接口.java
// 查找
public Emp findEmpById(int id);
// 查找所有
public List findAll();
// 添加
public void addEmp(Emp emp);
// 删除
public void deleteEmpById(int id);
// 修改
public void updateEmp(Emp emp);
SQL定义映射文件.xml
INSERT INTO emp (name,sex,job,salary,hiredate,deptno) VALUES
(#{name},#{sex},#{job},#{salary},#{hiredate},#{deptno})
DELETE FROM emp WHERE id=#{id}
UPDATE emp
name=#{name},
sex=#{sex},
job=#{job},
salary=#{salary},
hiredate=#{hiredate},
deptno=#{deptno},
WHERE id=#{id}
SQL映射接口的实现类(测试类).java
* 按照id查询一个员工
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.findEmpById(1);
* 查询所有员工对象
EmpMapper mapper = session.getMapper(EmpMapper.class);
List emps = mapper.findAll();
for (Emp emp : emps) {
System.out.println(emp);
}
* 添加一个员工
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = new Emp("宋豪", "男", "前台", 8000, null, 8);
mapper.addEmp(emp);
* 按照id删除一个员工
EmpMapper mapper = session.getMapper(EmpMapper.class);
mapper.deleteEmpById(8);
* 按照学生id修改员工信息
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp = mapper.findEmpById(9);
emp.setJob("油漆工");
emp.setSex("女");
mapper.updateEmp(emp);