Mybatis的学习
折腾一个Mybatis的应用:
写一个db.properties用来存储driver,url还有所连接数据库的账号,密码
driver =oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=SCOTT
passowrd=TIGER
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--根元素: 核心配置-->
<configuration>
<!-- 加载外部的properties文件 -->
<properties resource="db.properties" />
<!--配置别名,别名不区分大小写-->
<typeAliases>
<package name="com.yjxxt.pojo"/>
</typeAliases>
<!--环境配置-->
<environments default="ev">
<environment id="ev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--sql映射配置加载-->
<mappers>
<!--resource后面的是这个文件的地址,然后连接的就是另一个查询表的xml-->
<mapper resource="com/yjxxt/mappers/EmpMapper.xml"/>
</mappers>
</configuration>
创建一个EmpMapper:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--本文件的地址-->
<mapper namespace="com.yjxxt.mappers.EmpMapper">
<!--查询所有员工的数据,reultType是结果集-->
<select id="queryAllEmp" resultTpye="emp">
select *from emp
</select>
</mapper>
创建一个EmpMapper接口:
public interface EmpMapper{
//定义抽象类,查询所有员工的数据
public List<Emp> queryAllEmp();
}
封装方法Dept:
public class Dept{
private int deptno;
private String name;
private String loc;
public Dept(){}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dept dept = (Dept) o;
return deptno == dept.deptno &&
Objects.equals(dname, dept.dname) &&
Objects.equals(loc, dept.loc);
}
@Override
public int hashCode() {
return Objects.hash(deptno, dname, loc);
}
@Override
public String toString() {
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
}
封装个Emp:
public class Emp implement Serializable{
private int empno;//员工号
private String ename;//名字
private double sal;//工资
private Date hiredate;//入职时间
private int deptno;//部门号
public Emp() {
// TODO Auto-generated constructor stub
}
public Emp(int empno, String ename, double sal, Date hiredate, int deptno) {
super();
this.empno = empno;
this.ename = ename;
this.sal = sal;
this.hiredate = hiredate;
this.deptno = deptno;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + deptno;
result = prime * result + empno;
result = prime * result + ((ename == null) ? 0 : ename.hashCode());
result = prime * result + ((hiredate == null) ? 0 : hiredate.hashCode());
long temp;
temp = Double.doubleToLongBits(sal);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Emp other = (Emp) obj;
if (deptno != other.deptno)
return false;
if (empno != other.empno)
return false;
if (ename == null) {
if (other.ename != null)
return false;
} else if (!ename.equals(other.ename))
return false;
if (hiredate == null) {
if (other.hiredate != null)
return false;
} else if (!hiredate.equals(other.hiredate))
return false;
if (Double.doubleToLongBits(sal) != Double.doubleToLongBits(other.sal))
return false;
return true;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + ", hiredate=" + hiredate + ", deptno="
+ deptno + "]";
}
}
测试接口绑定方案的基本使用
public class Class001_interface_bind{
public static void main(String[] args){
//1.获取回话
SqlSession session =SessionUtils.getSession();
//2.获取接口的实现类对象
//接口多态
EmpMapper mapper =session.getMapper(EmpMapper.class);
List<Emp> list =mapper.queryAllEmp();
list.forEash(System.out::println);
//4.关闭回话
session.close();
}
}
ssm中的M是mybatis,下载去github
用XML配置mybatis,文件类型后要加xml
http和xml为标记语言
xml第一行是版本申明 environments:环境的配置
id选择环境,transaetionManager:实物管理器 type:="jdbc"选择与jdbc相同的事务管理器
DataSource数据源配置 type="PooLED"通过数据库连接池管理连接
mappers:sql映射配置的加载:定义sql语句的配置文件
用namespace命名空间来区分,且不能重复
建议设为当前包名+类名,且不加后缀
sesst定义查询语句,标签对定义查询语句
id:sql语句的唯一标识 resultType:结果类型 parameterType:入参类型
测试类:
main{
// 1.加载mybatis的核心配置文件
Resources。getResourceAsstreem("mybatis-cofig.xml");
//2.构建SqlSessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//3.根据工厂构建回话
Sqlsession session =factory.openSession();
//4.执行sql,得到结果
List<Dept> list =session.seleetion("com.yjxxt.mappers.DeptMapper.queryAll");
//5.处理结果
List.forEach(System.out::println);
//6.关闭回话
session.close();
}
#{} ->获取传递到sql语句中的数据
三个常用的查询方法
selectOne()用于查询单条数据的情况,返回值是一个对象,如果没有查到任何数据,则返回一个null
selectList(),执行指定的sql,得到一个List集合
selectMap:用于查询多条数据的情况,多条数据要形成一个map集合,如果查不到,返回一个空map集合(注意不是null)
<package name="包名"> --> 包下所有类名都默认
¥{}获取值-->从配置中拿数据
当结果类型为map,把一条数据的每一个字段作为map中的一个键值对,一个map展示一条数据
List<map> 如果有多条数据,每一个调数据作为一个map放入List中
接口:public interface userMaper{
//查询多个数据
public List<User> queryAll();
}
sql映射文件要与接口同名
接口绑定方案:1.接口要与映射文件在同一个包中
2.接口要与sql映射文件同名
3.sql映射文件的命名空间namespace要求定义为接口的包名。接口名(权限定名)
4.sql标签的id属性值定义为对其接口中的抽象方法名
5.sql的返回值和参数要求与抽象方法的返回值与参数大保持一致