一、开发步骤和程序代码
1、程序员需要编写user.xml映射文件,程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
2、创建数据库配置文件db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=123
3、创建mybatis配置文件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 <configuration> 6 <!-- 加载属性文件 --> 7 <properties resource="db.properties"></properties> 8 9 <!-- 全局配置参数,需要时再设置 --> 10 <!-- <settings></settings> --> 11 12 <!-- 别名定义 --> 13 <typeAliases> 14 <!-- 针对单个别名定义 type:类型的路径 alias:别名 --> 15 <!-- <typeAlias type="com.zhang.domain.User" alias="user"/> --> 16 <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)--> 17 <package name="com.zhang.domain"/> 18 </typeAliases> 19 20 <environments default="development"> 21 <environment id="development"> 22 <!-- 使用jdbc事务管理,事务控制由mybatis--> 23 <transactionManager type="JDBC" /> 24 <!-- 数据库连接池,由mybatis管理--> 25 <dataSource type="POOLED"> 26 <property name="driver" value="${jdbc.driver}" /> 27 <property name="url" value="${jdbc.url}" /> 28 <property name="username" value="${jdbc.username}" /> 29 <property name="password" value="${jdbc.password}" /> 30 </dataSource> 31 </environment> 32 </environments> 33 34 <mappers> 35 <mapper resource="sqlmap/User.xml"/> 36 37 <!-- 通过mapper接口加载单个 映射文件 38 遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中 39 上边规范的前提是:使用的是mapper代理方法 40 --> 41 <!-- <mapper class="com.zhang.dao.UserDao"/> --> 42 43 <!-- 批量加载mapper 44 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 45 遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中 46 上边规范的前提是:使用的是mapper代理方法 47 --> 48 <!-- <package name="com.zhang.dao"/> --> 49 </mappers> 50 </configuration>
4、创建接口类UserDao.java
1 package com.zhang.dao; 2 3 import java.util.List; 4 import com.zhang.domain.User; 5 6 public interface UserDao { 7 8 //根据id查询用户信息,使用resultMap输出 9 public User findUserByIdResultMap(int id) throws Exception; 10 11 //根据id查询用户信息 12 public User findUserById(int id) throws Exception; 13 14 //根据用户名列查询用户列表 15 public List<User> findUserByName(String name) throws Exception; 16 17 //添加用户信息 18 public void insertUser(User user) throws Exception; 19 20 //删除用户信息 21 public void deleteUser(int id) throws Exception; 22 23 }
5、创建user.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 <configuration> 6 <!-- 加载属性文件 --> 7 <properties resource="db.properties"></properties> 8 9 <!-- 全局配置参数,需要时再设置 --> 10 <!-- <settings></settings> --> 11 12 <!-- 别名定义 --> 13 <typeAliases> 14 <!-- 针对单个别名定义 type:类型的路径 alias:别名 --> 15 <!-- <typeAlias type="com.zhang.domain.User" alias="user"/> --> 16 <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)--> 17 <package name="com.zhang.domain"/> 18 </typeAliases> 19 20 <environments default="development"> 21 <environment id="development"> 22 <!-- 使用jdbc事务管理,事务控制由mybatis--> 23 <transactionManager type="JDBC" /> 24 <!-- 数据库连接池,由mybatis管理--> 25 <dataSource type="POOLED"> 26 <property name="driver" value="${jdbc.driver}" /> 27 <property name="url" value="${jdbc.url}" /> 28 <property name="username" value="${jdbc.username}" /> 29 <property name="password" value="${jdbc.password}" /> 30 </dataSource> 31 </environment> 32 </environments> 33 34 <mappers> 35 <mapper resource="sqlmap/User.xml"/> 36 37 <!-- 通过mapper接口加载单个 映射文件 38 遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中 39 上边规范的前提是:使用的是mapper代理方法 40 --> 41 <!-- <mapper class="com.zhang.dao.UserDao"/> --> 42 43 <!-- 批量加载mapper 44 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 45 遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中 46 上边规范的前提是:使用的是mapper代理方法 47 --> 48 <!-- <package name="com.zhang.dao"/> --> 49 </mappers> 50 </configuration>
6、创建实体类User.java文件
1 package com.zhang.domain; 2 3 import java.util.Date; 4 public class User { 5 6 //属性名和数据库表的字段对应 7 private int id; 8 private String username;// 用户姓名 9 private String sex;// 性别 10 private Date birthday;// 生日 11 private String address;// 地址 12 public int getId() { 13 return id; 14 } 15 public void setId(int id) { 16 this.id = id; 17 } 18 public String getUsername() { 19 return username; 20 } 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 public String getSex() { 25 return sex; 26 } 27 public void setSex(String sex) { 28 this.sex = sex; 29 } 30 public Date getBirthday() { 31 return birthday; 32 } 33 public void setBirthday(Date birthday) { 34 this.birthday = birthday; 35 } 36 public String getAddress() { 37 return address; 38 } 39 public void setAddress(String address) { 40 this.address = address; 41 } 42 @Override 43 public String toString() { 44 return "User [id=" + id + ", username=" + username + ", sex=" + sex 45 + ", birthday=" + birthday + ", address=" + address + "]"; 46 } 47 48 49 }
7、测试,创建测试类TestMy.java
1 package com.zhang.test; 2 3 import java.io.InputStream; 4 import java.util.Date; 5 import java.util.List; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 import org.junit.Before; 12 import org.junit.Test; 13 14 import com.zhang.dao.UserDao; 15 import com.zhang.domain.User; 16 17 public class TestMy { 18 private SqlSessionFactory sqlSessionFactory; 19 20 // 此方法是在执行testFindUserById之前执行 21 @Before 22 public void setUp() throws Exception { 23 // 创建sqlSessionFactory 24 // mybatis配置文件 25 String resource = "SqlMapConfig.xml"; 26 // 得到配置文件流 27 InputStream inputStream = Resources.getResourceAsStream(resource); 28 // 创建会话工厂,传入mybatis的配置文件信息 29 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 30 } 31 32 @Test 33 public void testFindUserById() throws Exception { 34 SqlSession sqlSession = sqlSessionFactory.openSession(); 35 //创建UserMapper对象,mybatis自动生成mapper代理对象 36 UserDao userDao = sqlSession.getMapper(UserDao.class); 37 //调用userMapper的方法 38 User user = userDao.findUserById(1); 39 System.out.println(user); 40 } 41 42 @Test 43 public void testFindUserByName() throws Exception { 44 SqlSession sqlSession = sqlSessionFactory.openSession(); 45 //创建UserMapper对象,mybatis自动生成mapper代理对象 46 UserDao userDao = sqlSession.getMapper(UserDao.class); 47 //调用userMapper的方法 48 List<User> list = userDao.findUserByName("小明"); 49 sqlSession.close(); 50 System.out.println(list); 51 } 52 53 @Test 54 public void insertUser() throws Exception { 55 SqlSession sqlSession = sqlSessionFactory.openSession(); 56 //创建UserMapper对象,mybatis自动生成mapper代理对象 57 UserDao userDao = sqlSession.getMapper(UserDao.class); 58 User user=new User(); 59 user.setAddress("深圳"); 60 user.setBirthday(new Date()); 61 user.setSex("女"); 62 user.setUsername("zhangjinru"); 63 //调用userMapper的方法 64 userDao.insertUser(user); 65 //提交事务 66 sqlSession.commit(); 67 sqlSession.close(); 68 } 69 70 @Test 71 public void deleteUser() throws Exception { 72 SqlSession sqlSession = sqlSessionFactory.openSession(); 73 //创建UserMapper对象,mybatis自动生成mapper代理对象 74 UserDao userDao = sqlSession.getMapper(UserDao.class); 75 //调用userMapper的方法 76 userDao.deleteUser(24); 77 // 提交事务 78 sqlSession.commit(); 79 sqlSession.close(); 80 } 81 82 @Test 83 public void testFindUserByIdResultMap() throws Exception { 84 SqlSession sqlSession = sqlSessionFactory.openSession(); 85 //创建UserDao对象,mybatis自动生成mapper代理对象 86 UserDao userDao = sqlSession.getMapper(UserDao.class); 87 //调用userDao的方法 88 User user = userDao.findUserByIdResultMap(1); 89 System.out.println(user); 90 } 91 92 93 }
8、整个工程目录结构
二、一些问题总结
1、在user.xml中namespace等于UserDao接口地址
2、UserDao.java接口中的方法名和user.xml中statement的id一致
3、UserDao.java接口中的方法输入参数类型和user.xml中statement的parameterType指定的类型一致。UserDao.java接口中的方法返回值类型和user.xml中statement的resultType指定的类型一致
4、代理对象内部调用selectOne或selectList ,如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
5、typeAliases(别名)
在user.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针parameterType或resultType指定的类型定义一些别名,在user.xml中通过别名定义,方便开发。
6、通过resource加载单个映射文件
7、通过mapper接口加载单个mapper,按照上边的规范,将User.java和User.xml放在一个目录 ,且同名。