之前写过一篇关于ibatis的文章,这两天学习了mybatis.
Ibatis本是apache的一个开源项目,2010年这个项目由apache software foundation 迁移到了google code,并且改名为mybatis.
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录.mybatis对数据库的操作有两种方式:配置文件和注解.下面就详细介绍用这两种方式.无论哪种方式,都得首先配置最主要的配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 文档申明 --> 3 <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.1//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> 4 <configuration> 5 <!-- 引入properties文件 --> 6 <properties resource="com/zhouxy/ibatis/DBInfo.properties"/> 7 8 <!-- 类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关,只用来减少类完全限定名的多余部分. --> 9 <!-- 使用这个配置, “Student”可以任意用来替代“com.zhouxy.ibatis.Student”所使用的地方。 --> 10 <typeAliases> 11 <typeAlias type="com.zhouxy.ibatis.Student" alias="Student"/> 12 </typeAliases> 13 14 <environments default="development"><!-- 默认的环境ID --> 15 <environment id="development"> 16 <transactionManager type="JDBC"/><!-- 事务管理器的配置 [JDCB或者MANAGED]--> 17 <dataSource type="POOLED"> <!-- 数据源的配置 --> 18 <property name="driver" value="${driver}"/> <!-- 将DBInfo.properties文件中的属性绑定 --> 19 <property name="url" value="${url}"/> 20 <property name="username" value="${username}"/> 21 <property name="password" value="${password}"/> 22 </dataSource> 23 </environment> 24 </environments> 25 <!-- mybatis的行为配置以上的就可以,详细的可以参看mybatis的参看文档, --> 26 27 <!-- 既然这些都配置好了,现在就要定义SQL的映射语句了,下面语句就是告诉mybatis去哪儿找映射文件 --> 28 <mappers> 29 <mapper resource="com/zhouxy/ibatis/Student.xml"/> 30 </mappers> 31 32 </configuration>
DBInfo.properties文件:
1 driver=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/ibatis 3 username=root 4 password=root
Student.xml文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 这个文件是一个关键,映射了所有的DAO操作方法(HIBERNATE是映射实体,IBATIS映射方法) --> 3 <!-- 文档申明 --> 4 <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.1//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 5 <mapper namespace="com.zhouxy.ibatis.StudentDao"> <!-- 这个命名空间非常重要,UserDAO是一个接口 --> 6 7 <sql id="studentColumns">name,age</sql> <!-- 定义sql语句中要查找的列,之后根据id使用. --> 8 9 <!-- 查找全部学生 --> 10 <select id="selectAllStudent" resultType="Student"> <!--这个id非常重要,在DAO中,直接使用命名空间.ID来对应这个SQL语句 --> 11 select * from student 12 </select> 13 14 <!-- 删除指定的学生 --> 15 <delete id="deleteStudentById" parameterType="java.lang.Integer"> 16 delete from student where id = #{id} 17 </delete> 18 19 <!-- 新增学生 --> 20 <insert id="insertStudent" parameterType="Student" keyProperty="id" useGeneratedKeys="true"> 21 insert into student(name,age) values(#{name},#{age}) 22 </insert> 23 24 <!-- 根据ID查找指定的学生 --> 25 <select id="selectStudentById" parameterType="int" resultType="Student"> 26 select <include refid="studentColumns"/> <!-- 使用了前面定义要查找的列 --> 27 from student where id = #{id} 28 </select> 29 30 <!-- 更新学生信息 --> 31 <update id="updateStudentById" parameterType="int"> 32 update student set name = #{name},age=#{age} 33 where id = #{id} 34 </update> 35 36 <!-- 模糊查询 --> 37 <select id="selectStudentByName" parameterType="String" resultType="Student"> 38 select <include refid="studentColumns"/> 39 from student 40 where name like <!-- concat(concat(‘%‘,#{name}),‘%‘) --> "%"#{name}"%" 41 </select> 42 </mapper>
每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。SqlSessionFactory本身是由SqlSessionFactoryBuilder创建的,一般而言,在一个应用中,一个数据库只会对应一 个SqlSessionFactory,所以一般我们都把SqlSessionFactory定义成单例模式,或通过Spring等进行注入。下面是我封装的获取SqlSessionFactory对象。
1 package com.zhouxy.ibatis; 2 3 import java.io.IOException; 4 import java.io.Reader; 5 6 import org.apache.ibatis.io.Resources; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 11 /** 12 * 该类获取SqlSessionFactory对象. 13 * @author zhouxy 14 * 15 */ 16 public class SessionFactoryUtils { 17 private final static String source = "com/zhouxy/ibatis/SqlMapConfig.xml"; //要解析的总配置文件路径 18 private static SqlSessionFactory sqlSessionFactory = null; 19 20 public static SqlSessionFactory getSqlSessionFactory(){ 21 22 Reader reader = null; 23 24 try { 25 reader = Resources.getResourceAsReader(source); //mybatis封装的解析文件的方法.更多方法参看mybatis的参考文档 26 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //获得sqlsessionfactory对象 27 28 reader.close(); //关闭读入流. 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } 32 33 return sqlSessionFactory; 34 } 35 }
对应的JavaBean:
1 package com.zhouxy.ibatis; 2 3 public class Student { 4 private int id; 5 private String name; 6 private int age; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getAge() { 20 return age; 21 } 22 public void setAge(int age) { 23 this.age = age; 24 } 25 public Student() { 26 super(); 27 } 28 29 public Student(String name,int age){ 30 this.name = name; 31 this.age = age; 32 } 33 34 public Student(int id, String name, int age) { 35 super(); 36 this.id = id; 37 this.name = name; 38 this.age = age; 39 } 40 @Override 41 public String toString() { 42 String string = "id="+id+"\tname="+name+"\tage="+age; 43 44 return string; 45 } 46 }
封装增删改查等方法:
1 package com.zhouxy.ibatis; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 8 public class StudentDAOIbatis{ 9 10 //获得SqlSession对象 11 public static SqlSession getSqlSession(){ 12 SqlSessionFactory sqlSessionFactory = SessionFactoryUtils.getSqlSessionFactory(); 13 SqlSession sqlSession = sqlSessionFactory.openSession(); 14 15 return sqlSession ; 16 } 17 18 //通过获得的sqlsession对象,进行对数据库的操作:增删改查 19 public static void deleteStudentById(int id){ 20 SqlSession sqlsession = getSqlSession(); 21 sqlsession.delete("com.zhouxy.ibatis.StudentDao.deleteStudentById", id);//引号里面的内容是student.xml文件中mapper定义的namespace 22 //以及自定义的相应操作的id 23 sqlsession.commit(); //提交事务,必须提交 24 sqlsession.close(); //在使用mybatis的过程中每一个操作都是离不开SqlSession的,所以获取SqlSession是相当重要的。 25 //此外,SqlSession是不能被共享、线程不安全的,所以在每次需要SqlSession的时候都应该打开一个,然后在用完了之后再把它关上 26 } 27 28 29 //insert方法返回插入数据库时改记录对应主键的值.当然需要在Student.xml文件中将useGeneratedKeys设置为true 30 public static int insertStudent(Student student){ 31 int id = 0; 32 SqlSession sqlsession = getSqlSession(); 33 id = sqlsession.insert("com.zhouxy.ibatis.StudentDao.insertStudent",student); 34 sqlsession.commit(); 35 sqlsession.close(); 36 37 return id; 38 } 39 40 public static List<Student> getAllStudent(){ 41 SqlSession sqlsession = getSqlSession(); 42 List<Student> studentList = sqlsession.selectList("com.zhouxy.ibatis.StudentDao.selectAllStudent"); 43 sqlsession.commit(); 44 sqlsession.close(); 45 46 return studentList; 47 } 48 49 public static Student getStudentById(int id){ 50 SqlSession sqlsession = getSqlSession(); 51 Student student = sqlsession.selectOne("com.zhouxy.ibatis.StudentDao.selectStudentById",id); 52 sqlsession.commit(); 53 sqlsession.close(); 54 55 return student; 56 57 } 58 59 60 //update方法返回受影响的记录数 61 public static int updateStudentById(Student student){ 62 SqlSession sqlsession = getSqlSession(); 63 int effectrows = sqlsession.update("com.zhouxy.ibatis.StudentDao.updateStudentById", student); 64 65 sqlsession.commit(); 66 sqlsession.close(); 67 68 return effectrows; 69 } 70 71 public static List<Student> getStudentByName(String name){ 72 SqlSession sqlsession = getSqlSession(); 73 List<Student> studentList = sqlsession.selectList("com.zhouxy.ibatis.StudentDao.selectStudentByName",name); 74 sqlsession.commit(); 75 sqlsession.close(); 76 77 return studentList; 78 79 } 80 }
测试(仅举一例):
1 package com.zhouxy.ibatis; 2 3 import static java.lang.System.*; 4 5 import java.util.List; 6 7 public class Test { 8 public static void main(String[] args) { 9 List<Student> studentList = StudentDAOIbatis.getStudentByName("张"); 10 for(Student student : studentList){ 11 out.println(student.toString()); 12 } 13 } 14 }
结果:
以上介绍了使用配置文件进行对数据库的操作,在《mybatis基本操作(二)》会介绍使用注解对数据库进行相关的操作.希望大家提出不足!
时间: 2024-10-05 04:59:57