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

 

原文地址:https://www.cnblogs.com/guanghe/p/6171387.html