Mybatis笔记 – 入门程序开发
一、Mybatis开发环境
JDK:jdk_1.7
Eclipse:Oxygen.1 Release (4.7.1)
MySQL:MySQL Servr 5.7
1、添加相关ja r包
mybatis的jar包可以从https://github.com/mybatis/mybatis-3/releases下载,下载的解压包中包含了核心包(mybatis-*.jar)、使用手册(mybatis-*.pdf)、相关依赖包(lib)等。
使用eclipse创建Dynamic Web project 工程,在lib文件夹中加入Mybatis的核心包、依赖包和数据库驱动包等相关包,并将jar包add to bulid path中。
图1-1-1 复制jar包到lib目录 图 1-1-2 Add to bulid path
2、相关配置文件
在工程中新建Source Folder类型的config文件夹,用于存放Mybatis的数据库连接信息、日志、SqlMapConfig等相关配置文件。
(1)log4j.properties
mybatis默认使用log4j作为输出日志信息。
1 # Global logging configuration 2 #在开发环境下日志级别要设置成DEBUG,生成环境设置成info或error 3 log4j.rootLogger=DEBUG
, stdout 4 # Console output... 5 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 6 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 7 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
(2)建立映射文件
在config/sqlmap目录下创建sql映射文件emp.xml,可以通过nameplace引用具体的SQL标签。
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 <mapper namespace="test"> 6 </mapper>
(3)SqlMapConfig.xml
SqlMapConfig.xml是mybatis用于配置数据源、事务管理的核心配置文件。
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 <!-- 和spring整合后 environments配置将废除--> 7 <environments default="development"> 8 <environment id="development"> 9 <!-- 使用jdbc事务管理--> 10 <transactionManager type="JDBC" /> 11 <!-- 数据库连接池--> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" value="jdbc:mysql://localhost:3306/ 15 scott?characterEncoding=utf-8" /> 16 <property name="username" value="root" /> 17 <property name="password" value="su486213" /> 18 </dataSource> 19 </environment> 20 </environments> 21 <!-- 加载映射文件 --> 22 <mappers> 23 <mapper resource="SqlMap/emp.xml"/> 24 </mappers> 25 </configuration>
3、po类
po类用于mybatis进行sql映射,属性与数据库表中的字段需要相对应。
1 package po; 2 import java.util.Date; 3 public class Emp { 4 private int empno; 5 private String ename; 6 private String job; 7 private int mgr; 8 private Date hiredate; 9 private double sal; 10 private double comm; 11 private int deptno; 12 set/get() ...; 13 }
4、会话工厂
1 package Test; 2 //请导入所需的java类 3 public class Mybatis_first { 4 //使用 单例模式 创建会话工厂 5 private SqlSessionFactory sqlSessionFactory; 6 @Before 7 public void createSqlSessionFactory() throws IOException { 8 // Mybatis配置文件 9 String resource = "SqlMapConfig.xml"; 10 // 得到配置文件流 11 InputStream inputStream = Resources.getResourceAsStream(resource); 12 // 创建会化工厂,传入Mybatis配置文件信息 13 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 14 } 15 //测试类 16 @Test 17 }
二、Junit单元测试
1、根据id获取员工信息
(1)映射文件
1 <select id="findEmpById" parameterType="int" resultType="po.Emp"> 2 select * from emp where empno = #{empno} 3 </select>
(2)测试程序
1 @Test 2 public void testFindEmpById() { 3 // 数据库会话实例 4 SqlSession sqlSession = null; 5 try { 6 // 创建数据库会话实例sqlSession 7 sqlSession = sqlSessionFactory.openSession(); 8 // 根据部门id查询单个记录,如果使用selectOne查询多条记录则抛出异常: 9 Emp dept = sqlSession.selectOne("test.findEmpById", 7369); 10 // 输出用户信息 11 System.out.println(dept); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } finally { 15 if (sqlSession != null) { 16 sqlSession.close(); 17 } 18 } 19 }
(3)运行结果
2、根据员工姓名模糊查询员工信息
(1)映射文件
1 <select id="findEmpByEmpname" parameterType="java.lang.String" resultType="po.Emp"> 2 select * from emp where ename like '%${value}%' 3 </select>
(2)测试程序
1 @Test 2 public void testFindEmpByEmpname() { 3 // 数据库会话实例 4 SqlSession sqlSession = null; 5 try { 6 // 创建数据库会话实例sqlSession 7 sqlSession = sqlSessionFactory.openSession(); 8 // 查询一条或多条记录,根据用户id查询用户信息 9 List<Emp> list = sqlSession.selectList("test.findEmpByEmpname", "TH"); 10 System.out.println(list.size()); 11 } catch (Exception e) { 12 e.printStackTrace(); 13 } finally { 14 if (sqlSession != null) { 15 sqlSession.close(); 16 } 17 } 18 19 }
(3)运行结果
3、添加员工信息
(1)映射文件
1 <insert id="insertEmp" parameterType="po.Emp"> 2 <selectKey keyProperty="empno" order="AFTER" resultType="java.lang.Integer"> 3 select LAST_INSERT_ID()//返回自增主键 4 </selectKey> 5 insert into emp(ename,job) values(#{ename},#{job}) 6 </insert>
(2)测试程序
1 @Test 2 public void testInsert() { 3 // 数据库会话实例 4 SqlSession sqlSession = null; 5 try { 6 // 创建数据库会话实例sqlSession 7 sqlSession = sqlSessionFactory.openSession(); 8 // 添加员工信息(empno是自增主键) 9 Emp emp = new Emp(); 10 emp.setEname("admin"); 11 emp.setJob("test"); 12 sqlSession.insert("test.insertEmp", emp); 13 //提交事务 14 sqlSession.commit(); 15 //返回自增主键 16 System.out.println(emp.getEmpno()); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } finally { 20 if (sqlSession != null) { 21 sqlSession.close(); 22 } 23 } 24 }
(3)运行结果
4、更新员工信息
(1)映射文件
1 <delete id="deleteEmpById" parameterType="int"> 2 delete from emp where empno=#{empno} 3 </delete>
(2)测试程序
1 @Test 2 public void testUpdate() { 3 // 数据库会话实例 4 SqlSession sqlSession = null; 5 try { 6 // 创建数据库会话实例sqlSession 7 sqlSession = sqlSessionFactory.openSession(); 8 // 添加员工信息 9 Emp emp = new Emp(); 10 emp.setEmpno(7938); 11 emp.setEname("admin1"); 12 emp.setJob("tes2t"); 13 sqlSession.update("test.updateEmp", emp); 14 // 提交事务 15 sqlSession.commit(); 16 } catch (Exception e) { 17 e.printStackTrace(); 18 } finally { 19 if (sqlSession != null) { 20 sqlSession.close(); 21 } 22 } 23 }
(3)运行结果
5、删除员工信息
(1)映射文件
1 <update id="updateEmp" parameterType="po.Emp"> 2 update emp set ename=#{ename},job=#{job} where empno=#{empno} 3 </update>
(2)测试程序
1 @Test 2 public void testDelete() { 3 // 数据库会话实例 4 SqlSession sqlSession = null; 5 try { 6 // 创建数据库会话实例sqlSession 7 sqlSession = sqlSessionFactory.openSession(); 8 // 删除员工 9 sqlSession.delete("test.deleteEmpById",7941); 10 // 提交事务 11 sqlSession.commit(); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } finally { 15 if (sqlSession != null) { 16 sqlSession.close(); 17 } 18 } 19 }
(3)运行结果