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 ~ ~ ~ ~ ~ ~ ~ ~ ~!