一、入门程序:

1、mybatis的配置文件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/mybatis?characterEncoding=utf-8" />
15                 <property name="username" value="root" />
16                 <property name="password" value="123" />
17             </dataSource>
18         </environment>
19     </environments>
20     
21     <mappers>
22         <mapper resource="sqlmap/User.xml"/>
23     </mappers>
24 </configuration>
View Code

2、创建对应的映射文件User.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 
 6 <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用-->
 7 <mapper namespace="test">
 8     <!-- 
 9     parameterType:指定输入 参数的类型
10     #{}表示一个占位符号
11     #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
12     resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
13      -->
14     <select id="findUserById" parameterType="int" resultType="com.zhang.domain.User">
15         SELECT * FROM USER WHERE id=#{value}
16     </select>
17     
18     <!-- 根据用户名称模糊查询用户信息,可能返回多条
19     resultType:指定就是单条记录所映射的java对象类型
20     ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
21     使用${}拼接sql,引起 sql注入
22     ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
23      -->
24     <select id="findUserByName" parameterType="java.lang.String" resultType="com.zhang.domain.User">
25         SELECT * FROM USER WHERE username LIKE '%${value}%'
26     </select>
27     
28     <!-- 添加用户 -->
29     <insert id="insertUser" parameterType="com.zhang.domain.User">
30         <!-- 
31         将插入数据的主键返回,返回到user对象中
32         SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用与自增主键
33         keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
34         order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
35         resultType:指定SELECT LAST_INSERT_ID()的结果类型
36          -->
37         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
38             SELECT LAST_INSERT_ID()
39         </selectKey>
40         insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
41         
42         <!-- 
43         使用mysql的uuid()生成主键,首先通过uuid()得到主键,将主键设置到user对象的id属性中。其次在insert执行时,从user对象中取出id属性值
44          -->
45         <!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
46             SELECT uuid()
47         </selectKey>
48         insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
49     </insert>
50     
51     <!-- 删除 用户-->
52     <delete id="deleteUser" parameterType="java.lang.Integer">
53         delete from user where id=#{id}
54     </delete>
55     
56     <!-- 根据id更新用户-->
57     <update id="updateUser" parameterType="com.zhang.domain.User">
58         update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
59         where id=#{id}
60     </update>
61     
62 </mapper>
View Code

3、创建User类

 1 package com.zhang.domain;
 2 
 3 import java.util.Date;
 4 public class User {
 5     
 6     //属性名和数据库表的字段对应
 7     private int id;
 8     private String username;// 用户姓名
 9     private String sex;// 性别
10     private Date birthday;// 生日
11     private String address;// 地址
12     public int getId() {
13         return id;
14     }
15     public void setId(int id) {
16         this.id = id;
17     }
18     public String getUsername() {
19         return username;
20     }
21     public void setUsername(String username) {
22         this.username = username;
23     }
24     public String getSex() {
25         return sex;
26     }
27     public void setSex(String sex) {
28         this.sex = sex;
29     }
30     public Date getBirthday() {
31         return birthday;
32     }
33     public void setBirthday(Date birthday) {
34         this.birthday = birthday;
35     }
36     public String getAddress() {
37         return address;
38     }
39     public void setAddress(String address) {
40         this.address = address;
41     }
42     @Override
43     public String toString() {
44         return "User [id=" + id + ", username=" + username + ", sex=" + sex
45                 + ", birthday=" + birthday + ", address=" + address + "]";
46     }
47 
48 
49 }
View Code

4创建测试类

  1 package com.zhang.test;
  2 
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.util.Date;
  6 import java.util.List;
  7 
  8 import org.apache.ibatis.io.Resources;
  9 import org.apache.ibatis.session.SqlSession;
 10 import org.apache.ibatis.session.SqlSessionFactory;
 11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 12 import org.junit.Before;
 13 import org.junit.Test;
 14 
 15 import com.zhang.domain.User;
 16 
 17 public class TestMy {
 18 
 19     //会话工厂
 20     private SqlSessionFactory sqlSessionFactory;
 21     @Before
 22     public void createSqlSessionFactory() throws IOException  {
 23         // 配置文件
 24         String resource = "SqlMapConfig.xml";
 25         InputStream inputStream = Resources.getResourceAsStream(resource);
 26         // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
 27         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 28     }
 29 
 30     // 根据 id查询用户信息
 31     @Test
 32     public void testFindUserById() {
 33         // 数据库会话实例
 34         SqlSession sqlSession = null;
 35         try {
 36             // 创建数据库会话实例sqlSession
 37             sqlSession = sqlSessionFactory.openSession();
 38             // 查询单个记录,根据用户id查询用户信息
 39             User user = sqlSession.selectOne("test.findUserById", 10);
 40             // 输出用户信息
 41             System.out.println(user);
 42         } catch (Exception e) {
 43             e.printStackTrace();
 44         } finally {
 45             if (sqlSession != null) {
 46                 sqlSession.close();
 47             }
 48         }
 49 
 50     }
 51 
 52     // 根据用户名称模糊查询用户信息
 53     @Test
 54     public void testFindUserByUsername() {
 55         // 数据库会话实例
 56         SqlSession sqlSession = null;
 57         try {
 58             // 创建数据库会话实例sqlSession
 59             sqlSession = sqlSessionFactory.openSession();
 60             // 查询单个记录,根据用户id查询用户信息
 61             List<User> list = sqlSession.selectList("test.findUserByName", "");
 62             System.out.println(list.size());
 63         } catch (Exception e) {
 64             e.printStackTrace();
 65         } finally {
 66             if (sqlSession != null) {
 67                 sqlSession.close();
 68             }
 69         }
 70 
 71     }
 72 
 73     // 添加用户信息
 74     @Test
 75     public void testInsert() {
 76         // 数据库会话实例
 77         SqlSession sqlSession = null;
 78         try {
 79             // 创建数据库会话实例sqlSession
 80             sqlSession = sqlSessionFactory.openSession();
 81             // 添加用户信息
 82             User user = new User();
 83             user.setUsername("张小明");
 84             user.setAddress("河南郑州");
 85             user.setSex("1");
 86             user.setBirthday(new Date());
 87             sqlSession.insert("test.insertUser", user);
 88             //提交事务
 89             sqlSession.commit();
 90         } catch (Exception e) {
 91             e.printStackTrace();
 92         } finally {
 93             if (sqlSession != null) {
 94                 sqlSession.close();
 95             }
 96         }
 97     }
 98 
 99     // 根据id删除用户
100     @Test
101     public void testDelete() {
102         // 数据库会话实例
103         SqlSession sqlSession = null;
104         try {
105             // 创建数据库会话实例sqlSession
106             sqlSession = sqlSessionFactory.openSession();
107             // 删除用户
108             sqlSession.delete("test.deleteUser",26);
109             // 提交事务
110             sqlSession.commit();
111         } catch (Exception e) {
112             e.printStackTrace();
113         } finally {
114             if (sqlSession != null) {
115                 sqlSession.close();
116             }
117         }
118     }
119 
120     // 更新用户信息
121     @Test
122     public void testUpdate() {
123         // 数据库会话实例
124         SqlSession sqlSession = null;
125         try {
126             // 创建数据库会话实例sqlSession
127             sqlSession = sqlSessionFactory.openSession();
128             // 添加用户信息
129             User user = new User();
130             user.setId(16);
131             user.setUsername("小明");
132             user.setAddress("河南郑州");
133             user.setSex("1");
134             user.setBirthday(new Date());
135             sqlSession.update("test.updateUser", user);
136             // 提交事务
137             sqlSession.commit();
138         } catch (Exception e) {
139             e.printStackTrace();
140         } finally {
141             if (sqlSession != null) {
142                 sqlSession.close();
143             }
144         }
145     }
146 }
View Code

5、整个工程目录结构

 

二、相关知识点:

1、#{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值
 
2、parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
 
3、selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
 selectList可以查询一条或多条记录。
 
4、Mybatis解决jdbc编程的问题

数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在XXXX.xml文件中与java代码分离。

向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

5、与hibernate不同

hibernate是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。
应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。
mybatis专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:适用与需求变化较多的项目,比如:互联网项目。

 资源下载链接:http://download.csdn.net/detail/u013865056/9906989

posted on 2017-07-21 22:55  zhangjinru123  阅读(166)  评论(0编辑  收藏  举报