MyBasic初步学习代码的实现
Mybasic 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高层映射。Mybatis避免了几乎所有的JSBC代码和手动设置参数以及获取结果集。Mybatiske可以使用简单的XML或注解来设置和映射原生信息,将接口和java的POJOs(plain Old java Objects,普通的java对象)映射成数据库中的记录。
MyBatis最早源自Apache基金会的一个开源项目IBatis,2010年这个项目由APache software foundation 迁移到了google code ,并改名为MyBatis
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久成框架。
MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;
Mybatiske可以使用简单的XML或注解来设置和映射原生信息,将接口和java的POJOs(plain Old java Objects,普通的java对象)映射成数据库中的记录。
Mybais体系结构主要有以下几个关键部分:
1、加载配置
配置有两种形式,一种是XML配置文件,第二种是java代码的注解。Mybatis将SQL的配置信息加载成为一个个的MappedStatment对象(包括传入参数映射配置,执行的Sql语句、结果映射配置)并将其存储内存中
2、SQl解析
当API接口层接收到调用请求时,会接收传入到SQL的ID和传入对象(可以是Map、javaBean或者基本数据类型),MyBasic会根据SQl的ID找到对应的MapedStatment,然后根据参数对象对MappedStatment进行解析。解析后可以得到最终要执行的SQl语句和参数。
3.、SQl执行
将最终得到的SQl和参数拿到数据库进行执行,得到操作数据库的结果
4、映射
将操作数据库的结果按照映射配置进行转换。可以转换成HashMap、Javabean或者基本数据类型,并将最终结果返回。
以数据库emp表为例进行MyBasic操作
1.在SqlMapConfig.XML文件配置,进行与数据库的连接。
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="url" value="jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 引入Mapper文件 -->
<mappers>
<mapper resource="EmpDao.xml"/>
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
2.在EmpDaoxml用MyBasic
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- 命名空间需要与Dao保持一致 -->
<mapper namespace="com.zhiyou100.Dao.EmpDao">
<!-- 查询所有信息 -->
<select id="findAll" resultType="com.zhiyou100.Model.Emp">
select *from t_emp;
</select>
<!--根据ID查找员工信息-->
<select id="findByIdEmp" parameterType="Integer" resultType="com.zhiyou100.Model.Emp">
select *from t_emp where empno=#{id}
</select>
<!-- 添加员工信息 -->
<insert id="save" parameterType="com.zhiyou100.Model.Emp" >
<!--insert into t_emp values(null,#{ename},#{mgr},#{comm},#{deptno}) -->
insert into t_emp values(null,#{ename},#{mgr},#{comm},#{deptno})
</insert>
<!-- 更改员工信息 -->
<update id="update" parameterType="com.zhiyou100.Model.Emp" >
update t_emp set ename=#{ename},
mgr=#{mgr},
comm=#{comm},
deptno=#{deptno}
where empno=#{empno}
</update>
<!-- 删除员工信息 -->
<delete id="delete" parameterType="integer">
delete from t_emp where empno=#{empno}
</delete>
<select id="find" parameterType="int" resultType="map">
select *from t_emp where deptno=#{depton}
</select>
</mapper>
3.emp类
package com.zhiyou100.Model;
public class Emp {
private Integer empno;
private String ename;
private Integer mgr;
private Double comm;
private Integer deptno;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Double getComm() {
return comm;
}
public void setComm(Double comm) {
this.comm = comm;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
}
4.创建MyBatisUtil,初步构建数据库工厂会话!!!
package com.zhiyou100.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import junit.framework.TestCase;
public class MyBatisUtil {
private static SqlSessionFactory sf;
static {
//加载配置文件 sql会话工厂的建设
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
sf= builder.build(TestCase.class.getClassLoader().
getResourceAsStream("SqlMapConfig.xml"));
System.out.println(sf);
}
/*
* 创建连接connect/session
*
*/
public static SqlSession getSession(){
return sf.openSession();
}
public static void main(String[] args ) {
SqlSession session=MyBatisUtil.getSession();
System.out.println(session);
session.close();
}
}
5.EmpDao
package com.zhiyou100.Dao;
import java.util.List;
import java.util.Map;
import javax.websocket.Session;
import org.apache.ibatis.session.SqlSession;
import com.zhiyou100.Model.Emp;
import com.zhiyou100.util.MyBatisUtil;
public class EmpDao {
// 查找所有信息
public List<Emp> findAll() {
SqlSession session = MyBatisUtil.getSession();
List<Emp> list = session.selectList("com.zhiyou100.Dao.EmpDao.findAll");
session.close();
return list;
}
// 根据ID查找
public List<Emp> findByIdEmp(int id) {
SqlSession session = MyBatisUtil.getSession();
List<Emp> list = session.selectList("com.zhiyou100.Dao.EmpDao.findByIdEmp");
session.close();
return list;
}
//根据ID查找员工信息
public Emp findByIdEmp2(int id) {
SqlSession session = MyBatisUtil.getSession();
Emp emp = session.selectOne("com.zhiyou100.Dao.EmpDao.findByIdEmp", id);
session.close();
return emp;
}
// 添加员工信息
public void save(Emp emp) {
SqlSession session = MyBatisUtil.getSession();
try {
session.insert("com.zhiyou100.Dao.EmpDao.save",emp);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
} finally {
session.close();
}
}
//修改员工信息
public void update(Emp emp) {
SqlSession session=MyBatisUtil.getSession();
try {
session.update("com.zhiyou100.Dao.EmpDao.update", emp);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally {
session.close();
}
}
//删除员工信息
public void delete(int id) {
SqlSession session = MyBatisUtil.getSession();
session.delete("com.zhiyou100.Dao.EmpDao.delete",id);
session.commit();
session.close();
}
//集合套集合,Map<k,v> 通过k值,查找V,将V值放入list集合中
public List<Map<String, Object>> find(int depton){
SqlSession session = MyBatisUtil.getSession();
List<Map<String, Object>> list = session.selectList("com.zhiyou100.Dao.EmpDao.find", depton);
// session.commit();
session.close();
return list;
}
}
6.进行测试
package TestCase;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.zhiyou100.Dao.EmpDao;
import com.zhiyou100.Model.Emp;
import com.zhiyou100.util.EmpMapper;
import com.zhiyou100.util.MyBatisUtil;
public class TestCase {
@Test
public void test1() {
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
for (Emp emp : list) {
System.out.println(emp.getEname());
}
}
@Test
public void test2() {
EmpDao dao = new EmpDao();
List<Emp> list = dao.findByIdEmp(2);
for (Emp emp : list) {
System.out.println(emp.getEname());
}
}
// 根据ID查询
@Test
public void test3() {
EmpDao dao = new EmpDao();
Emp emp2 = dao.findByIdEmp2(2);
System.out.println(emp2.getEname());
}
// 添加
@Test
public void test4() {
EmpDao dao = new EmpDao();
Emp emp = new Emp();
emp.setEname("xjcdjewofn");
emp.setComm(12.0);
emp.setDeptno(5);
emp.setMgr(18);
dao.save(emp);
}
// 更改
@Test
public void test5() {
EmpDao dao = new EmpDao();
Emp emp = dao.findByIdEmp2(5);
emp.setEname("小小");
emp.setMgr(15);
emp.setComm(12.0);
emp.setDeptno(5);
dao.update(emp);
}
// 删除
@Test
public void test6() {
EmpDao dao = new EmpDao();
dao.delete(6);
}
@Test
public void test7() {
EmpDao dao = new EmpDao();
List<Map<String, Object>> list = dao.find(1);
for (Map<String, Object> e : list) {
System.out.println(e.get("ename") + "----" + e.get("mgr"));
}
}
@Test
public void test8() {
SqlSession session = MyBatisUtil.getSession();
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> list = mapper.findAll();
for (Emp emp : list) {
System.out.println(emp.getEname());
}
}
}
使用Mapper映射器(重点)
创建EmpMapper.XML文件进行Mapper映射 与EmpDao文件内容一样不再上传。
需要建一个接口EmpMapper接口,这里方法必须要和EmpMapper.XML文件的方法名一致。在TestCase中最后的方法就是对Mapper的测试。Mapper接口中的方法名要和Sql.xml中的SQL的id保持一致
package com.zhiyou100.util;
import java.util.List;
import java.util.Map;
import com.zhiyou100.Model.Emp;
public interface EmpMapper {
List<Emp> findAll();
int findById(int id);
Emp save(Emp emp);
void update(Emp emp);
void delect (int id);
List <Map<String,Object>> find(int deptno);
}
在SqlMap.xml定义<select>操作时,如果查询结果字段名和JAVA POJO属性不一致时,需要使用<resultMap>元素显示指定映射关系。例如:
现在还是学习过程,会有不对的方面,欢迎大家指出,不喜勿喷!!!