mybatis是对持久层进行了封装、mybatis文档地址:https://mybatis.org/mybatis-3/zh/index.html
下面实现单表的增删改查操作。
1.新建maven项目命名为mybatis、并在pom.xml中引入相关依赖
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.itheimagroupId> <artifactId>mybaitsartifactId> <version>1.0-SNAPSHOTversion> <packaging>jarpackaging> <dependencies> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>3.4.5version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.6version> dependency> <dependency> <groupId>log4jgroupId> <artifactId>log4jartifactId> <version>1.2.12version> dependency> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.10version> dependency> dependencies> project>
2.数据库命名为eesy_mybatis,执行下列sql语句
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
3编写实体类User与QV,包目录结构如下
public class User implements Serializable { //实体属性与数据库字段一一对应 private Integer id; private String username; private Date birthday; private String sex; private String address; //getter/setter【已省略】 }
public class QV { private User user; private Listids; //getter/setter【已省略】 }
4.编写接口UserDao,包目录结构如下:
package com.dao; import com.domain.QV; import com.domain.User; import java.util.List; public interface userDao { //查询所有用户 ListfindAll(); //保存单个用户 int saveUser(User user); //更新用户信息 int updateUser(User user); //删除用户信息 int deleteUser(int id); //根据用户姓名模糊查询用户 List findUserByName(String name); // List findByQV(String name); //多条件查询 List findByUser(User user); //传入查询条件QV对多个ID进行范围查询 List findByIds(QV qv); }
5.编写mybaits的主配置函数SqlMapConfig.xml(命名随意,此处如此命名),包目录结构如下
xml version="1.0" encoding="UTF-8"?> DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC">transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root"/> dataSource> environment> environments> <mappers> <mapper resource="com/dao/userDao.xml"/> mappers> configuration>
6.编写子配置文件userDao.xml,包目录结构如下
xml version="1.0" encoding="UTF-8"?> DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dao.userDao"> <sql id="defaultUser"> select * from user sql> <select id="findAll" resultType="com.domain.User"> select * from user select> <insert id="saveUser" parameterType="com.domain.User"> insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday}); insert> <update id="updateUser" parameterType="com.domain.User"> update user set username=#{username},sex=#{sex} where id=#{id}; update> <delete id="deleteUser"> delete from user where id=#{id}; delete> <select id="findUserByName" parameterType="String" resultType="com.domain.User"> select * from user where username like #{username}; select> <select id="findByQV" parameterType="String" resultType="com.domain.User"> select * from user where username like #{user.username}; select> <select id="findByUser" parameterType="com.domain.User" resultType="com.domain.User"> select * from user <where> <if test="username!=null and username != ''"> and username like #{username} if> <if test="sex!=null and sex != ''"> and sex like #{sex} if> where> select> <select id="findByIds" parameterType="com.domain.QV" resultType="com.domain.User"> <include refid="defaultUser">include> <where> <if test="ids != null and ids.size()>0"> <foreach collection="ids" open="and id in (" close=")" item="id" separator=","> #{id} foreach> if> where> select> mapper>
7.编写测试类
package com.dao; import com.domain.QV; import com.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author admin * @version 1.0.0 * @ClassName mybaits.java * @Description TODO * @createTime 2020年01月10日 15:48:00 */ public class mybaits {
private InputStream in; private SqlSession sqlSession; private userDao userDao; @Before//用于在测试方法执行之前执行 public void init() throws Exception { //1.读取配置文件,生成字节输入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.获取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.获取SqlSession对象 sqlSession = factory.openSession(); //4.获取dao的代理对象 userDao = sqlSession.getMapper(userDao.class); } @After//用于在测试方法执行之后执行 public void destroy() throws Exception { //提交事务 sqlSession.commit(); //6.释放资源 sqlSession.close(); in.close(); } @Test public void findAll(){ Listlist = userDao.findAll(); for(User u : list){ System.out.println(u.toString()); } } @Test public void save() { User user = new User(); user.setUsername("modify User property"); user.setAddress("北京市顺义区"); user.setSex("男"); user.setBirthday(new Date()); //执行方法 userDao.saveUser(user); } @Test public void update() { User user = new User(); user.setId(51); user.setUsername("update UserName"); user.setSex("女"); //执行方法 userDao.updateUser(user); } @Test public void delete() { User user = new User(); user.setId(51); //执行方法 userDao.deleteUser(user.getId()); } @Test public void findByUserName() { //执行方法 List list = userDao.findUserByName("小%"); for(User user:list){ System.out.println(user.toString()); } } @Test public void findByQV() { //执行方法 List list = userDao.findByQV("小%"); for(User user:list){ System.out.println(user.toString()); } } //多条件查询 @Test public void findByUser() { User user = new User(); user.setUsername("小%"); user.setSex("男"); //执行方法 List list = userDao.findByUser(user); for(User u:list){ System.out.println(u.toString()); } } //多个ID进行范围查询 @Test public void findByIds() { List list = new ArrayList (); list.add(42); list.add(43); list.add(45); QV qv = new QV(); qv.setIds(list); //执行方法 List users = userDao.findByIds(qv); for(User u:users){ System.out.println(u.toString()); } } }
笔记:
无反射不框架,mybatis框架很多地方要求一一对应,按别人的规则来利用这种一一对应以及相应的getter/setter可帮助开发
动态SQL是mybatis的一大特点,上述简单使用了下,动态sql文档的说明:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
尽量保证实体类的属性与数据库字段的列名一致,如果不一致需要自己在子配置文件中进行相关配置,用resultMap
<resultMap id="userMap" type="uSeR"> <id property="userId" column="id">id> <result property="userName" column="username">result> <result property="userAddress" column="address">result> <result property="userSex" column="sex">result> <result property="userBirthday" column="birthday">result> resultMap>