• MyBatis之CRUD


    1 mybatis框架介绍

    1.1回顾jdbc操作数据库的过程

     

    1.2 mybatis开发步骤

    A.提供一个SqlMapperConfig.xml(src目录下),该文件主要配置数据库连接,事务,二级缓存。

    B.提供一个XxxMapper.xml(DeptMapper.xml),放入和DeptDao同一个包中。

          Sql语句

          Sql语句占位符的值

          Sql语句执行后需要返回的结果类型

    C.使用mybatis提供的API操作数据库。

    Mybatis完成对jdbc的封装,将操作数据过程需要的参数,封装到xml文件中,做到了可变的参数和不可变的代码的之间的解耦合,提高数据库开的效率。

    2 Mybatis对数据的CRUD

    2.1新建项目加入jar包

    2.2建立Mybatis的主配置文件

    必须放入src目录(classpath)

     MyBatis.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
     3 <configuration>
     4   <properties resource="db.properties"></properties>   
     5      <environments default="deptEnv">
     6         <environment id="deptEnv">
     7             <transactionManager type="JDBC" />
     8             <dataSource type="POOLED">
     9                 <property name="driver" value="${driver}" />
    10                 <property name="url" value="${url}" />
    11                 <property name="username" value="${username}" />
    12                 <property name="password" value="${password}" />
    13             </dataSource>
    14         </environment>
    15     </environments> 
    16     <mappers>
    17         <mapper resource="org/guangsoft/mapper/DeptMapper.xml" />
    18     </mappers>
    19 </configuration>

    db.properties

    1 driver = com.mysql.jdbc.Driver
    2 url = jdbc:mysql://localhost:3306/test
    3 username = root
    4 password =root

    2.3建立部门的实体类

     1 package org.guangsoft.entity;
     2 
     3 public class Dept
     4 {
     5     private Integer did;
     6     private String dname;
     7     public Integer getDid()
     8     {
     9         return did;
    10     }
    11     public void setDid(Integer did)
    12     {
    13         this.did = did;
    14     }
    15     public String getDname()
    16     {
    17         return dname;
    18     }
    19     public void setDname(String dname)
    20     {
    21         this.dname = dname;
    22     }
    23     
    24 }

    2.4建立DeptMapper接口

     1 package org.guangsoft.mapper;
     2 
     3 import java.util.List;
     4 
     5 import org.guangsoft.entity.Dept;
     6 
     7 public interface DeptMapper
     8 {
     9     public void saveDept(Dept dept);
    10     public void deleteDept(Integer did);
    11     public void updateDept(Dept dept);
    12     public Dept getDeptById(Integer did);
    13     public List<Dept> getAllDepts();
    14     public Integer getDeptCount();
    15 } 

    2.5建立DeptMapperImpl实现类

    使用Mybatis的API完成数据库添加

      1 package org.guangsoft.mapper.impl;
      2 
      3 import java.util.List;
      4 
      5 import org.apache.ibatis.session.SqlSession;
      6 import org.apache.ibatis.session.SqlSessionFactory;
      7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      8 import org.guangsoft.entity.Dept;
      9 import org.guangsoft.mapper.DeptMapper;
     10 
     11 public class DeptMapperImpl implements DeptMapper
     12 {
     13 
     14     @Override
     15     public void saveDept(Dept dept)
     16     {
     17         //创建sqlSessionFactory对象
     18         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     19         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
     20                     getClassLoader().getResourceAsStream("MyBatis.xml"));
     21         //产生SqlSesion兑现
     22         SqlSession sqlSession = ssf.openSession();
     23         //进行数据的crud操作
     24         sqlSession.insert("dept.saveDept",dept);
     25         //提交事务
     26         sqlSession.commit();
     27         //释放资源
     28         sqlSession.close();
     29     }
     30 
     31     @Override
     32     public void deleteDept(Integer did)
     33     {
     34         //创建sqlSessionFactory对象
     35         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     36         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
     37                 getClassLoader().getResourceAsStream("MyBatis.xml"));
     38         //产生SqlSesion兑现
     39         SqlSession sqlSession = ssf.openSession();
     40         //进行数据的crud操作
     41         int rows = sqlSession.delete("dept.deleteDept",did);
     42         //提交事务
     43         sqlSession.commit();
     44         //释放资源
     45         sqlSession.close();
     46     }
     47 
     48     @Override
     49     public void updateDept(Dept dept)
     50     {
     51         //创建sqlSessionFactory对象
     52         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     53         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
     54                 getClassLoader().getResourceAsStream("MyBatis.xml"));
     55         //产生SqlSesion兑现
     56         SqlSession sqlSession = ssf.openSession();
     57         //进行数据的crud操作
     58         int rows = sqlSession.update("dept.updateDept",dept);
     59         //提交事务
     60         sqlSession.commit();
     61         //释放资源
     62         sqlSession.close();
     63     }
     64 
     65     @Override
     66     public Dept getDeptById(Integer did)
     67     {
     68         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     69         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
     70         //获取数据库会话
     71         SqlSession session = ssf.openSession();
     72         //进行数据库查询操作
     73         Dept dept = session.selectOne("dept.getDeptById",did);
     74         //释放资源
     75         session.close();
     76         return dept;
     77     }
     78 
     79     @Override
     80     public List<Dept> getAllDepts()
     81     {
     82         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     83         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
     84         //获取数据库会话
     85         SqlSession session = ssf.openSession();
     86         //进行数据库查询操作
     87         List<Dept> deptList = session.selectList("dept.getAllDepts");
     88         //释放资源
     89         session.close();
     90         return deptList;
     91     }
     92 
     93     @Override
     94     public Integer getDeptCount()
     95     {
     96         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
     97         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
     98         //获取数据库会话
     99         SqlSession session = ssf.openSession();
    100         //进行数据库查询操作
    101         int count = session.selectOne("dept.getDeptCount");
    102         //释放资源
    103         session.close();
    104         return count;
    105     }
    106 
    107 }

    2.6建立映DeptMapper.xml射文件

    和Mapper接口放入同一个包,而且和Mapper接口的名字一样。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <mapper namespace="dept">
     4     <insert id="saveDept" parameterType="org.guangsoft.entity.Dept">
     5         insert into dept(did,dname) values (null,#{dname})
     6         <selectKey keyColumn="did" keyProperty="did" resultType="java.lang.Integer">
     7             <!-- 获得增加的记录的id -->
     8             select last_insert_id()
     9         </selectKey>
    10     </insert>
    11     <delete id="deleteDept" parameterType="java.lang.Integer">
    12         delete from dept where did = #{did};
    13     </delete>
    14     <update id="updateDept" parameterType="org.guangsoft.entity.Dept">
    15         update dept set dname = #{dname} where did=#{did}
    16     </update>  
    17     <select id="getDeptById" parameterType="java.lang.Integer" 
    18         resultType="org.guangsoft.entity.Dept">
    19         select * from dept where did = #{did}
    20     </select>  
    21     <select id="getAllDepts" resultType="org.guangsoft.entity.Dept">
    22         select * from dept
    23     </select>
    24     <select id="getDeptCount" resultType="java.lang.Integer">
    25         select count(*) from dept
    26     </select>
    27 </mapper>

    2.7建立数据库表

    新建数据库,新建表:

     1 /*
     2 Navicat MySQL Data Transfer
     3 
     4 Source Server         : MySQL
     5 Source Server Version : 50715
     6 Source Host           : localhost:3306
     7 Source Database       : test
     8 
     9 Target Server Type    : MYSQL
    10 Target Server Version : 50715
    11 File Encoding         : 65001
    12 
    13 Date: 2016-12-13 20:23:19
    14 */
    15 
    16 SET FOREIGN_KEY_CHECKS=0;
    17 
    18 -- ----------------------------
    19 -- Table structure for dept
    20 -- ----------------------------
    21 DROP TABLE IF EXISTS `dept`;
    22 CREATE TABLE `dept` (
    23   `did` int(11) NOT NULL AUTO_INCREMENT,
    24   `dname` varchar(255) DEFAULT NULL,
    25   PRIMARY KEY (`did`)
    26 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

    2.8建立测试类

     1 package org.guangsoft.test;
     2 
     3 import java.util.List;
     4 
     5 import org.guangsoft.entity.Dept;
     6 import org.guangsoft.mapper.DeptMapper;
     7 import org.guangsoft.mapper.impl.DeptMapperImpl;
     8 import org.junit.Test;
     9 
    10 public class TestDeptMapper
    11 {
    12     DeptMapper deptMapper = new DeptMapperImpl();
    13     
    14     @Test
    15     public void testSaveDept()
    16     {
    17         Dept dept = new Dept();
    18         dept.setDname("sssssdfs");
    19         deptMapper.saveDept(dept);
    20         System.out.println(dept.getDid());
    21     }
    22     
    23     @Test
    24     public void testDeleteDept()
    25     {
    26         deptMapper.deleteDept(3);
    27     }
    28     
    29     @Test
    30     public void testUpdateDept()
    31     {
    32         Dept dept = new Dept();
    33         dept.setDid(2);
    34         dept.setDname("update");
    35         deptMapper.updateDept(dept);
    36     }
    37     
    38     @Test
    39     public void testGetDeptById()
    40     {
    41         Dept dept = deptMapper.getDeptById(2);
    42         System.out.println(dept.getDname());
    43     }
    44     
    45     @Test
    46     public void testGetAllDepts()
    47     {
    48         List<Dept> deptList = deptMapper.getAllDepts();
    49         for(Dept dept : deptList)
    50         {
    51             System.out.println(dept.getDname());
    52         }
    53     }
    54     
    55     @Test
    56     public void testGetDeptCount()
    57     {
    58         Integer count = deptMapper.getDeptCount();
    59         System.out.println(count);
    60     }
    61 }

    2.9添加日志文件

    在src目录下建立,log4j.properties

    1 # Global logging configuration
    2 log4j.rootLogger=DEBUG, stdout
    3 # MyBatis logging configuration...
    4 log4j.logger.org.mybatis.example.BlogMapper=TRACE
    5 # Console output...
    6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

    总结:mybatis框架通过加载配置文件产生一个statement对象,而该对象的引用是通过namespace.id

    3 数据选择的Mapper.xml配置参数

    3.1 通过添加部门信息学习xml文件中的占位符

    3.1.1#{xxx}占位符

    相当于jdbc中sql语句预编译.(产生PreparedStatement对象),解决了sql注入的问题,提高安全性。

    如果传入的参数为javabean对象占位符#{xxx},

    xxx为javabean对象属性对应的get方法

    如果为复合的javabean(A.B),

    xxx为javabean对象属性链(b.x),相应属性都对应get方法

    如果传入的参数为简单类(String,Integer)

            xxx为任意值,保持和传入参数名称一样

    3.1.2${xxx}占位符

    相当于jdbc中的sql语句通过拼接产生(产生Statement对象),存在sql注入的问题

    如果传入的参数为javabean对象占位符#{xxx},

    xxx为javabean对象属性对应的get方法

    如果为复合的javabean(A.B),

    xxx为javabean对象属性链(b.x),相应属性都对应get方法

    如果传入的参数为简单类(String,Integer)

            xxx只能写value

     

  • 相关阅读:
    文件操作
    MFC
    MFC
    MFC
    MFC
    大陆居民身份证验证方法(java)
    java validator的原理与使用
    解析搜狗词库(python)
    ICTCLAS改进的java版分词软件
    mvn打包
  • 原文地址:https://www.cnblogs.com/guanghe/p/6171387.html
Copyright © 2020-2023  润新知