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