MyBatis的学习01
1.mybatis简介:
1.1mybatis名称的由来
1.2mybatis是什么?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
2.入门案例
2.1需求分析:
对订单商品案例中的用户表进行增删改查操作
① 根据用户ID查询用户信息
② 根据用户名称模糊查询用户列表
③ 添加用户
④ 删除用户(练习)
⑤ 修改用户(练习)
2.2选择环境:
Jdk:1.8、Ide:eclipseMybatis:3.2.7、数据库:MySQL 5X
2.3mybatis下载:
下载路径:https://github.com/mybatis/mybatis-3/releases
下载解压后的文件目录
2.4sql脚本:
1 /*
2 SQLyog v10.2
3 MySQL - 5.1.72-community : Database - mybatis
4 *********************************************************************
5 */
6
7
8 /*!40101 SET NAMES utf8 */;
9
10 /*!40101 SET SQL_MODE=''*/;
11
12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
16 /*Data for the table `items` */
17
18 insert into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2015-02-06 13:23:02');
19
20 /*Data for the table `orderdetail` */
21
22 insert into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);
23
24 /*Data for the table `orders` */
25
26 insert into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);
27
28 /*Data for the table `user` */
29
30 insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);
31
32 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
33 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
34 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
35 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
1 /*
2 SQLyog v10.2
3 MySQL - 5.1.72-community : Database - mybatis
4 *********************************************************************
5 */
6
7
8 /*!40101 SET NAMES utf8 */;
9
10 /*!40101 SET SQL_MODE=''*/;
11
12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
16 /*Table structure for table `items` */
17
18 CREATE TABLE `items` (
19 `id` int(11) NOT NULL AUTO_INCREMENT,
20 `name` varchar(32) NOT NULL COMMENT '商品名称',
21 `price` float(10,1) NOT NULL COMMENT '商品定价',
22 `detail` text COMMENT '商品描述',
23 `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
24 `createtime` datetime NOT NULL COMMENT '生产日期',
25 PRIMARY KEY (`id`)
26 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
27
28 /*Table structure for table `orderdetail` */
29
30 CREATE TABLE `orderdetail` (
31 `id` int(11) NOT NULL AUTO_INCREMENT,
32 `orders_id` int(11) NOT NULL COMMENT '订单id',
33 `items_id` int(11) NOT NULL COMMENT '商品id',
34 `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
35 PRIMARY KEY (`id`),
36 KEY `FK_orderdetail_1` (`orders_id`),
37 KEY `FK_orderdetail_2` (`items_id`),
38 CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
39 CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
40 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
41
42 /*Table structure for table `orders` */
43
44 CREATE TABLE `orders` (
45 `id` int(11) NOT NULL AUTO_INCREMENT,
46 `user_id` int(11) NOT NULL COMMENT '下单用户id',
47 `number` varchar(32) NOT NULL COMMENT '订单号',
48 `createtime` datetime NOT NULL COMMENT '创建订单时间',
49 `note` varchar(100) DEFAULT NULL COMMENT '备注',
50 PRIMARY KEY (`id`),
51 KEY `FK_orders_1` (`user_id`),
52 CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
53 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
54
55 /*Table structure for table `user` */
56
57 CREATE TABLE `user` (
58 `id` int(11) NOT NULL AUTO_INCREMENT,
59 `username` varchar(32) NOT NULL COMMENT '用户名称',
60 `birthday` date DEFAULT NULL COMMENT '生日',
61 `sex` char(1) DEFAULT NULL COMMENT '性别',
62 `address` varchar(256) DEFAULT NULL COMMENT '地址',
63 PRIMARY KEY (`id`)
64 ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
65
66 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
67 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
68 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
69 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
2.5po类创建
1 public class User {
2 public int id;
3 public String username;
4 public String sex;
5 public Date birthday;
6 public String address;
7 public int getId() {
8 return id;
9 }
10 public void setId(int id) {
11 this.id = id;
12 }
13 public String getUsername() {
14 return username;
15 }
16 public void setUsername(String username) {
17 this.username = username;
18 }
19 public String getSex() {
20 return sex;
21 }
22 public void setSex(String sex) {
23 this.sex = sex;
24 }
25 public Date getBirthday() {
26 return birthday;
27 }
28 public void setBirthday(Date birthday) {
29 this.birthday = birthday;
30 }
31 public String getAddress() {
32 return address;
33 }
34 public void setAddress(String address) {
35 this.address = address;
36 }
37 @Override
38 public String toString() {
39 return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
40 + address + "]";
41 }
42
43 }
2.6创建config源文件夹并在下面创建MyBatis的SqlMapConfig.xml全局配置文件和映射文件User.xml
①创建全局配置文件和类映射文件时需要导入DTD约束,这个约束头可以在mybatis-3.2.7.pdf中找到,不过那个是从网络下加载约束,也可以去官网去下载约束文件进行本地配置。
②SqlMapCongfig.xml文件名称虽然没有限定叫什么名字但是最好取这个名字,约定俗成的东西。
注意:加载映射文件的<mappers><mapper resource="XML相对路径"></mappers>。<mapper>标签是指定一个映射文件<package>标签是批量指定映射文件的(注意批量指定映射文件有特殊限定:①与特定PO类名称相同②需要与特定PO类在同一个包下)其他详细配置和注释见下面代码
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 <!-- 加载db.properties配置文件 --> 7 <properties resource="db.properties"> 8 <!-- 这个明显是先执行的property标签的属性和属性值然后再读的源文件的属性值所以源文件的属性值会覆盖掉这个错误的属性值 --> 9 <property name="db.username" value="123"/> 10 </properties> 11 <!-- 自定义数据别名 --> 12 <typeAliases> 13 <!-- 自定义单个别名 14 使用:别名使用可以在映射文件中将全限定类名改为别名,且别名不区分大小写 15 --> 16 <!-- <typeAlias type="com.itheima.Po.User" alias="user"/> --> 17 <!--<推荐>批量自定义别名 18 name:批量指定po类别名的包名 19 使用:别名即类名,且不区分大小写 20 --> 21 <package name="com.itheima.Po"/> 22 </typeAliases> 23 24 25 26 <!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 --> 27 <environments default="development"> 28 <environment id="development"> 29 <!-- 配置JDBC事务控制,由mybatis进行管理 --> 30 <transactionManager type="JDBC"></transactionManager> 31 <!-- 配置数据源,采用mybatis连接池 --> 32 <dataSource type="POOLED"> 33 <property name="driver" value="${db.driver}" /> 34 <property name="url" value="${db.url}" /> 35 <property name="username" value="${db.username}" /> 36 <property name="password" value="${db.password}" /> 37 </dataSource> 38 </environment> 39 </environments> 40 41 <!-- 加载映射文件 --> 42 <mappers> 43 <mapper resource="User.xml" /> 44 <!-- 指定一个路径下的所有映射文件 45 限定要求:1.接口或类需要与映射文件名称相同 2.接口或类需要和映射文件放在同一个目录下 46 --> 47 <package name="com.itheima.mapper"/> 48 <!-- <mapper resource="mapper/UserMapper.xml"/> --> 49 </mappers> 50 </configuration>
详细配置和标签属性的作用见下面代码
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 <!-- 加载db.properties配置文件 --> 7 <properties resource="db.properties"> 8 <!-- 这个明显是先执行的property标签的属性和属性值然后再读的源文件的属性值所以源文件的属性值会覆盖掉这个错误的属性值 --> 9 <property name="db.username" value="123"/> 10 </properties> 11 <!-- 自定义数据别名 --> 12 <typeAliases> 13 <!-- 自定义单个别名 14 使用:别名使用可以在映射文件中将全限定类名改为别名,且别名不区分大小写 15 --> 16 <!-- <typeAlias type="com.itheima.Po.User" alias="user"/> --> 17 <!--<推荐>批量自定义别名 18 name:批量指定po类别名的包名 19 使用:别名即类名,且不区分大小写 20 --> 21 <package name="com.itheima.Po"/> 22 </typeAliases> 23 24 25 26 <!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 --> 27 <environments default="development"> 28 <environment id="development"> 29 <!-- 配置JDBC事务控制,由mybatis进行管理 --> 30 <transactionManager type="JDBC"></transactionManager> 31 <!-- 配置数据源,采用mybatis连接池 --> 32 <dataSource type="POOLED"> 33 <property name="driver" value="${db.driver}" /> 34 <property name="url" value="${db.url}" /> 35 <property name="username" value="${db.username}" /> 36 <property name="password" value="${db.password}" /> 37 </dataSource> 38 </environment> 39 </environments> 40 41 <!-- 加载映射文件 --> 42 <mappers> 43 <mapper resource="User.xml" /> 44 <!-- 指定一个路径下的所有映射文件 45 限定要求:1.接口或类需要与映射文件名称相同 2.接口或类需要和映射文件放在同一个目录下 46 --> 47 <package name="com.itheima.mapper"/> 48 <!-- <mapper resource="mapper/UserMapper.xml"/> --> 49 </mappers> 50 </configuration>
2.7在与PO类同一个包下我们添加一个测试类编写测试代码Firstmybatis.java测试代码
1 public class FirstMyBatis { 2 3 @Test 4 public void findUserByIdTest() throws Exception{ 5 //读取配置文件 6 //全局配置文件的路径 7 String resource = "SqlMapConfig.xml"; 8 InputStream inputStream = Resources.getResourceAsStream(resource); 9 10 //创建SqlSessionFactory 11 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 12 13 //创建SqlSession 14 SqlSession sqlSession = sqlSessionFactory.openSession(); 15 16 //调用SqlSession的增删改查方法 17 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 18 //但是当名称不重复时也可以只写Id名称也不会报错 19 //第二个参数类型要和对应映射文件中statement入参类型一致 20 User user = sqlSession.selectOne("test.findUserById", 10); 21 System.out.println(user); 22 23 //关闭资源 24 sqlSession.close(); 25 } 26 @Test 27 public void findUserByUsernameTest() throws Exception{ 28 //读取配置文件 29 //全局配置文件的路径 30 String resource = "SqlMapConfig.xml"; 31 InputStream inputStream = Resources.getResourceAsStream(resource); 32 33 //创建SqlSessionFactory 34 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 35 36 //创建SqlSession 37 SqlSession sqlSession = sqlSessionFactory.openSession(); 38 39 //调用SqlSession的增删改查方法 40 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 41 //但是当名称不重复时也可以只写Id名称也不会报错 42 //第二个参数类型要和对应映射文件中statement入参类型一致 43 List<User> userList = sqlSession.selectList("test.findUserByUserName", "小明"); 44 System.out.println(userList); 45 46 //关闭资源 47 sqlSession.close(); 48 } 49 @Test 50 public void insertUserTest() throws Exception{ 51 //读取配置文件 52 //全局配置文件的路径 53 String resource = "SqlMapConfig.xml"; 54 InputStream inputStream = Resources.getResourceAsStream(resource); 55 56 //创建SqlSessionFactory 57 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 58 59 //创建SqlSession 60 SqlSession sqlSession = sqlSessionFactory.openSession(); 61 62 User user =new User(); 63 user.setUsername("李四"); 64 //user.setBirthday(new Date()); 65 user.setSex("2"); 66 user.setAddress("西流河何帮"); 67 68 //调用SqlSession的增删改查方法 69 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 70 //但是当名称不重复时也可以只写Id名称也不会报错 71 //第二个参数类型要和对应映射文件中statement入参类型一致 72 int result = sqlSession.insert("test.insertUser", user); 73 //如果不提交数据将会存在于内存中,而mybatis是自动开启事务的提交, 74 //如果想要手动开启事务只需将sqlSessionFactory.openSession(flase)即可 75 sqlSession.commit(); 76 System.out.println(result); 77 78 //关闭资源 79 sqlSession.close(); 80 } 81 @Test 82 public void insertGetKeyTest() throws Exception{ 83 //读取配置文件 84 //全局配置文件的路径 85 String resource = "SqlMapConfig.xml"; 86 InputStream inputStream = Resources.getResourceAsStream(resource); 87 88 //创建SqlSessionFactory 89 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 90 91 //创建SqlSession 92 SqlSession sqlSession = sqlSessionFactory.openSession(); 93 94 User user =new User(); 95 user.setUsername("小西西"); 96 //user.setBirthday(new Date()); 97 user.setSex("2"); 98 user.setAddress("西流河何帮"); 99 100 //调用SqlSession的增删改查方法 101 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 102 //但是当名称不重复时也可以只写Id名称也不会报错 103 //第二个参数类型要和对应映射文件中statement入参类型一致 104 int result = sqlSession.insert("test.insertGetKey", user); 105 //如果不提交数据将会存在于内存中,而mybatis是自动开启事务的提交, 106 //如果想要手动开启事务只需将sqlSessionFactory.openSession(flase)即可 107 sqlSession.commit(); 108 //当你在配置文件中配置了得到主键的信息那么在user中就会得到该属性值user.getId() 109 System.out.println(result+","+user.getId()); 110 111 //关闭资源 112 sqlSession.close(); 113 } 114 115 @Test 116 public void deleteUserByIdTest() throws Exception{ 117 //读取配置文件 118 //全局配置文件的路径 119 String resource = "SqlMapConfig.xml"; 120 InputStream inputStream = Resources.getResourceAsStream(resource); 121 122 //创建SqlSessionFactory 123 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 124 125 //创建SqlSession 126 SqlSession sqlSession = sqlSessionFactory.openSession(); 127 128 //调用SqlSession的增删改查方法 129 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 130 //但是当名称不重复时也可以只写Id名称也不会报错 131 //第二个参数类型要和对应映射文件中statement入参类型一致 132 int result = sqlSession.delete("test.deleteUserById", 29); 133 sqlSession.commit();//增加或者删除或者修改操作切记需要提交数据,因为数据内容发生变化 134 System.out.println(result); 135 136 //关闭资源 137 sqlSession.close(); 138 } 139 @Test 140 public void updateUserTest() throws Exception{ 141 //读取配置文件 142 //全局配置文件的路径 143 String resource = "SqlMapConfig.xml"; 144 InputStream inputStream = Resources.getResourceAsStream(resource); 145 146 //创建SqlSessionFactory 147 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 148 149 //创建SqlSession 150 SqlSession sqlSession = sqlSessionFactory.openSession(); 151 152 //调用SqlSession的增删改查方法 153 //第一个参数:表示statement的唯一标示 建议:namespace.statementId(确保唯一) 154 //但是当名称不重复时也可以只写Id名称也不会报错 155 //第二个参数类型要和对应映射文件中statement入参类型一致 156 User user =new User(); 157 user.setId(31); 158 user.setUsername("小希希"); 159 user.setSex("1"); 160 user.setBirthday(new Date()); 161 user.setAddress("湖北省仙桃市西流河镇何帮村"); 162 int result = sqlSession.update("test.updateUser", user); 163 sqlSession.commit();//增加或者删除或者修改操作切记需要提交数据,因为数据内容发生变化 164 System.out.println(result); 165 166 //关闭资源 167 sqlSession.close(); 168 } 169 }
3.mybatis的两种开发方式:
3.1原始的Dao开发方式
通过编写Dao接口来开发的方式,我们还要相应实现该接口,创建一个实现类
我们通过案例来分析最快:
需求:通过id来实现查询用户、通过用户名查询、通过id删除用户
3.2编写Dao接口
1 public interface UserDao { 2 public User findUserById(int id);//根据用户ID查询用户 3 public List<User> findUserByUserName(String username);//根据用户名查询用户 4 public Integer deleteUserById(int id);//根据Id来删除用户 5 6 }
3.3编写Dao实现类
通过代码可以看到我们实现具体方法时存在着固定限制sqlSession.selectList("test.findUserByUserName", username);第一个参数是Mapper映射文件的namespace.id名称
1 public class UserDaoImpl implements UserDao { 2 3 //创建一个SqlSession工厂,这里我们可以通过set方法注入,也可以通过构造函数注入我们这里使用后者 4 private SqlSessionFactory sqlSessionFactory; 5 6 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { 7 super(); 8 this.sqlSessionFactory = sqlSessionFactory; 9 } 10 11 @Override 12 public User findUserById(int id) { 13 SqlSession sqlSession=sqlSessionFactory.openSession(); 14 //注意第一个参数需要按照特定规则来写 15 User user = sqlSession.selectOne("test.findUserById", id); 16 sqlSession.close(); 17 return user; 18 } 19 20 @Override 21 public List<User> findUserByUserName(String username) { 22 SqlSession sqlSession=sqlSessionFactory.openSession(); 23 //注意第一个参数需要按照特定规则来写 24 List<User> userList = sqlSession.selectList("test.findUserByUserName", username); 25 sqlSession.close(); 26 return userList; 27 } 28 29 @Override 30 public Integer deleteUserById(int id) { 31 SqlSession sqlSession =sqlSessionFactory.openSession(); 32 int result = sqlSession.delete("test.deleteUserById",id); 33 sqlSession.commit(); 34 sqlSession.close(); 35 return result; 36 } 37 38 }
我们需要编写相应的映射文件信息User.xml
1 <!DOCTYPE mapper 2 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <!-- namespace:命名空间,对statement的信息进行分类管理 --> 5 <!-- 注意:在mapper代理时,它具有特殊及重要的作用 --> 6 <mapper namespace="test"> 7 <!-- 根据用户ID查询用户信息 --> 8 <!-- select:表示一个MappedStatement对象 --> 9 <!-- id:statement的唯一标示 --> 10 <!-- #{}:表示一个占位符? --> 11 <!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意 --> 12 <!-- parameterType:输入参数的java类型 --> 13 <!-- resultType:输出结果的所映射的java类型(单条结果所对应的java类型) --> 14 <select id="findUserById" parameterType="int" 15 resultType="com.itheima.Po.User"> 16 SELECT * FROM USER WHERE id =#{id} 17 </select> 18 <select id="findUserByUsername" parameterType="String" resultType="com.itheima.Po.User"> 19 select * from user where username like '%${value}%' 20 </select> 21 <delete id="deleteUserById" parameterType="int" > 22 DELETE FROM USER WHERE id=#{id} 23 </delete> 24 </mapper>
还需要SqlMapConfig.xml mybatis的全局配置文件上面已经配过只需要将映射文件加载进去就行
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 <!-- 加载db.properties配置文件 --> 7 <properties resource="db.properties"> 8 <!-- 这个明显是先执行的property标签的属性和属性值然后再读的源文件的属性值所以源文件的属性值会覆盖掉这个错误的属性值 --> 9 <property name="db.username" value="123"/> 10 </properties> 11 <!-- 自定义数据别名 --> 12 <typeAliases> 13 <!-- 自定义单个别名 14 使用:别名使用可以在映射文件中将全限定类名改为别名,且别名不区分大小写 15 --> 16 <!-- <typeAlias type="com.itheima.Po.User" alias="user"/> --> 17 <!--<推荐>批量自定义别名 18 name:批量指定po类别名的包名 19 使用:别名即类名,且不区分大小写 20 --> 21 <package name="com.itheima.Po"/> 22 </typeAliases> 23 24 25 26 <!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 --> 27 <environments default="development"> 28 <environment id="development"> 29 <!-- 配置JDBC事务控制,由mybatis进行管理 --> 30 <transactionManager type="JDBC"></transactionManager> 31 <!-- 配置数据源,采用mybatis连接池 --> 32 <dataSource type="POOLED"> 33 <property name="driver" value="${db.driver}" /> 34 <property name="url" value="${db.url}" /> 35 <property name="username" value="${db.username}" /> 36 <property name="password" value="${db.password}" /> 37 </dataSource> 38 </environment> 39 </environments> 40 41 <!-- 加载映射文件 --> 42 <mappers> 43 <mapper resource="User.xml" /> 44 <!-- 指定一个路径下的所有映射文件 45 限定要求:1.接口或类需要与映射文件名称相同 2.接口或类需要和映射文件放在同一个目录下 46 --> 47 <package name="com.itheima.mapper"/> 48 <!-- <mapper resource="mapper/UserMapper.xml"/> --> 49 </mappers> 50 </configuration>
3.4测试代码
小技巧:
1 public class UserDaoTest { 2 3 private SqlSessionFactory sqlSessionFactory; 4 @Before 5 public void setUp() throws IOException { 6 //指定配置文件路径和文件名 7 String resource="SqlMapconfig.xml"; 8 //读取配置文件得到一个字节输入流 9 InputStream inputStream = Resources.getResourceAsStream(resource); 10 //创建SqlSessionFactory实例传入输入流 11 sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream); 12 13 14 } 15 @Test 16 public void testFindUserById() { 17 UserDao userDao=new UserDaoImpl(sqlSessionFactory); 18 User user=userDao.findUserById(1); 19 System.out.println(user); 20 } 21 22 @Test 23 public void testFindUserByUserName() { 24 UserDao userDao=new UserDaoImpl(sqlSessionFactory); 25 List<User> userList=userDao.findUserByUserName("小明"); 26 System.out.println(userList); 27 } 28 29 @Test 30 public void testDeleteUserById() { 31 UserDao userDao =new UserDaoImpl(sqlSessionFactory); 32 int result = userDao.deleteUserById(27); 33 System.out.println(result); 34 } 35 36 }
3.5Mapper代理的开发方式
3.6创建Mapper接口
3.7创建Mapper映射文件
3.8测试代码
4.全局配置文件的讲解
4.1概览
4.2properties
4.3settings
4.4typeAliases