org.mybatis
mybatis
3.5.13
mysql
mysql-connector-java
8.0.32
@Mapper
public interface EmployeeMapper {
//查询某个员工的信息
Employee getEmployee(@Param("empId") int empId);
//添加一个员工的信息
int addEmployee(Employee employee);
}
public class Employee {
int eid;
String empName;
String empSex;
int empAge;
String empEmail;
int did;
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
@Override
public String toString() {
return "员工姓名" + empName + "员工性别" + empSex + "员工年龄" + empAge
+ "员工邮箱" + empEmail + "员工所在部门编号" + did;
}
}
@Test
public void testOne() throws IOException {
//根据文件获取配置类的输入流
InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");
//利用SqlSessionFactoryBuild建立SessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(rs);
//获取SqlSession对象
SqlSession ss = sessionFactory.openSession();
//根据接口类型来获取接口的动态代理对象执行声明的方法
Employee rel=ss.getMapper(EmployeeMapper.class).getEmployee(3);
//查看是否获取成功
System.out.println(rel);
//关闭流
ss.close();
}
@Mapper
public interface EmployeeMapper {
//查询某个员工的信息,传入基本类型,声明接收时的参数名为empId
//不声明默认参数接收时,靠param1 parm2....或者arg0,arg1...来接受多个不同参数
Employee getEmployee(@Param("empId") int empId);
//传入对象参数,根据对象id查询数据库对应信息
Employee getEmployeeByObjField(Employee employee);
//传入map对象,map中又有对象,根据对象的eid属性寻找
Employee getEmployByMap(Map map);
//获取对象,根据List对象对象中又有对象
Employee getEmployeeByList(ArrayList employees);
}
B、接收方:
C、测试代码:输出结果一致
public class MyTest {
@Test
public void testOne() throws IOException {
//根据文件获取配置类的输入流
InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");
//利用SqlSessionFactoryBuild建立SessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(rs);
//获取SqlSession对象
SqlSession ss = sessionFactory.openSession();
//根据接口类型来获取接口的动态代理对象执行声明的方法
Employee rel=ss.getMapper(EmployeeMapper.class).getEmployee(3);
//查看是否获取成功
System.out.println(rel);
//关闭流,如果有dml操作,还要调用提交事务方法
ss.close();
}
@Test
public void testTwo() throws IOException {
//....省略sqlsession对象获取过程,下面各测试方法一样省略
//创建对象
Employee testEmployee = new Employee();
testEmployee.setEid(3);
//根据接口类型来获取接口的动态代理对象执行声明的方法
Employee rel=ss.getMapper(EmployeeMapper.class).getEmployeeByObjField(testEmployee);
System.out.println(rel);
}
@Test
public void testTwo() throws IOException {
//创建对象
Employee testEmployee = new Employee();
testEmployee.setEid(3);
HashMap myMap = new HashMap<>();
myMap.put("one",testEmployee);
//根据接口类型来获取接口的动态代理对象执行声明的方法
Employee rel=ss.getMapper(EmployeeMapper.class).getEmployByMap(myMap);
System.out.println(rel);
}
@Test
public void testTwo() throws IOException {
//创建对象
Employee testEmployee = new Employee();
testEmployee.setEid(3);
ArrayList myList = new ArrayList<>();
myList.add(testEmployee);
//根据接口类型来获取接口的动态代理对象执行声明的方法
Employee rel=ss.getMapper(EmployeeMapper.class).getEmployeeByList(myList);
System.out.println(rel);
}
}
mapper中声明的方法:
//获得所有员工组成的集合:
ArrayList getEmployees();
xml中的映射部分:
在想要单独设置别名的类加上如下注解
@Alias("myEmployee")//这样该类的别名就成了myEmployee
public class Employee {//...
}
//结构省略
这样之后,就可以直接resultType中使用类的别名!
xml文件内容:
只用在resultMap属性中指定自定义映射的id才会使用,没有就不使用,这里太局限,我们还开启驼峰映射配置。
SqlSession ss = sessionFactory.openSession(true);
这样就省去了最后的提交操作
ss.commit();
mapper接口中方法:
//添加一个员工的信息,并返回主键
int addEmployee(Employee employee);
xml文件中的内容:
insert into t_emp(emp_name,emp_sex,emp_age,emp_email,did) values(#{empName},#{empSex},#{empAge},#{empEmail},#{did})
这样数据添加后,主键就会返回到添加对象的eid属性上
@Test
public void testOne() throws IOException {
//省略SqlSession对象回去过程。
//创建要加入到数据库的对象
Employee employee = new Employee("翩久遇","女",18,"[email protected]",2);
//返回的值还是影响的行数,但是主键值会被添加到参数的对象指定属性中
int keyRel=ss.getMapper(EmployeeMapper.class).addEmployee(employee);
//查看对象相关属性看看是否成功
System.out.println("新添加的员工的员工号是: " + employee.getEid());
//添加操作是dml操作,需要ss.commit()操作提交事务
ss.commit();
ss.close();
}
xml文件内容:
select replace(uuid(),"-","")
insert into t_emp(emp_name,emp_sex,emp_age,emp_email,did) values(#{empName},#{empSex},#{empAge},#{empEmail},#{did})
测试,添加新对象,把email属性空出来,接收数据库创建的uuid值,即关键字。
Employee employee = new Employee("翩久见","男",43,null,2);
//返回的值还是影响的行数,但是主键值会被添加到参数的对象指定属性中
int keyRel=ss.getMapper(EmployeeMapper.class).addEmployee(employee);
//查看对象相关属性看看是否成功
System.out.println("新添加的员工邮箱是: " + employee.getEmpEmail());
//添加操作是dml操作,需要ss.commit()操作提交事务
ss.commit();
ss.close();
环境准备:
public class Employee {
int eid;
String empName;
String empSex;
int empAge;
String empEmail;
int did;
Department department;
//省略其他gettersetter和构造器,重写toString的结构
}
public class Department {
int did;
String deptName;
}
Mapper接口叫做:EmpAndDeptMapper 映射文件同名,然后在配置文件中加入映射文件。
mapper接口内容:
@Mapper
public interface EmpAndDeptMapper {
//获取部门及其对应部门的方法,多表查询,一对多
Employee getEmployeeAndDept(@Param("eid")int eid);
}
List employees;
//获得一个部门对应的多个员工信息
Department getDepartmentAndEmp(@Param("did") int did);
动态sql就是mybatis的一套标签,能够实现有条件地增加sql语句,代替之前自己的sql拼接操作。
这是候就存在两个特殊情况,导致sql语句错误
int updateEmployeeEmail(@Param("eid") int eid,@Param("empName") String empName,@Param("empAge") int empAge);
update t_emp
emp_name = #{empName},
emp_age = #{empAge}
where eid= #{eid}
这样就存在一种情况,当要修改年龄在10到20岁时的姓名时,后面多了个逗号
别担心,因为在set标签总,它会自动判断,删除前后多余符号。
update t_emp
emp_name = #{empName},
emp_age = #{empAge}
where eid= #{eid}
update t_emp
emp_name = #{empName},
emp_name = #{empName},
emp_name = #{empName} ,
emp_age=18,emp_name="待定"
where eid = #{eid}
update t_emp set emp_age = emp_age + 1 where eid in
#{eid}
调用该方法给每位员工年龄加一:
//先创建所有员工eid的集合
Integer[] me = new Integer[]{1,2,3,4,5,6,11,12,13,14,17,18,19};
List empsEids = Arrays.asList(me);
//获取EmpAndDeptMapper的代理对象,并调用方法获取结果
int Rel = ss.getMapper(EmpAndDeptMapper.class).addEmployeeAgeOneByEid(empsEids);
//查看对象相关属性看看是否成功
System.out.println(Rel);
ss.commit();
ss.close();
update t_emp set emp_age = emp_age + 1 where eid in
#{eid}
配置文件中:
com.github.pagehelper
pagehelper
5.2.0
@Test
public void testOne() throws IOException {
//.................
//前面省略SqlSession对象ss的获取过程
//通过插件提供的方法设置要页码和每页的数据条数
PageHelper.startPage(2,4);
List rel = ss.getMapper(EmployeeMapper.class).getEmployees(2);
//然后我们将查询到的结果放入PageInfo对象中
PageInfo pageInfo = new PageInfo<>(rel);
//然后我们就可以根据该对象获取有关分页的各种数据,包括一共几页,每页多少数据等信息,
//还可以将数据list集合在获取出来
List list = pageInfo.getList();
System.out.println(list);
//获取一共几页:
System.out.println("一共:" +pageInfo.getPages() + "页");
//查看对象相关属性看看是否成功
ss.commit();
ss.close();
}
Page{count=true, pageNum=2, pageSize=4, startRow=4, endRow=8, total=13, pages=4, reasonable=false, pageSizeZero=false}[Employee{eid=5, empName='梅长波', empSex='男', empAge=21, empEmail='[email protected]', department=null}, Employee{eid=6, empName='暴冲飞', empSex='女', empAge=21, empEmail='[email protected]', department=null}, Employee{eid=11, empName='暴冲驰', empSex='女', empAge=25, empEmail='[email protected]', department=null}, Employee{eid=12, empName='暴冲飞', empSex='女', empAge=25, empEmail='[email protected]', department=null}]
next
完成后,工程中相应位置就会出现实体类,xml文件和mapper接口
里面提供了基本的单表增删改查操作:
public interface TUserMapper {
int deleteByPrimaryKey(Long id);
int insert(TUser record);
int insertSelective(TUser record);
TUser selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(TUser record);
int updateByPrimaryKey(TUser record);
}
映射文件中也自动写好了sql语句,可以直接使用,实现了orm思想