MyBatis
一.MyBatis简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层(Dao层)框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二.MyBatis入门配门
入门的几个基本注意点:
1.因为映射资源文件中可能会出现多个数据库的操作,所以可以定义访问资源文件的父路径,<mapper namespace="定义父路径的名称">
2.在测试类中,访问此映射资源文件,需要父路径.操作文件的id名
因为项目在maven中完成,此处添加几点maven的配置详解
1.将本地的Maven配置到myEclipse中-->window-->prefenerces-->MyEclipse-->Maven4MyEclipse-->Maven-->Installations-->选择本 地Maven路径下的路径
2.配置成功
1.创建web Project
2.配置maven项目下的pom.xml(配置自动联网下载jar包)
注(因为是连接数据库的操作,所以要导入连接数据的jar包)
下载网址:maven.aliyun.com
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
3.在src(可自定义包)下创建注mybatis.xml文件
参考网址:http://mybatis.github.io/mybatis-3/zh/getting-started.html
<?xml version="1.0" encoding="UTF-8" ?> <!-- 说明mybatis的根节点 --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--mybatis的根标签configuration --> <configuration> <!-- 资源文件的路径配置 注:cn前面不能用/否则会抛出异常--> <properties resource="cn/et/mybatis/lesson01/jdbc.properties"> </properties> <!-- 配置连接数据库的环境,(开发环境) --> <environments default="development"> <environment id="development"> <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚) --> <transactionManager type="JDBC"/> <!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) --> <dataSource type="POOLED"> <property name="driver" value="${driverClass}"/> <property name="url" value="${url}"/> <property name="username" value="${userAccount}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 包含隐射文件主要用于编写sql语句 --> <mappers> <!-- 隐射的资源文件 隐射文件主要编写sql语句 --> <mapper resource="cn/et/mybatis/lesson01/emp_mapper.xml"/> <!-- 此映射文件直接映射一个接口隐射下的资源文件 --> <mapper resource="cn/et/mybatis/lesson01/inter/dept_mapper.xml"/> <!-- 此映射文件直接映射一个接口,接口直接定义注解,无需定义资源映射文件 --> <mapper class="cn.et.mybatis.lesson01.inter.MassMapper"/> </mappers> </configuration>
4.在src(可定义包)创建测试文件
package cn.et.mybatis.lesson01; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; public class TestMybatis { public static void main(String[] args) throws IOException { //此处表示可从src下查找 //String resource = "org/mybatis/example/mybatis-config.xml"; SqlSession session = getSession(); List<Map> list = session.selectList("helloworld.select"); System.out.println(list.size()); } //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用 private static SqlSession getSession() { String resource="mybatis.xml"; //InputStream inputStream = Resources.getResourceAsStream(resource); //我们可以通过反射来加载配置文件 InputStream inputStream = TestMybatis.class.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开一个新的session对象,操作数据库的类就是SqlSession。 SqlSession session = sqlSessionFactory.openSession(); return session; } // @Test //修改的方法 public void update(){ //事物管理 SqlSession session=getSession(); //调用修改的方法 session.update("updateEmp"); //事物的提交 session.commit(); } // @Test
//定义删除的方法 public void delete(){ SqlSession session = getSession(); session.delete("deleteEmp"); session.commit(); } @Test
//定义插入的方法 public void insert(){ SqlSession session =getSession(); session.insert("insertEmp"); session.commit(); } }
5.在src下(可自定义包)下创建映射资源文件
<?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"> <!-- 此文件主要用于编写sql语句 namespace是为了解决相同名字的sql操作问题 --> <mapper namespace="helloworld"> <!-- id是唯一表示符,用来表示唯一的一条sql语句 resultType用于表示单行数据的数据类型,如数据库单行记录为map类型,所有类型可以指定map 也可是map的全路径名 --> <select id="select" resultType="map"> <!-- select为数据库的查询标签,注意查询语句结束后不能用分号结尾 --> select * from emp </select> <update id="updateEmp"> update emp set sal=sal+1000 where ename='冯' </update> <delete id="deleteEmp"> delete from emp where ename='冯' </delete> <insert id="insertEmp"> insert into emp(ename,empno,sal)values('叼',(select max(empno)from emp)+1,1234) </insert> </mapper>
6.定义数据库连接的资源文件jdbd.properties(连接四要素)
url=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.OracleDriver userAccount=scott password=tiger
以上为MyBatis连接数据库操作的简单入门练习
三.通过接口直接映射Sql
接口映射的几个注意点:
1.定义的接口名必须和映射文件的<mapper namespace="cn.et.mybatis.lesson01.inter.DeptMapper">namepace的文件名一致(namespace名为接口的全路径名)
注意:数据库的返回值类型,resultType的返回值类型(可以是直接返回值得类型,也可以是返回值类型的全路径名)
2. 接口内定义的方法名,必须和映射资源文件中的操作数据库标签的的id名一致,主要有一下几个标签(select<查询标签>,insert<插入标签>,delete<删除标签>,update<修改标签>)
3. 在主xml文件中的mappers<标签中必须引入接口的全路径,(因为用到了接口映射,所以不需要再隐射资源文件的全路径)>
4.在映射文件中的传参问题,可以在查询语句中通过#{0,1}的方式进行传参,若要自定义名称,则需要在接口的方法中定义注解@Param("自定义名"),那么在映射文件中则获取参数要使用自定的名字
1.创建测试类文件
package cn.et.mybatis.lesson01.inter; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; public class TestMybatis { //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用 private static SqlSession getSession() { String resource="mybatis.xml"; //InputStream inputStream = Resources.getResourceAsStream(resource); //我们可以通过反射来加载配置文件 InputStream inputStream = cn.et.mybatis.lesson01.TestMybatis.class.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开一个新的session对象,操作数据库的类就是SqlSession。 SqlSession session = sqlSessionFactory.openSession(); return session; } public static void main(String[] args) throws IOException { SqlSession session = getSession(); //通过动态代理 创建一个实现类 自动调用配置文件 DeptMapper dm = session.getMapper(DeptMapper.class); List<Map> list = dm.selectEmp(); System.out.println(list.size()); } @Test public void mass(){ SqlSession session = getSession(); MassMapper mm = session.getMapper(MassMapper.class); List<Map> sm = mm.selectMass(); System.out.println(sm.size()); } }
2.在src下(可自定义包)下创建映射资源文件(mass_mapper)
<?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"> <!-- 此文件主要用于编写sql语句 此处的namespace的路径为接口映射的接口路径的全路径 --> <mapper namespace="cn.et.mybatis.lesson01.inter.DeptMapper"> <!-- select的id 必须接口的方法名一致 resultType 和接口的返回值的泛型一致 --> <select id="selectEmp" resultType="map"> <!-- select为数据库的查询标签,注意查询语句结束后不能用分号结尾 --> select * from dept </select> </mapper>
3.创建mybatis文件(同上基础学习的3文件)
4.定义接口
package cn.et.mybatis.lesson01.inter; import java.util.List; import java.util.Map; public interface DeptMapper {
//此处的方法名,必须和资源映射文件中的id名一样,否则会报错(<select id="selectEmp" resultType="map">)
public List<Map> selectEmp(); }
四.通过接口直接映射Sql(通过注解)
接口映射通过注解
1.定义接口,定义接口内要操作数据库的方法,在方法上直接加对应注解(@Select(values="select * from mass")) (@select<查询注解>,@insert<插入注解>,@delete<删除注解>,@update<修改注解>)
2.定义主mybatis.xml文件,其中在<mappers>标签中添加注册的类<mapper class="cn.et.接口名"/> 注:此处若是注册的是文件,则是用cn/et/mybatis/dao/emp_mapper.xml 若注册的是个类文件,则使用cn.et.mybatis.dao.emp_mapper.xml
3.定义测试类
1.定义接口
package cn.et.mybatis.lesson01.inter; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Select; public interface MassMapper { //此接口用注解实现 @Select(value = { "select * from mass"}) public List<Map> selectMass(); }
2.定义mybatis.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!-- 说明mybatis的根节点 --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--mybatis的根标签configuration --> <configuration> <!-- 资源文件的路径配置 注:cn前面不能用/否则会抛出异常--> <properties resource="cn/et/mybatis/lesson01/jdbc.properties"> </properties> <!-- 配置连接数据库的环境,(开发环境) --> <environments default="development"> <environment id="development"> <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚) --> <transactionManager type="JDBC"/> <!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) --> <dataSource type="POOLED"> <property name="driver" value="${driverClass}"/> <property name="url" value="${url}"/> <property name="username" value="${userAccount}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 包含隐射文件主要用于编写sql语句 --> <mappers> <!-- 隐射的资源文件 隐射文件主要编写sql语句 --> <!-- 此映射文件直接映射一个接口,接口直接定义注解,无需定义资源映射文件 --> <mapper class="cn.et.mybatis.lesson01.inter.MassMapper"/> </mappers> </configuration>
3.定义测试类
package cn.et.mybatis.lesson01.inter; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; public class TestMybatis { //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用 private static SqlSession getSession() { String resource="mybatis.xml"; //InputStream inputStream = Resources.getResourceAsStream(resource); //我们可以通过反射来加载配置文件 InputStream inputStream = cn.et.mybatis.lesson01.TestMybatis.class.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开一个新的session对象,操作数据库的类就是SqlSession。 SqlSession session = sqlSessionFactory.openSession(); return session; } @Test public void mass(){ SqlSession session = getSession(); MassMapper mm = session.getMapper(MassMapper.class); List<Map> sm = mm.selectMass(); System.out.println(sm.size()); } }