mybatis之入门
一、mybatis介绍
是apache旗下的一个开源的顶级ORM框架(做dao层的操作)
开始叫ibatis在2010年经过升级后发布到google code上就改名为mybatis
定位:1.是一个做持久层操作的框架
2.是一个半自动的ORM框架
二、原生态的jdbc存在的问题
问题一:频繁的创建和销毁连接,造成了资源浪费,影响了系统的性能。
解决方案设想:连接池(c3p0、dbcp、阿里巴巴)
问题二:sql语句硬编码(写死了)
解决方案设想:将sql语句写入到mapper.xml文件中
问题三:sql语句中的参数硬编码
解决方案设想:将sql语句中参数写入到mapper.xml文件中
问题四:查询的结果返回的是一个结果集,而我们更希望返回是对象
解决方案设想:查询后自动返回对象
三、mybatis的原理(核心)
四、mybatis环境搭建
4.1、准备开发环境
1、创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示:
2、添加相应的jar包(mybatis的核心包+依赖jar包+mysql驱动包)
也要在src文件里添加log4j的配置文件,用于显示执行记录
3、创建数据库和表,针对MySQL数据库
请自己按照实体类(pojo)进行编写数据库
4.2、使用MyBatis查询表中的数据的配置
1、添加Mybatis的配置文件SqlMapConfig.xml
在src目录下创建一个SqlMapConfig.xml文件,如下图所示:
SqlMapConfig.xml文件中的内容如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <properties resource="basedao.properties"></properties> 8 <environments default="development"> 9 <environment id="development"> 10 <transactionManager type="JDBC" /> 11 <dataSource type="POOLED"> 12 <property name="driver" value="${driver}" /> 13 <property name="url" value="${url}" /> 14 <property name="username" value="${user}" /> 15 <property name="password" value="${password}" /> 16 </dataSource> 17 </environment> 18 </environments> 19 <!-- 加载mapper.xml文件 --> 20 <mappers> 21 <package name="org.maven.mapper"/> 22 </mappers> 23 </configuration>
将basedao.properties文件放到src目录下:
2、定义表所对应的实体类,如下图所示:
User类的代码如下:
1 package org.java.pojo; 2 3 /** 4 * 1.请各位在入门的时候实体类中字段名和数据库中表的列名对应(不区分大小写)--讲解输出映射的时候解释 5 * 2.在ssm框架开发过程中,所有的日期类型请使用java.util.Date;因为这样才能在springMVC中参数绑定 6 */ 7 public class User { 8 private Integer id; 9 private String name; 10 private String password; 11 //GET,set请自行添加 12 }
3、定义操作users表的sql映射文件userMapper.xml
创建一个包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:
userMapper.xml文件的内容如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- namespace:名字空间 6 如果在ibatis的开发中可以随便写,但是在mybatis的开发中有特殊含义,必须为对应接口的全限定名 7 --> 8 <mapper namespace="org.java.mapper.UserMapper"> 9 10 </mapper>
4、在SqlMapConfig.xml文件中加载userMapper.xml文件
四、mybatis入门程序
1、在userMapper.xml里编写增删改查
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:名字空间 如果在ibatis的开发中可以随便写,但是在mybatis的开发中有特殊含义,必须为对应接口的全限定名 --> <mapper namespace="org.java.mapper.UserMapper"> <!-- 1.根据主键查询 select:用来查询的statement(标签) id:用来唯一的标识该mapper里面的statement(标签) parameterType:输入参数的类型 #{}:占位符,如果输入参数类型为简单类型,那么#{可以写任意的名字} resultType:返回结果的类型(即返回类型的全限定名) --> <select id="getById" parameterType="Integer" resultType="org.java.pojo.User"> SELECT * FROM USER WHERE id= #{abc} <!-- 根据姓名做模糊查询 要用占位符是:${},如果查询是简单类型,必须为${value} 但存在sql注入问题--> </select> <select id="getByName" parameterType="String" resultType="org.java.pojo.User"> SELECT * FROM USER WHERE name like '%${name}%' </select> </mapper>
2.在对应的接口类里添加对应的方法:
package org.java.mapper; import java.util.List; import org.java.pojo.User; public interface UserMapper { /* * 方法名必须和对应的xml里statement标签id名一致 * 输入参数类型和返回类型也要和标签里的一致 */ User getById(Integer id); //根据姓名做模糊查询 List<User> getByName(String name); }
3.使用junit进行测试
package org.java.mapper; import static org.junit.Assert.*; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.java.pojo.User; import org.java.tools.myUtils; import org.junit.Before; import org.junit.Test; public class UserMapperTest { SqlSession sqlSession =null; UserMapper userMapper=null; @Before //执行任何方法时先执行该方法 public void upset() throws Exception{ sqlSession=myUtils.getsqlsession(); userMapper=sqlSession.getMapper(UserMapper.class); } @Test public void testGetById() { System.out.println(userMapper.getById(1).getName()); } @Test public void testGetByName() { List<User> list=userMapper.getByName("a"); System.out.println(list.size()); } }
测试结果