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包如图箭头所示
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 对象
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语句里面
sesssion对象查找对应id 并把map对象传到映射文件 再通过键值对的方式给相应的值
List<Student> selectList = session.selectList("listLikePage", map);
相关源码:
链接:http://pan.baidu.com/s/1kVsepwF 密码:rbiq