Mybatis(一)

来源:互联网 发布:mac下html5开发工具 编辑:程序博客网 时间:2024/06/10 15:50
回归JDBC开发:
1)优点:简单易学,上手快,非常灵活构建sql,效率高
2)缺点:代码繁琐,难以写出高质量的代码,开发者既要写业务逻辑,又要写对象创建和销毁,必须管底层具体数据库的语法
3)适合于大批量数据的操作,速度快



回归Hibernate单表开发
1)优点:不用写sql,完全以面向对象的方式设计和访问,不用管底层具体数据库的语法
2)缺点:处理复杂业务时,灵活度差,复杂的HQL难写难理解
3)适合中小批量的数据操作,速度慢



什么事mybatis,mybatis有什么特点
1)基于上述二种支持,我们需要在中间找到一个平衡点呢?结合它们的优点,摒弃它们的缺点,
这就是myBatis,现今myBatis被广泛的企业所采用。
2)MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
3)iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和Data Access Objects(DAO)
4)jdbc/dbutils/springdao,hibernate/springorm,mybaits同属于ORM解决方案之一




mybatis快速入门
1)创建一个javaweb工程或java工程
2)导入mybatis和mysql/oracle的jar包到/WEB-INF/lib目录下
3)创建students.sql表
--mysql语法
create table students(
   id int(5) primary key,
   name varchar(10),
   sal double(8,2)
);
4)创建Student.java
public class Student {
private Integer id;
private String name;
private Double sal;
public Student(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
}
5)在entity目录下创建StudentMapper.xml配置文件
《?xml version="1.0" encoding="UTF-8" ?》
《!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"》

《mapper namespace="mynamespace"》
《!-- resultMap标签:映射实体与表 
type属性:实体的全路径名
id属性:为实体与表的映射取一个唯一的编号
--》
《resultMap type="student" id="studentMap"》
《!-- id标签:映射主键属性
result标签:映射非主键属性
    property属性:实体的属性名
    column属性:表的字段名 
--》
《id property="id" column="id"/》
《result property="name" column="name"/》
《result property="sal" column="sal"/》
《/resultMap》
《!-- 
insert标签:要书写insert这么一个sql语句
id属性:为insert这么一个sql语句取一个任意唯一的名字
parameterType:要执行的dao中的方法的参数,如果是类的话,必须使用全路径类
--》
《insert id="add1"》
insert into students(id,name,sal) values(1,'哈哈',7000)
《/insert》
《insert id="add2" parameterType="student"》
insert into students(id,name,sal)values(#{id},#{name},#{sal})
《/insert》
《/mapper》
6)在src目录下创建mybatis.xml配置文件 
《?xml version="1.0" encoding="UTF-8"?》
《!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"》

《configuration》
《!-- 加载类路径下的属性文件 --》
《properties resource="jdbc.properties"/》
《!-- 设置类型别名 --》
《typeAliases》
《typeAlias type="cn.edu.hpu.mybatis.Student"alias="student"/》
《/typeAliases》
《environments default="development"》
《environment id="development"》
《transactionManager type="JDBC"/》
《dataSource type="POOLED"》
《!-- 配置与数据库交互的4个必要属性 --》
《property name="driver" value="${jdbc.driver}"/》
《property name="url" value="${jdbc.url}"/》
《property name="username" value="${jdbc.user}"/》
《property name="password" value="${jdbc.password}"/》
《/dataSource》
《/environment》
《/environments》
《mappers》
《mapperresource="cn/itcast/javaee/mybatis/app05/StudentMapper.xml"/》
《/mappers》
《/configuration》
7)在util目录下创建MyBatisUtil.java类,并测试与数据库是否能连接
public class MyBatisUtil {
private static ThreadLocal《SqlSession》 threadLocal = newThreadLocal《SqlSession》();
private static SqlSessionFactory sqlSessionFactory;
static{
try {
Reader reader =Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = newSqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private MyBatisUtil(){}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.remove();
}
}
public static void main(String[] args) {
Connection conn =MyBatisUtil.getSqlSession().getConnection();
System.out.println(conn!=null?"连接成功":"连接失败");
}
}
8)在dao目录下创建StudentDao.java类并测试
public class StudentDao {
public void add1() throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.insert("mynamespace.add1");
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
public void add2(Student student) throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.insert("mynamespace.add2",student);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
public static void main(String[] args) throws Exception{
StudentDao dao = new StudentDao();
dao.add1();
dao.add2(new Student(2,"呵呵",8000D));
}
}




mybatis工作流程
1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意)
2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
3)从当前线程中获取SqlSession对象
4)事务开始,在mybatis中默认
5)通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句
6)事务提交,必写
7)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收


mybatis配置文件祥解(mybatis.xml)
1)以下是StudentMapper.xml文件,提倡放在与实体同目录下,文件名任意
《?xml version="1.0" encoding="UTF-8" ?》
《!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"》

《mapper namespace="mynamespace"》
《insert id="add1"》
insert into students(id,name,sal) values(1,'哈哈',7000)
《/insert》
《insert id="add2"parameterType="cn.itcast.javaee.mybatis.app05.Student"》
insert into students(id,name,sal)values(#{id},#{name},#{sal})
《/insert》
《/mapper》


mybatis映射文件祥解(StudentMapper.xml)
1)以下是mybatis.xml文件,提倡放在src目录下,文件名任意
《?xml version="1.0" encoding="UTF-8"?》
《!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"》

《configuration》
《environments default="development"》
《environment id="development"》
《transactionManager type="JDBC"/》
《dataSource type="POOLED"》
《property name="driver" value="com.mysql.jdbc.Driver"/》
《property name="url"value="jdbc:mysql://127.0.0.1:3306/mybatis"/》
《property name="username" value="root"/》
《property name="password" value="root"/》
《/dataSource》
《/environment》
《/environments》
《mappers》
《mapperresource="cn/itcast/javaee/mybatis/app05/StudentMapper.xml"/》
《/mappers》
《/configuration》


MybatisUtil工具类的作用
1)在静态初始化块中加载mybatis配置文件和StudentMapper.xml文件一次
2)使用ThreadLocal对象让当前线程与SqlSession对象绑定在一起
3)获取当前线程中的SqlSession对象,如果没有的话,从SqlSessionFactory对象中获取SqlSession对象
4)获取当前线程中的SqlSession对象,再将其关闭,释放其占用的资源
public class MyBatisUtil {
private static ThreadLocal《SqlSession》 threadLocal = newThreadLocal《SqlSession》();
private static SqlSessionFactory sqlSessionFactory;
static{
try {
Reader reader =Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = newSqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private MyBatisUtil(){}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.remove();
}
}
public static void main(String[] args) {
Connection conn =MyBatisUtil.getSqlSession().getConnection();
System.out.println(conn!=null?"连接成功":"连接失败");
}
}


基于MybatisUtil工具类,完成CURD操作
1)StudentDao.java
public class StudentDao {
public void add(Student student) throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.insert("mynamespace.add",student);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MyBatisUtil.closeSqlSession();
}
}
public void update(Student student) throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.update("mynamespace.update",student);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MyBatisUtil.closeSqlSession();
}
}
public Student findById(int id) throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
Student student =sqlSession.selectOne("mynamespace.findById",id);
return student;
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MyBatisUtil.closeSqlSession();
}
}
public List《Student》 findAll() throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
return sqlSession.selectList("mynamespace.findAll");
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MyBatisUtil.closeSqlSession();
}
}
public void delete(Student student) throws Exception{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.delete("mynamespace.delete",student);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MyBatisUtil.closeSqlSession();
}
}
2)StudentMapper.xml
《?xml version="1.0" encoding="UTF-8" ?》
《!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"》

《mapper namespace="mynamespace"》
《insert id="add"parameterType="cn.itcast.javaee.mybatis.app09.Student"》
insert into students(id,name,sal)values(#{id},#{name},#{sal})
《/insert》
《update id="update"parameterType="cn.itcast.javaee.mybatis.app09.Student"》
update students set name=#{name},sal=#{sal} whereid=#{id}
《/update》
《select id="findById" parameterType="int"resultType="cn.itcast.javaee.mybatis.app09.Student"》
select id,name,sal from students where id=#{anything}
《/select》
《select id="findAll"resultType="cn.itcast.javaee.mybatis.app09.Student"》
select id,name,sal from students
《/select》
《delete id="delete"parameterType="cn.itcast.javaee.mybatis.app09.Student"》
delete from students where id=#{id}
《/delete》
《/mapper》


注意:这个insert/update/delete标签只是一个模板,在做操作时,其实是以SQL语句为核心的,即在做增/删/时,insert/update/delete标签可通用,但做查询时只能用select标签,我们提倡什么操作就用什么标签


《!-- 当实体属性与表字段名不相同的时候,必须书写以下代码
   当实体属性与表字段名相同的时候,以下代码可选 
--》
《resultMap type="cn.itcast.javaee.mybatis.app09.Student"id="studentMap"》
《id property="id" column="students_id"/》
《result property="name" column="students_name"/》
《result property="sal" column="students_sal"/》
《/resultMap》


MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key--》value关系),但是resultType跟resultMap不能同时存在。

在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。

①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。

②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
0 0