一 mybatis快速入门

什么是MyBatis

 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索。

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

 ibatis=mybatis

和Hibernate对比

搭建MyBatis开发环境的步骤

搭建MyBatis环境时,我们一般需要做以下几个步骤的工作:

1》创建java工程

2》找到开发MyBatis应用需要使用到的jar文件.

3》创建数据库表.

4》创建pojo文件.

5》创建针对表操作的xml文件

6》创建MyBatis的xml配置文件

7》编写测试类

1、创建java工程

2、导入java包

核心包

mybatis-3.1.1.jar

依赖包

asm-3.3.1.jar

cglib-2.2.2.jar

commons-logging-1.1.1.jar

log4j-1.2.16.jar

slf4j-api-1.6.2.jar

slf4j-log4j12-1.6.2.jar

数据库驱动包

mysql-connector-java-5.0.6-bin.jar

测试包

junit-4.4.jar

3、创建数据库表

创建数据库:

1 create database mybatis;
2 
3 use mybatis;

创建表:

1 create table user(id int primary key not  null  auto_increment,name  varchar(50),age  int,address varchar(150));
2 
3 desc user;

插入一条记录:

1  insert user values(‘1001’,’zhangsan’,25,’beijing’)

4.创建pojo

 1 public class User {
 2     private Integer id;
 3     private String name;
 4     private Integer age;
 5     private String address;
 6     public Integer getId() {
 7         return id;
 8     }
 9     public void setId(Integer id) {
10         this.id = id;
11     }
12     public String getName() {
13         return name;
14     }
15     public void setName(String name) {
16         this.name = name;
17     }
18     public Integer getAge() {
19         return age;
20     }
21     public void setAge(Integer age) {
22         this.age = age;
23     }
24     public String getAddress() {
25         return address;
26     }
27     public void setAddress(String address) {
28         this.address = address;
29     }
30     @Override
31     public String toString() {
32         return "User [id=" + id + ", name=" + name + ", age=" + age
33                 + ", address=" + address + "]";
34     }
35 }

5.创建针对表操作的xml文件UserMapper.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:必需保证唯一,一般是当前文件的全名 -->
 7 <mapper namespace="cn.itcast.dao.UserMapper">
 8  
 9  <!--     <select>:查询时使用
10     id:相当 于方法名,在同一文件中不能有相同的id名
11     parameterType:指定方法传入的参数类型,integer=java.lang.Integer
12     resultType:指定方法的返回类型 
13  -->
14     <select id="loadUserById" parameterType="integer" resultType="cn.itcast.pojo.User">
15         select * from user where id=#{id}
16     </select>
17     
18     <!-- <insert>:插入记录
19         #{id}:=getId()
20      -->
21     <insert id="insertUser" parameterType="cn.itcast.pojo.User" >
22         insert into user values(#{id},#{name},#{age},#{address})
23     </insert>
24     
25     <!-- <update>:更新记录-->
26     <update id="updataUser" parameterType="cn.itcast.pojo.User">
27         update user set name=#{name},age=#{age},address=#{address} where id=#{id}
28     </update>
29 
30     <delete id="deleteUser" parameterType="integer">
31         delete from user where id=#{id}
32     </delete>
33 <!-- ==================================================================== -->    
34     <!-- 动态SQL 查询 -->
35     <select id="findUser" parameterType="cn.itcast.pojo.User" resultType="cn.itcast.pojo.User">
36         select * from user
37         <where>
38             <if test="name != null">
39                 name like '%${name}%'
40             </if>
41             <if test="age !=null">
42                 and age=#{age}
43             </if>
44             <if test="address != null">
45                 and address like '%${address}%'
46             </if>
47         </where>
48         
49     </select>
50     
51     <!-- 公共查询条件 -->
52     <sql id="query_where">
53          <where>
54             <if test="name != null">
55                 name like '%${name}%'
56             </if>
57             <if test="age !=null">
58                 and age=#{age}
59             </if>
60             <if test="address != null">
61                 and address like '%${address}%'
62             </if>
63           </where>  
64     </sql>
65     
66     <select id="countUser" parameterType="cn.itcast.pojo.User" resultType="int">
67         select count(*) from user
68         <include refid="query_where"></include>
69         
70     </select>
71     
72     <!-- 动态更新 -->
73     <update id="updateUser2" parameterType="cn.itcast.pojo.User">
74         update user 
75         <set>
76             <if test="name != null">name=#{name},</if>
77             <if test="age != null">age=#{age},</if>
78             <if test="address != null">address=#{address}</if>
79         </set>  where id=#{id}
80     </update>
81     
82     <sql id="update_set">
83         <set>
84             <if test="name != null">name=#{name},</if>
85             <if test="age != null">age=#{age},</if>
86             <if test="address != null">address=#{address}</if>
87         </set> 
88     </sql>
89     
90     <!-- 动态更新 .公共条件-->
91     <update id="updateUser3" parameterType="cn.itcast.pojo.User">
92         update user 
93         <include refid="update_set"/> where id=#{id}
94     </update>
95 
96 </mapper>

6.创建MyBatis配置文件mybatis-config.xml

 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     
 7     <!-- <environments>:它里边能指定多个数据库配置 default:默认加载的数据库配置 -->
 8     <environments default="dev">
 9         <!-- 
10             <environment>:相应数据库配置
11             id:在当前配置文件中必需保证唯一
12          -->
13         <environment id="dev">
14             <!-- <transactionManager>:指定数据库事务的管理,一般由jdbc管理  -->
15             <transactionManager type="jdbc"></transactionManager>
16             <!-- <dataSource>:指定数据库相关连接-->
17             <dataSource type="pooled">
18                 <property name="driver" value="com.mysql.jdbc.Driver" />
19                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis1023" />
20                 <property name="username" value="root" />
21                 <property name="password" value="root" />
22             </dataSource>
23         </environment>
24     </environments>
25     
26     
27     <!-- <mappers>:配置所有的表的配置文件 -->
28     <mappers>
29         <!-- 
30         <mapper>:引入相关表的配置文件
31         resource:指定表配置文件的所在位置
32          -->
33         <mapper resource="cn/itcast/dao/UserMapper.xml"/>
34     </mappers>
35 </configuration>    

7.编写测试类TestUser.java

  1 public class TestUser {
  2     
  3     private SqlSession sqlSession = null;
  4     @Before
  5     public void init(){
  6         try {
  7             // 读取mybatis配置文件
  8             Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
  9             // 获取SqlSessionFactory
 10             SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
 11                     .build(reader);
 12             
 13             //获取SqlSession
 14             sqlSession = sessionFactory.openSession();
 15             
 16         } catch (IOException e) {
 17             e.printStackTrace();
 18         }
 19 
 20     }
 21     
 22     
 23     @Test
 24     /**
 25      * 更新一条数据
 26      */
 27     public void testUpdataUser(){
 28         User user = new User();
 29         user.setId(1);
 30         user.setName("wang");
 31         user.setAge(23);
 32         user.setAddress("shanghai");
 33         int i = sqlSession.update("cn.itcast.dao.UserMapper.updataUser",user);
 34         System.out.println(i);
 35         sqlSession.commit();
 36 
 37     }
 38     
 39     @Test
 40     /**
 41      * 插入一条数据
 42      */
 43     public void testInserUser(){
 44         User user = new User();
 45         user.setId(1);
 46         user.setName("wangwu");
 47         user.setAge(23);
 48         user.setAddress("tianjin");
 49         int i = sqlSession.insert("cn.itcast.dao.UserMapper.insertUser",user);
 50         System.out.println(i);
 51         sqlSession.commit();
 52 
 53     }
 54     @Test
 55     /**
 56      * 根据ID查询 
 57      */
 58     public void testLoadUserById() {
 59         // 通过id查询user
 60         User user = sqlSession.selectOne(
 61                 "cn.itcast.dao.UserMapper.loadUserById", 1);
 62         System.out.println(user.toString());
 63 
 64     }
 65     
 66     @Test
 67     /**
 68      * 根据ID删除一条数据
 69      */
 70     public void testDeleteUserById() {
 71         // 通过id查询user
 72         int i = sqlSession.delete(
 73                 "cn.itcast.dao.UserMapper.deleteUser", 1);
 74         System.out.println(i);
 75         sqlSession.commit();
 76 
 77     }
 78     
 79     @Test
 80     /**
 81      * 动态查询
 82      */
 83     public void findUser(){
 84         
 85         User u = new User();
 86         //u.setName("zhao");
 87         u.setName("wang");
 88         List<User> list = sqlSession.selectList("cn.itcast.dao.UserMapper.findUser", u);
 89         for (User user : list) {
 90             System.out.println(user.toString());
 91         }
 92     }
 93     
 94     @Test
 95     /**
 96      * 动态查询.公共条件查询
 97      */
 98     public void countUser(){
 99         
100         User u = new User();
101         //u.setName("zhao");
102         u.setAge(23);
103         int i = sqlSession.selectOne("cn.itcast.dao.UserMapper.countUser", u);
104         System.out.println(i);
105     }
106     
107     /**
108      * 动态更新
109      */
110     @Test
111     public void updateUser2(){
112         User user = new User();
113         user.setId(1);
114         //user.setName("zhaowu2");
115         user.setAge(26);
116         //user.setAddress("henan");
117         int i =  sqlSession.update("cn.itcast.dao.UserMapper.updateUser2", user);
118         System.out.println(i);
119         sqlSession.commit();
120     }
121     
122     /**
123      * 动态更新
124      */
125     @Test
126     public void updateUser3(){
127         User user = new User();
128         user.setId(1);
129         //user.setName("zhaowu2");
130         user.setAge(18);
131         //user.setAddress("henan");
132         int i =  sqlSession.update("cn.itcast.dao.UserMapper.updateUser3", user);
133         System.out.println(i);
134         sqlSession.commit();
135     }
136 
137 }

 

总结:

1   parameterType

在映射文件中通过parameterType指定输入 参数的类型。

2     resultType

在映射文件中通过resultType指定输出结果的类型。

3     #{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,#{}中可以写成value或其它名称。

#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,${}中只能写成value。

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

4     selectOne和selectList

selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

如果使用selectOne报错:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

2     mybatis和hibernate本质区别和应用场景

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。

对sql语句进行优化、修改比较困难的。

应用场景:

         适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:

         适用与需求变化较多的项目,比如:互联网项目。

企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

原文地址:https://www.cnblogs.com/kingxiaozi/p/5990944.html