Mybatis入门
什么是Mybatis
百度解释:
简单地讲Mybatis是持久层的一个高度的封装,不同于DButils,它的封装程度更加的高,让程序员只关心sql语句本身而不是jdbc的流程操作。
Mybatis简单Demo创建流程:
1.新建一个maven项目
2.配置pom.xml
pom.xml的配置参考:https://mybatis.org/mybatis-3/getting-started.html
<?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.0</modelVersion> <groupId>com.itzyb</groupId> <artifactId>day01_eesy_mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies> </project>
dao层:
package com.itzyb.dao; import com.itzyb.domain.User; import java.util.List; /** * 用户持久层接口 */ public interface UserDao { List<User> selAll(); }
pojo(JavaBean、domain)层(注意这里的变量名和数据库对应表的名称一致)
package com.itzyb.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
resources下的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"> <!-- mybatis的主配置文件 --> <configuration> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 --> <mappers> <mapper resource="com/itzyb/dao/UserDao.xml"/> </mappers> </configuration>
resources下的com.itzyb.dao(三级目录,这个目录和创建dao层的目录一致)下的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.itzyb.dao.UserDao"> <!-- 查询所有--> <!-- ResultType是返回类型--> <select id="selAll" resultType="com.itzyb.domain.User"> <!-- sql语句--> select * from my_user </select> </mapper>
test下的java的com.itzyb
测试代码:
package com.itzyb; import com.itzyb.dao.UserDao; import com.itzyb.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 java.io.InputStream; import java.util.List; /** * * mybits入门案例 */ public class Test { public static void main(String[] args) throws Exception { //1.读取配置文件 //2.创建SqlSessionFactory //3.使用工厂生产SqlSession对象 //4.使用SqlSession创建Dao接口代理对象 //5.使用代理对象执行方法 //6.资源释放 //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 SqlSession session = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 UserDao userDao = session.getMapper(UserDao.class); //5.使用代理对象执行方法 List<User> users = userDao.selAll(); for(User user : users){ System.out.println(user); } //6.释放资源 session.close(); in.close(); } }
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=d:\axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
测试结果:
上面的是使用xml的方式将数据库与实体类进行关联,还可以通过注解的方式进行关联
使用注解和xml的不同的地方:
1.不需要写UserDao.xml(之前是写sql语句的地方以及声明返回类型),所以可以将三级目录连带文件直接删除就行了
UserDao的替代品:直接在UserDao使用@select注解
2. SqlMapConfig中的变化:
使用xml的时候mappers中的语句:
使用注解之后mappers中的语句:
文件目录结构:
数据库设计:
建表:
CREATE TABLE `my_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 AUTO_INCREMENT=49 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','女','北京修正');
查询所有流程分析:
测试代码分析:
遇到的问题:
Unknown initial character set index '255' received from server.//编码问题
解决:
<property name="url" value="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf8"/>
Intellij idea 报错:Error : java 不支持发行版本5
解决:https://blog.csdn.net/qq_22076345/article/details/82392236