【MyBatis】(二)MyBatis的SQL操作(操作各种SQL语句,动态SQL语句查询,Mapper映射器映射规则)

四、Mybatis操作各种SQL语句

1.查询

查询的标准模板

    id:当前SQL定义的id,方便在代码中查找当前SQL语句

    parameterType:传入SQL语句中占位符的参数类型:int,string,map,double,object对象类型

    resultType:SQL语句执行完成后封装的结果类型:int,string,map,double,object对象类型

SQL语句字段引用模板

    SELECT * FROM user

详解基本案例:

1>根据id查询一个对象.?



// 第一个参数 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> user = session.selectList("findOneById", 1);

for (Map map : user) {

System.out.println(map);

}

session.close();

6>查询所有用户的账号和密码?



// 不用传入参数获取到所有的对象封装成Map存入list集合中
List> users = session.selectList("findAllUAP");

for (Map map : users) {

System.out.println(map);

}

session.close();

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();
		
	}
}

 

七、Mapper映射器映射规则(动态代理模式)

定义:通过一定的映射规则,根据我们定义的接口,可以自动生成对应的实现类,然后重写接口满足映射规则的方法,那么满足这个规则的接口一般被称为映射接口.

映射规则:

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);

你可能感兴趣的:(Java初学)