框架第十六天

mybatis框架
MyBatis是一个数据持久层(ORM)框架。把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

mybatis的优点:
1.基于SQL语法,简单易学。
2.能了解底层组装过程。
3.SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
4.程序调试方便。

hibernate、MyBatis、JDBC区别:
1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。

2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,实现数据表的完整性控制;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,放弃了对数据表的完整性控制,但是获得了更灵活和响应性能更快的优势。

3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。

hibernate、MyBatis区别:
MyBatis
1、是一个SQL语句映射的框架(工具)
2、注重POJO与SQL之间的映射关系。不会为程序员在运行期自动生成 SQL
3、自动化程度低、手工映射SQL,灵活程度高.
4、需要开发人员熟炼掌据SQL语句
Hibernate
1、主流的ORM框架、提供了从 POJO 到数据库表的全套映射机制
2、会自动生成全套SQL语句。
3、因为自动化程度高、映射配置复杂,api也相对复杂,灵活性低.
4、开发人同不必关注SQL底层语句开发

mybatis开发步骤:
1、创建一个java工程或web工程(整合)
2、导入mybatis对应的jar文件
3、开发并配置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>
    <!-- 配置mysql数据库的连接环境 -->
    <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/stu?useUnicode=true&characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers><!--  映射器 -->
        <mapper resource=""/>
    </mappers>
</configuration>
4、开发和表中的字段一致的bean 对象
5、开发接口
6、开发SQL映射文件
7、测试

下面就是具体的开发步骤:
1、创建一个java工程或web工程(整合)
2、导入mybatis对应的jar文件
如果不是整合就用两个jar包就行了,如果要整合ssm就需要再加一个jar包如图箭头所示


mybatis的jar包.png

3、开发并配置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>
<!-- 配置mysql数据库的连接环境 -->
<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/stu?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="huayu123"/>
</dataSource>
</environment>
</environments>
<mappers><!--  映射文件-->
<mapper resource="com/hw/mapper/studentDaoMapper.xml"/>
</mappers>
</configuration>

4、开发和表中的字段一致的bean 对象


entity类.png

{entity类.png

5、开发接口

package com.hw.dao;

import java.util.List;

import com.hw.entity.Student;
public interface StudentDao {
    public void addStudent(Student stu);//添加
    public void updateStudent(Student stu);//修改
    public void delStudent(int id);//删除学生
    public Student getStudent(int id);//由id获取单个用户
    public int getCount();//统计总计录数
    public List<Student> listAll();//查询所有
    public List<Student> listPage(int currentPage,int pageSize);//查询所有且有分页
    public List<Student> listLikeAll(String name);//模糊查询指定名
    public List<Student> listLikePage(int currentPage,int pageSize,String name);///模糊查询指定名且有分页
    public int getLikeCount(String name);//统计模糊查询总计录数
}

6、开发SQL映射文件(原来的实现类impl用映射文件代替了)

<?xml version="1.0" encoding="UTF-8"?><!-- 相当于实现impl -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hw.dao.StudentDao"><!-- namespace="qq"如果和spring整合时要用接口全类名 不整合无所谓 -->
<resultMap type="com.hw.entity.Student" id="stuinfo"><!-- id="stuinfo"如果不用resultMap则不写 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="money" property="money"/>
<result column="jobtime" property="jobtime" javaType="java.sql.Date" jdbcType="DATE"/>
</resultMap>
<!-- id="listAll"  id要取接口的方法名   这样代码结构清晰 比较规范 不混乱-->
<select id="listAll"  resultMap="stuinfo">
select * from stu
</select>
<!-- resultType返回结果类型 -->
<select id="getCount" resultType="int">
select count(id) from stu
<!-- resultMap返回map集合 -->
</select>
<select id="listLikeAll" resultMap="stuinfo" parameterType="string">
<!-- select * from stu where name like '%${value}%' -->
select * from stu where name like #{name}
</select>
<!-- parameterType参数类型 -->
<insert id="addStudent" parameterType="com.hw.entity.Student">
<!-- #{money}解析成"money" -->
insert into stu values(null,#{name},#{money},#{jobtime})
</insert>
<delete id="delStudent" parameterType="int">
delete from stu where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.hw.entity.Student">
update stu set name=#{name},money=#{money},jobtime=#{jobtime} where id=#{id}
</update>
<select id="getStudent" resultMap="stuinfo">
select * from stu where id=#{id}
</select>
<select id="getLikeCount" resultType="int">
select count(id) from stu where name like #{name}
</select>
<select id="listPage" resultMap="stuinfo" parameterType="map">
select * from stu limit #{currentPage},#{pageSize}
</select>
<select id="listLikePage" resultMap="stuinfo" parameterType="map">
select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}
</select>
</mapper>

上面主要是#和$的区别要注意:

MyBatis/Ibatis中#和$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.  
6.一般能用#的就别用$. 

还有就是时间转换需要在配置文件中添加javaType="java.sql.Date" jdbcType="DATE"
前面是指数据库查询出来的时间转换成Java类型 后面是数据库连接的类型 一般类型要数据库表中对应得字段类型一致

最后就是测试类了

package com.hw.test;

import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hw.entity.Student;

public class Test3 {
 public static void main(String[] args) throws Exception {
     //mybatis读取配置文件
      Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    // 创建工厂模式SqlSessionFactory
      SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //创建session
      SqlSession session = sessionFactory.openSession();
    
      Map<String ,Object> map=new HashMap<String, Object>();
    /* int currentPage=1;
     int pageSize=3;
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);
     List<Student> selectList = session.selectList("listPage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    }*/
     int currentPage=1;
     int pageSize=3;
     map.put("name", "张");
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);      
     List<Student> selectList = session.selectList("listLikePage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    } 
}
}

分页模糊查询 需要注意的是测试类传入的参数是map

<select id="listLikePage" resultMap="stuinfo" parameterType="map">select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}</select>

为什么是map 因为我在映射文件里面写的sql语句有三个需要传参的(name,currentPage,pageSize) 所以我在上面写的是 parameterType="map" 就是通过键值对的方式把值传到sql语句里面


map存值.png

sesssion对象查找对应id 并把map对象传到映射文件 再通过键值对的方式给相应的值

List<Student> selectList = session.selectList("listLikePage", map);

相关源码:

链接:http://pan.baidu.com/s/1kVsepwF 密码:rbiq

推荐阅读更多精彩内容

  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 3,847评论 4 27
  • 说起目标,不知道大家什么感觉,我以前更多的是逃避,混乱,或者说是迷茫毫无目标感。那个时候真的很羡慕那些知道自己想要...
    暮夜之歌阅读 309评论 0 1
  • NBN的故事55:装上追踪器 时间:9000年2月25日 地点:宇宙 甲比安快速地回了月球。“我需要追踪器,我...
    我我了阅读 32评论 1 1