前言
数据库从最传统的JDBC连接方式和数据库池化技术到Hibernate的使用,再到Mybatis的快捷轻量级操作,技术迭代的速度飞快。
在了解了基础的理论和方法后,学习前沿编程框架、工具,我认为是一种必然的趋势。
再不看看外面,可能真的要落伍了~
之后,我借团队项目开发的机会,学习了Mybatis框架,和大家分享一下经验,愿意和大家共同进步!
正文
从零开始
参考:Mybatis官方文档
1. 下载Mybatis的jar包,并且导入
点击连接,选择下载Mybatis的jar包。这里有三个文件,基础使用的话,下载第一个mybatis-3.5.3.zip即可,如果需要查看源码的话,建议将Source code也下载下来,Windows使用zip,Ubuntu使用tar.gz;
Eclipse导入只要build puth即可,IDEA的话,在File->Project Structure里导入jar;(建议在项目内建一个lib文件夹,便于迁移)
只是数据库部分的话,以下两个包便足够了。
2. 新建Java Web Application,编写数据库配置文件
文件名可以自定义,我设置的是Mybatis.xml。但是要放到src的根目录下,这一点要注意。
注意:url的配置信息中 ” & " 符号无法解析,需要变为 “ & ";
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 <!--上面一段是非常重要的,有了这一段,xml的配置就拥有了自动补全,这也是考量Mybatis包是否导入成功的一个方面;--> 6 <configuration> 7 <!-- 可以兼容多种数据库,配置多个environment,default为当前配置--> 8 <environments default="mysql"> 9 <environment id="mysql"> 10 <transactionManager type="JDBC"/> 11 <!-- 使用数据库池化技术,详细可以看官方文档--> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.cj.jdbc.Driver"/> 14 <property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf-8"/> 15 <property name="username" value=username"/> 16 <property name="password" value="password"/> 17 </dataSource> 18 </environment> 19 </environments> 20 <!-- 映射文件路径,需要告诉数据库,要执行哪些操作,以及数据库实体类和字段的对应关系,接下来进行解释--> 21 <mappers> 22 <mapper resource="main/mapper/UserMapper.xml"/> 23 </mappers> 24 </configuration>
3. 编写执行SQL语句的SqlSessionFactory
可以编写工具类或者工厂类,避免代码重复。我这里设置的是DBTools.java
1 package main.dao; 2 3 import org.apache.ibatis.io.Resources; 4 import org.apache.ibatis.session.SqlSession; 5 import org.apache.ibatis.session.SqlSessionFactory; 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 7 8 import javax.annotation.Resource; 9 import java.io.IOException; 10 import java.io.InputStream; 11 12 /* 13 Comet_Fei 14 2019/11/17 15 */ 16 public class DBTools 17 { 18 private static SqlSessionFactory sqlSessionFactory; 19 20 static 21 { 22 try 23 { 24 //输入流读取文件 Resources Mybatis的自带加载类 25 InputStream config = Resources.getResourceAsStream("mybatis.xml"); 26 //工厂设计模式 27 sqlSessionFactory = new SqlSessionFactoryBuilder().build(config); 28 } 29 catch (IOException e) 30 { 31 e.printStackTrace(); 32 } 33 } 34 35 //创建可以执行映射文件sql的sqlsession 36 public static SqlSession getSqlSession() 37 { 38 return sqlSessionFactory.openSession(); 39 } 40 }
4. 编写实体类映射接口UserMapper.java
UserMapper接口和Mybatis的映射xml文件相对应,便于操作和使用
1 package main.mapper; 2 3 import main.pojo.User; 4 5 import java.util.List; 6 7 /* 8 Comet_Fei 9 2019/11/17 10 */ 11 public interface UserMapper 12 { 13 int addUser(User user); 14 User getUser(String userPhoneNumber); 15 int deleteUser(String userPhoneNumber); 16 int setPassword(User user); 17 List<User> listUser(); 18 19 }
5. 编写映射文件UserMapper.xml
这类文件非常重要,会将数据库表和Java代码的pojo(bean)进行映射,极大的简化了操作步骤,减小代码量。
参数说明:
resultMap是数据库表和实体的Map映射设置,在使用时,只要加入 resultMap="userResultMap" 参数即可,如select语句;
parameterType是传入的参数类型,如果传入参数较多的话,可以使用实体类传参;(还没有学习复杂语句,所以这里只是简单介绍)
resultType是返回值类型,但是不能和resultMap同时存在;
传参方式如代码所示,用 ${ } 标识参数,和接口一致;
<?xml version="1.0" encoding="UTF-8" ?> <!--这里的dtd配置文件也是让代码可以自动补全--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace是包名和类名,一定要设置--> <mapper namespace="main.mapper.UserMapper"> <!-- 映射关系,将表中的column字段和实体User类的属性相关联--> <resultMap id="userResultMap" type="main.pojo.User"> <result property="userPhoneNumber" column="user_phone_number"/> <result property="headPictureId" column="head_pictureId"/> <result property="rolePowerId" column="role_power_id"/> <result property="userName" column="user_name"/> <result property="userPersonalAutograph" column="user_personal_autograph"/> <result property="userPassword" column="user_password"/> <result property="userSex" column="user_sex"/> <result property="userEmail" column="user_email"/> <result property="userAddress" column="user_address"/> <result property="userUploadNumbers" column="user_upload_numbers"/> </resultMap> <!-- 添加用户--> <insert id="addUser" parameterType="main.pojo.User" > INSERT INTO user(user_phone_number, user_name, user_password) VALUES (${userPhoneNumber}, ${userName}, ${userPassword}); </insert> <!-- 删除用户--> <delete id="deleteUser" parameterType="String"> DELETE FROM user WHERE user_phone_number = ${userPhoneNumber}; </delete> <!-- 获得账号为user_phone_number的用户--> <select id="getUser" resultMap="userResultMap"> SELECT * FROM user WHERE user_phone_number = ${userPhoneNumber}; </select> <!-- 获得用户列表--> <select id="listUser" resultType="main.pojo.User"> SELECT * FROM user; </select> <!-- 重设密码--> <update id="setPassword" parameterType="main.pojo.User"> UPDATE user SET user_password = ${userPassword} WHERE user_phone_number = ${userPhoneNumber}; </update> </mapper>
6. 最后是操作层(DAO)UserDao.java
因为操作层有特定的业务,这里只是一个示意而已。java里面的main函数可以进行局部测试,便于和前端、控制器(servlet)等对接。
1 package main.dao; 2 3 import main.mapper.UserMapper; 4 import main.pojo.User; 5 import org.apache.ibatis.session.SqlSession; 6 7 import java.io.IOException; 8 9 /* 10 Comet_Fei 11 2019/11/17 12 */ 13 public class UserDao { 14 // 定义dao内的sqlSession和映射接口mapper 15 private SqlSession sqlSession; 16 private UserMapper mapper; 17 18 public UserDao() 19 { 20 // 通过工厂,初始化session;通过特有getMapper设置映射接口 21 sqlSession = DBTools.getSqlSession(); 22 mapper = sqlSession.getMapper(UserMapper.class); 23 } 24 25 //添加用户 成功1 失败0 26 public int addUser(String userPhoneNumber, String userPassword) throws IOException 27 { 28 //用户的 手机号,姓名(默认手机号),密码 29 User user = new User(userPhoneNumber,userPhoneNumber, userPassword); 30 int result = mapper.addUser(user); 31 sqlSession.commit(); 32 System.out.println(result); 33 return result; 34 } 35 36 //用户登录 短信 成功2;失败0 37 public int right(String userPhoneNumber) 38 { 39 int result; 40 User user = mapper.getUser(userPhoneNumber); 41 if(user != null) 42 { 43 result = 2;//登录成功 44 } 45 else 46 { 47 result = 0;//登录失败 48 } 49 sqlSession.commit(); 50 return result; 51 } 52 53 //用户登录 手机 密码 成功2;密码错误1;手机号错误0 54 public int right(String userPhoneNumber, String userPassword) 55 { 56 int result; 57 User user = mapper.getUser(userPhoneNumber); 58 if((user != null)&&(userPassword.equals(user.getUserPassword()))) 59 { 60 result = 2;//登录成功 61 } 62 else if(user != null) 63 { 64 result = 1;//密码错误 65 } 66 else 67 { 68 result = 0;//此手机号未注册 69 } 70 sqlSession.commit(); 71 return result; 72 } 73 74 //删除用户 成功是1,不成功是0 75 public int deleteUser(String userPhoneNumber) 76 { 77 int result = mapper.deleteUser(userPhoneNumber); 78 sqlSession.commit(); 79 return result; 80 } 81 82 //重设密码 83 public int setPassword(String userPhoneNumber, String userPassword) 84 { 85 User user = new User(userPhoneNumber, userPhoneNumber, userPassword); 86 return mapper.setPassword(user); 87 } 88 public static void main(String[] args) throws IOException { 89 UserDao dao = new UserDao(); 90 // System.out.println(dao.deleteUser("111")); //删除用户 91 // dao.addUser("111","111");// 添加用户 92 // System.out.println(dao.right("11"));//短信登录; 93 // System.out.println(dao.right("111","111"));//短信登录; 94 System.out.println(dao.setPassword("111","111")); 95 } 96 }
以上为全部内容,之后还会写一些关于IDEA操作上的快捷键,如,IDEA如何连接数据库、快速生成pojo实体类等的博客。
这里特别感谢博客:IDEA项目搭建四——使用Mybatis实现Dao层