Mybatis(数据库框架 )

1. MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射

2. 接下来是用法截图,完整代码我会贴在最后面

  (1) 创建一个lib文件夹存放jar文件(jar包:https://files.cnblogs.com/files/x-long/mybatis.zip)

    

  (2) 创建一个 datasource.properties文件,放在src下面,把数据库相应的连接所用写在里面,当然前面的名字是可以改的,键值对应就成

   

  (3) 接下来创建SqlMapConfig.xml 配置文件,同样放在src下面

    基本上只有四步配置

    <1> 获取到datasource.properties配置文件

      

    <2> 配置类型别名

      

    <3>  配置运行环境

      

    <4> 映射mapper xml文件

      在映射这个文件的时候首先需要先去建立一个xml文件  下面我贴出映射方法截图   下面mapper  xml文件我会单独写

      

    <5>接下来是SqlMapConfig.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 
 6 <!-- 简单连接配置 -->
 7 <configuration>
 8     <!-- 获取到数据库配置文件  -->
 9     <properties resource="datasource.properties"></properties>
10     
11     <!-- 配置实体类的别名
12         方法一:直接使用package下的所有类  这样的别名就是类名-->
13     <typeAliases>
14         <package name="com.lovo.bean" />
15     </typeAliases>
16     
17     <!-- 方法二:挨个配置实体类别名  使用时就用alias里面的值-->
18     <!-- <typeAliases>
19         <typeAlias type="com.lovo.bean.User" alias="User"/>
20     </typeAliases> -->
21     
22     <!--配置运行环境 
23         default中的默认值development不用改变  获取到.properties文件中的数据库属性 -->
24     <environments default="development">
25         <!-- id对应上面的默认值 -->
26         <environment id="development">
27             <!-- 用JDBC的方式连接 -->
28             <transactionManager type="JDBC"  />
29             <!-- 把配置文件中的数据库连接所需获取出来   POOLED 连接池-->
30             <dataSource type="POOLED">
31                 <property name="driver" value="${jdbc.driver}" />
32                 <property name="url" value="${jdbc.url}" />
33                 <property name="username" value="${jdbc.username}" />
34                 <property name="password" value="${jdbc.password}" />
35             </dataSource>
36         </environment>
37     </environments>
38     
39     <!-- 把mapper中的xml映射出来 -->
40     <mappers>
41         <mapper resource="com/lovo/mapper/UserMapper.xml"></mapper>
42     </mappers>
43 
44 </configuration>

 

  (4) mapper xml文件配置

    a. 在写mapper配置文件以及接口的时候建议写上一个mapper包

      

    b. UserMapper.java这是一个接口,相当于dao里面的接口,代码如下

 1 package com.lovo.mapper;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.annotations.Param;
 6 
 7 import com.lovo.bean.User;
 8 
 9 public interface UserMapper {
10     //如果是对象属性需要@Param("user")给他设置一个别名然后在xml里面调值使用
11     //基础数据类型就不需要
12     public int addUser(@Param("user")User user);
13     
14     //删除用户
15     public int delUserById(int id);
16     
17     //查找用户
18     public User findUserById(int id);
19     
20     //查找有多少条用户信息
21     public int findUserCount();
22     
23     //根据name模糊查询user的list
24     //因为String不是基本数据类型所以需要加上别名
25     public List<User> findUserLikeName(@Param("name")String name);
26 }

    c. 注意事件就是在接口方法中的参数不是基础数据类型那么一定要用@param("别名")加上别名

    d. UserMapper.xml配置  源码如下

      

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<!-- 命名空间 -->
<mapper namespace="com.lovo.mapper.UserMapper">

    <!-- 把数据库中的字段映射到User实体类中
            property对应实体类中的属性
            column对应sql中的字段
            javaType对应数据类型
            数据库中的字段要和实体类中的相对应
            可以少写  也可以多写几个resultMap给返回不同的数据使用
             -->
    <resultMap type="User" id="userMapper">
        <id property="userId" column="user_id" javaType="int" />
        <result property="userName" column="user_name" javaType="java.lang.String"/>
        <result property="userPwd" column="user_pwd" javaType="java.lang.String"/>
        <result property="userType" column="user_type" javaType="int"/>
    </resultMap>

    <!-- id要和UserMapper.java中的方法名对应        parameterType这是传入对象别名-->
    <insert id="addUser" parameterType="User">
        <!-- 写sql语句 -->
        <!-- 获取对象值就需要对象.属性名  user就是在 UserMapper.java中add方法下参数用@Param()起的别名-->
        insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType})
    </insert>
    
    <!-- 这个id是从 UserMapper.java中delUserById中的参数列表中获取的 
        基本数据类型可以不用别名   否则就需要设置别名
        有别名就用别名
     -->
    <delete id="delUserById">
        delete from users where user_id=#{id}
    </delete>
    
    <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 -->
    <select id="findUserCount" resultType="int">
        select count(*) from users
    </select>
    
    <!-- resultMap如果返回的是对象的话那么就要用这个  后面跟上上面自己写的resultMap的id-->
    <select id="findUserById" resultMap="userMapper">
        select * from users where user_id=#{id}
    </select>

    
    <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 
            否则的话最后的sql语句会是: '%'name'%'
            如果返回的试一个user对象list集合   那么依然写上resultMap="userMapper"
            在biz层的方法返回值设置为list就可以了
     -->
    <select id="findUserLikeName" resultMap="userMapper">
        select * from users where user_name like concat('%',#{name},'%')
    </select>
</mapper>

    e.注意事项都写在代码注释了

      (a) 这一块命名空间要和.java文件名相同

        

      (b) 返回类型,增删改的返回类型默认为int,其他需要自己设置

        

 1 <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 -->
 2     <select id="findUserCount" resultType="int">
 3         select count(*) from users
 4     </select>
 5     
 6     <!-- resultMap如果返回的是对象的话那么就要用这个  后面跟上上面自己写的resultMap的id-->
 7     <select id="findUserById" resultMap="userMapper">
 8         select * from users where user_id=#{id}
 9     </select>
10 
11     
12     <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 
13             否则的话最后的sql语句会是: '%'name'%'
14             如果返回的试一个user对象list集合   那么依然写上resultMap="userMapper"
15             在biz层的方法返回值设置为list就可以了
16      -->
17     <select id="findUserLikeName" resultMap="userMapper">
18         select * from users where user_name like concat('%',#{name},'%')
19     </select>

    (c)  自己定义的对象返回类型,通过字段名的映射到相应的实体类中

      

<!-- 把数据库中的字段映射到User实体类中
            property对应实体类中的属性
            column对应sql中的字段
            javaType对应数据类型
            数据库中的字段要和实体类中的相对应
            可以少写  也可以多写几个resultMap给返回不同的数据使用
             -->
    <resultMap type="User" id="userMapper">
        <id property="userId" column="user_id" javaType="int" />
        <result property="userName" column="user_name" javaType="java.lang.String"/>
        <result property="userPwd" column="user_pwd" javaType="java.lang.String"/>
        <result property="userType" column="user_type" javaType="int"/>
    </resultMap>

     (d) 还有就是sql语句的id要和接口类的方法名相同  比如以下代码

接口

1 public int addUser(@Param("user")User user);
2     
3     //删除用户
4     public int delUserById(int id);

xml

<insert id="addUser" parameterType="User">
        insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType})
    </insert>
    
    <delete id="delUserById">
        delete from users where user_id=#{id}
    </delete>

 

 

    (5) 最后就是建立一个获取SqlSessionFactory的DBUtil类,用于在service层进行调用,下面是DBUtil源码

 1 package com.lovo.util;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 
11 public class DBUtil {
12     
13     //所有的程序都要在到达数据库的时候访问SqlSessionFactory然后创建一个session(会话)
14     private static SqlSessionFactory sessionFactory;
15     //静态加载  只加载一次
16     static {
17         InputStream in = null;
18         try {
19             //通过输入流获取到SqlMapConfig.xml配置信息
20             in = Resources.getResourceAsStream("SqlMapConfig.xml");
21             
22             //通过SqlSessionFactoryBuilder把SqlMapConfig.xml配置信息放在sessionFactory里面去
23             sessionFactory = new SqlSessionFactoryBuilder().build(in);
24             
25         } catch (IOException e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         } finally {
29             //记得关闭
30             try {
31                 if (in != null) in.close();
32             } catch (IOException e) {
33                 // TODO Auto-generated catch block
34                 e.printStackTrace();
35             }
36         }
37     }
38     
39     //返回一个数据库连接好了的sessionFactory会话
40     public static SqlSession getSession(){
41         return sessionFactory.openSession();
42     }
43 
44 }

    这个没什么难度,就是获取inputstream流然后把SqlMapConfig.xml文件读取出来。

最后贴上在service中的代码,个人使用的是biz命名,为了快速,所以没有写上接口

 1 package com.lovo.biz;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.annotations.Param;
 6 import org.apache.ibatis.session.SqlSession;
 7 
 8 import com.lovo.bean.User;
 9 import com.lovo.mapper.UserMapper;
10 import com.lovo.util.DBUtil;
11 
12 public class UserBiz {
13     //私有化获取到一个会话连接
14     private SqlSession session = DBUtil.getSession();
15     //因为UserMapper是一个接口   没有实现类   所以只能通过SqlSession下的getMapper来获取到他的对象
16     UserMapper mapper = session.getMapper(UserMapper.class);
17     
18     public int regist(User user){
19         int result = mapper.addUser(user);
20         //要记得提交数据  不然是不会成功的
21         session.commit();
22         return result;
23     }
24     
25     /**
26      * 删除用户
27      * @param id
28      * @return
29      */
30     public int delUserById(int id){
31         int result = mapper.delUserById(id);
32         //要记得提交数据  不然是不会成功的
33         session.commit();
34         return result;
35     }
36     
37     
38     /**
39      * 根据id查找用户用户
40      * @param id
41      * @return
42      */
43     public User findUserById(int id){
44         User u = mapper.findUserById(id);
45         session.commit();
46         return u;
47     }
48 
49     
50     //查找有多少条用户信息
51     public int findUserCount(){
52         int count = mapper.findUserCount();
53         session.commit();
54         return count;
55         
56     }
57     
58     //根据name模糊查询user的list
59     //因为String不是基本数据类型所以需要加上别名
60     public List<User> findUserLikeName(@Param("name")String name){
61         List<User> list = mapper.findUserLikeName(name);
62         session.commit();
63         return list;
64     }
65 }

       注意需要commit方法提交的时候是在对数据库进行操作的时候,列如增删改的时候

posted on 2017-10-23 23:05  xu_l  阅读(502)  评论(0编辑  收藏  举报