MyBatis之Hello world(Mybatis入门)
MyBatis中文网,超详细的:http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis英文网:http://www.mybatis.org/mybatis-3/
MyBatis的Github:https://github.com/mybatis/mybatis-3
1:创建一个动态web工程
2:导入MyBatils必须的包
MyBatis的使用说明:
asm-3.3.1.jar 【字节码的包】
cglib-2.2.2.jar 【代理包】
commons-logging-1.1.1.jar 【日志包】
log4j-1.2.16.jar
mybatis-3.1.1.jar 【mybatis的核心包】
mysql-connector-java-5.1.40-bin.jar 【mysql的驱动包】
3:创建数据库和数据表,省略,创建实体类
1 package com.bie.mybatis01; 2 /** 3 * @author BieHongLi 4 * @version 创建时间:2017年4月11日 下午2:47:03 5 * 6 */ 7 public class User { 8 9 private Integer id;//用户编号 10 private String name;//用户姓名 11 private int sal;//用户薪资 12 13 public Integer getId() { 14 System.out.println("测试配置文件,确实是调用了user.getId"); 15 return id; 16 } 17 public void setId(Integer id) { 18 this.id = id; 19 } 20 public String getName() { 21 System.out.println("测试配置文件,确实是调用了user.getName"); 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 public int getSal() { 28 System.out.println("测试配置文件,确实是调用了user.getSal"); 29 return sal; 30 } 31 public void setSal(int sal) { 32 this.sal = sal; 33 } 34 public User(Integer id, String name, int sal) { 35 super(); 36 this.id = id; 37 this.name = name; 38 this.sal = sal; 39 } 40 41 42 43 44 }
4:创建MyBatis的工具类:
1 package com.bie.utils; 2 3 import java.io.IOException; 4 import java.io.Reader; 5 import java.sql.Connection; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 12 /** 13 * @author BieHongLi 14 * @version 创建时间:2017年4月11日 下午3:01:22 15 * 工具类 16 */ 17 public class MyBatisUtils { 18 19 //定义私有静态当前线程泛型(SqlSession)对象 20 private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); 21 //定义私有静态sqlSessionFactory 22 private static SqlSessionFactory sqlSessionFactory; 23 24 //静态块,使用该类时,自动加载该静态块 25 //加载位于src目录下面的mybatis.cfg.xml配置文件 26 static{ 27 try { 28 //读取配置文件mybatis.cfg.xml 29 Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml"); 30 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 throw new RuntimeException(e); 34 } 35 } 36 37 //禁止外界通过new方法创建 38 private MyBatisUtils(){} 39 40 //获取SqlSession 41 public static SqlSession getSqlSession(){ 42 //从当前线程中获取SqlSession对象 43 SqlSession sqlSession = threadLocal.get(); 44 //如果SqlSession对象为空 45 if(sqlSession == null){ 46 //在SqlSessionFactory非空的情况下,获取SqlSession对象 47 sqlSession = sqlSessionFactory.openSession(); 48 //将sqlSession对象与当前线程绑定在一起 49 threadLocal.set(sqlSession); 50 } 51 //返回sqlSession对象 52 return sqlSession; 53 } 54 55 //关闭SqlSession与当前线程分开 56 public static void closeSqlSession(){ 57 //从当前线程中获取SqlSession对象 58 SqlSession sqlSession = threadLocal.get(); 59 //如果SqlSession对象非空 60 if(sqlSession != null){ 61 //关闭SqlSession对象 62 sqlSession.close(); 63 //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收 64 threadLocal.remove(); 65 } 66 } 67 68 69 /*public static void main(String[] args) { 70 SqlSession sqlSession = MyBatisUtils.getSqlSession(); 71 Connection con = sqlSession.getConnection(); 72 if(con!=null){ 73 System.out.println("连接成功"); 74 }else{ 75 System.out.println("连接失败"); 76 } 77 78 System.out.println(con!=null?"connection is ok":"connection is fail"); 79 }*/ 80 81 }
5:创建映射文件,放到其包中即可,如UserMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5 <!-- MyBatis的映射配置文件 6 namespace:名称空间,必须唯一 7 --> 8 <!-- <mapper namespace="userNamespace"> --> 9 <mapper namespace="com.bie.mybatis01.User"> 10 11 <!-- 12 resultMap标签:映射实体与表 13 type属性:表示实体全路径名 14 id属性:为实体与表的映射取一个任意名称且唯一的名字 15 --> 16 <resultMap type="com.bie.mybatis01.User" id="userMap"> 17 <!-- id标签映射主键 18 property属性:实体的属性名 19 column属性:表的字段名 20 --> 21 <id column="id" property="id"/> 22 23 <!-- result标签非主键属性 --> 24 <result column="name" property="name"/> 25 <result column="sal" property="sal"/> 26 27 </resultMap> 28 29 <!-- 30 insert标签:要书写insert这么一个sql语句 31 id属性:为insert这么一个sql语句取一个任意唯一的名字 32 --> 33 <insert id="insertId" parameterType="com.bie.mybatis01.User"> 34 insert into user values(2,"张三",1234) 35 </insert> 36 37 <insert id="insertId2" parameterType="com.bie.mybatis01.User"> 38 <!-- 39 可以这样理解,参数的设置,其实#{id} 就等价于#{user.getId()} 40 insert into user values(#{user.getId()},#{user.getName()},#{user.getSal()}); 41 42 --> 43 insert into user values(#{id},#{name},#{sal}) 44 </insert> 45 46 </mapper>
6:创建配置文件,放到src目录下面,如mybatils.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 5 <!-- 1:连接数据库的配置 --> 6 <configuration> 7 8 <!-- 设置一个默认的连接环境信息 --> 9 <environments default="jdbc_developer"> 10 11 <!-- 连接环境信息,取一个任意唯一的名字 --> 12 <environment id="jdbc_developer"> 13 14 <!-- 2:MyBatis使用jdbc事务事务管理方式 --> 15 <transactionManager type="jdbc"></transactionManager> 16 17 <!-- 3:MyBatis使用连接池方式来获取连接 --> 18 <dataSource type="pooled"> 19 20 <!-- 4:配置与数据库交互的4哥必要属性 --> 21 <property name="driver" value="com.mysql.jdbc.Driver"/> 22 <property name="url" value="jdbc:mysql:///test"/> 23 <property name="username" value="root"/> 24 <property name="password" value="123456"/> 25 26 </dataSource> 27 28 </environment> 29 30 </environments> 31 32 33 <!-- 加载映射文件 --> 34 <mappers> 35 <mapper resource="com/bie/mybatis01/UserMapper.xml"/> 36 </mappers> 37 38 </configuration>
7:开始写测试类UserDao进行测试
1 package com.bie.mybatis01; 2 3 import org.apache.ibatis.session.SqlSession; 4 5 import com.bie.utils.MyBatisUtil; 6 import com.bie.utils.MyBatisUtils; 7 8 /** 9 * @author BieHongLi 10 * @version 创建时间:2017年4月11日 下午3:03:54 11 * dao层持久层:数据交互层 12 */ 13 public class UserDao { 14 15 /*** 16 * 用户添加的方法 17 * @param user 18 */ 19 public void insert(){ 20 SqlSession sqlSession = null; 21 try { 22 //sqlSession = MyBatisUtils.getSqlSession(); 23 sqlSession = MyBatisUtil.getSqlSession(); 24 //事务开始(默认) 25 //读取UserMapper.xml映射文件中的SQL语句 26 int i = sqlSession.insert("userNamespace.insertId"); 27 System.out.println("本次操作影响了" + i + "行"); 28 29 //事务提交 30 sqlSession.commit(); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 //事务回滚 34 sqlSession.rollback(); 35 }finally { 36 MyBatisUtils.closeSqlSession(); 37 } 38 39 } 40 41 /*** 42 * 插入带参的方法 43 * @param user 44 */ 45 public void insert2(User user){ 46 SqlSession sqlSession = null; 47 try { 48 //第一首先链接数据库 49 sqlSession = MyBatisUtils.getSqlSession(); 50 //默认打开事务 51 //读取UserMapper.xml映射文件的SQL语句 52 //第一个参数,命名空间.sql的id,d第二个参数是方法的参数user 53 sqlSession.insert("userNamespace.insertId2", user); 54 55 //提交事务 56 sqlSession.commit(); 57 } catch (Exception e) { 58 e.printStackTrace(); 59 //回滚事务 60 sqlSession.rollback(); 61 }finally { 62 //关闭SqlSession 63 MyBatisUtils.closeSqlSession(); 64 } 65 66 } 67 68 public void insert3(User user){ 69 SqlSession sqlSession = null; 70 try { 71 //第一首先链接数据库 72 sqlSession = MyBatisUtils.getSqlSession(); 73 //默认打开事务 74 //读取UserMapper.xml映射文件的SQL语句 75 //第一个参数,命名空间.sql的id,d第二个参数是方法的参数user 76 sqlSession.insert("com.bie.mybatis01.User.insertId2", user); 77 78 //提交事务 79 sqlSession.commit(); 80 } catch (Exception e) { 81 e.printStackTrace(); 82 //回滚事务 83 sqlSession.rollback(); 84 }finally { 85 //关闭SqlSession 86 MyBatisUtils.closeSqlSession(); 87 } 88 89 } 90 91 public static void main(String[] args) { 92 UserDao dao = new UserDao(); 93 //dao.insert(); 94 //dao.insert2(new User(3,"张三",1234)); 95 dao.insert3(new User(4,"张三",1234)); 96 97 98 } 99 100 101 102 }
8:MyBatis的工作流
(a)通过Reader对象读取src目录下面的mybatis.xml配置文件(该配置文件的名称和未知可以任意)
Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
(b)通过SqlSessionFactoryBuilder对象创建 SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
(c)从当前线程中获取SqlSession对象
SqlSession sqlSession = threadLocal.get();
(d)事务开始,在mybatis中默认
(e)通过SqlSession对象读取UserMapper.xml映射文件中的操作编号,从而读取sql语句
int i = sqlSession.insert("userNamespace.insertId");
(f)事务提交,必写
sqlSession.commit();
【注意:不要忘记事务回滚】
(g)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收
MyBatisUtils.closeSqlSession();
时间一分一秒的溜走,让自己做更有意义的事情,奋斗吧,小怪兽~~~
Time passes by, let yourself do more meaningful things, fight it, little monster ~ ~ ~ ~ ~ ~ ~ ~ ~!