使用MyBatis进行简易开发
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录(MyBatis是一个优秀的ORM框架)
1.创建Maven工程
注意:先安装好maven
然后在Eclipse里配置好maven
maven仓库:
https://mvnrepository.com
创建好的maven工程图如下所示]
2.导入jar包
打开上面给的maven仓库的网址,从上面搜索你想要的jar包,配置到pom.xml文件中
我配置的是
1.junit的jar包 4.12版本
2.log4j的jar包 :1.2.16版本
3.MySQL的jdbc连接jar包 5.1.41版本
mysql-connector-java
4.MyBatis的jar包 3.3.1版本
<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.yckj</groupId>
<artifactId>java_MyBatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>java_MyBatis</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
</dependencies>
</project>
上面用的是Eclipase,如果是IDEA的话还需要加上以下代码
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
3.编写MyBatis的全局配置文件及数据库配置文件
这两个文件都放在src目录下
3.1 mybatis-config.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>
<!-- 引用数据库配置文件 -->
<properties resource="db.properties"></properties>
<environments default="development">
<!-- 配置环境,id是唯一的,development表示开发环境 -->
<environment id="development">
<!-- 事务管理,默认是JDBC -->
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<!-- name是db.properties的属性名,values是值 ,这里的name和value需要一样,并且要和之前的db.properties的属性名相对应-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 配置映射文件,在mybatis-config.xml中配置映射文件 -->
<!-- 这块的地址是你所要映射文件的地址 -->
<mapper resource="com/yckj/java_MyBatis/ClassMapper.xml"/>
</mappers>
</configuration>
3.2 db.properties
这块的properties配置文件主要就是为了获取数据库的连接
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/info?useSSL=false
username = ****
password = *********
最后的结果图如下所示
4.编写ORM映射类POJO
这块的字段要和你表中的字段相一致
@AllArgsConstructor // 所有参数构造方法
@NoArgsConstructor //无参构造方法
@Data //数据的注解会自动提供所有属性的get和set方法,及equals和hashCode方法等
public class Class1 implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer cno;
private String cname;
private String cteacher;
}
5. 编写ClassMapper接口(增删改查)
public interface ClassMapper {
/**
* 添加班级
* @param class1
* @return
*/
int insert(Class1 class1) ;
/**
* 修改班级
* @param class1
* @return
*/
int update(Class1 class1) ;
/**
* 通过班号删除班级
* @param cno
* @return
*/
int deleteByCno(int cno);
/**
* 通过班号查询班级信息
* @param cmo
* @return
*/
Class1 selectByCno(int cno);
/**
* 查询所有班级信息
* @return
*/
List<Class1> selectAll();
}
6.编写ClassMapper.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">
<!-- namespace的值写对应的接口ClassMapper的全限定名(包名+类名) -->
<mapper namespace="com.yckj.java_MyBatis.ClassMapper">
<!-- select是查询标签,表示写入查询语句 -->
<!-- id必须和ClassMapper里的方法名相同,唯一的id,所以方法不能重载
parameterType:表示selectById方法的输入参数的数据类型
resultType:表示selectById方法的输出参数返回值的数据类型(如果没有定义别名,使用全限定名)
注意:sql语句中的#{0}表示第一个参数,如果方法的参数只有一个或者几个参数的数据类型都相同,可以使用#{0},#{1},表示第一第二个参数
如果参数有多个,但是参数类型都不相同,就需要在方法参数前使用@parm注解,比如@parm("id")
-->
<select id="selectByCno" parameterType="int"
resultType="com.yckj.java_MyBatis.Class1">
SELECT * FROM CLASS1 WHERE CNO=#{0};
</select>
<!-- 查询出的结果集如果是list集合,resultType的返回结果参照单挑记录数据类型 -->
<select id="selectAll" resultType="com.yckj.java_MyBatis.Class1">
SELECT * FROM CLASS1;
</select>
<!-- 增删改不能设置resultType属性值 -->
<!-- 添加数据
如果parameterType参数值是一个实体类,那么values后面设置值就和POJO的属性名一样,
当属性名和数据表的字段名全部一样,就能够映射成功,如果只有部分属性名和字段名相同,那么内部会创建对象,相同的能够映射成功,
但是不相同的值就会映射不成功,如果全部不相同,就不会创建对象,都映射不成功,会报错
-->
<insert id="insert" parameterType="com.yckj.java_MyBatis.Class1">
INSERT INTO CLASS1 VALUES(#{cno},#{cname},#{cteacher})
</insert>
<delete id="deleteByCno" parameterType="int" >
DELETE FROM class1 WHERE cno=#{0};
</delete>
<update id="update" parameterType="com.yckj.java_MyBatis.Class1">
UPDATE class1 SET cname=#{cname},cteacher=#{cteacher} WHERE cno=#{cno};
</update>
</mapper>
7.测试代码
注意:动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
public class ClassMapperTest {
private Logger logger = Logger.getLogger(this.getClass());
SqlSession sqlsession = null;
InputStream inputStream = null;
SqlSessionFactory sqlSessionFactory = null;
/**
* 单元测试前执行,一般用于读取配置文件或者需要先执行的代码
*/
@Before
public void begin() {
String resource = "mybatis-config.xml";
try {
// 1.读取全局配置文件mybatis-config.xml内容
inputStream = Resources.getResourceAsStream(resource);
// 2.创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.创建SqlSession会话对象,用于数据库CRUD操作
sqlsession = sqlSessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 单元测试后执行,一般用于关闭资源或者后执行的代码
*/
@After
public void close() {
if (sqlsession != null) {
sqlsession.close();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 通过cno查询班级信息测试
*/
@Test
public void testSelectByCno() {
Class1 class1 = sqlsession.selectOne(ClassMapper.class.getName()+".selectByCno", 1001);
logger.debug(class1);
}
/**
* 查询所有班级信息测试
*/
@Test
public void testSelectAll() {
List<Class1> list = sqlsession.selectList(ClassMapper.class.getName()+".selectAll");
for (Class1 class1 : list) {
logger.debug(class1);
}
}
/**
* 添加测试
*/
@Test
public void testInsert() {
Class1 class1 = new Class1();
class1.setCno(1003);
class1.setCname("C#");
class1.setCteacher("wang");
int res = sqlsession.insert(ClassMapper.class.getName() + ".insert", class1);
if(res > 0) {
// 提交事务,默认是手动提交
sqlsession.commit();
logger.debug("添加成功");
}else {
sqlsession.rollback();
logger.debug("添加失败");
}
}
/**
* 通过id删除测试
*/
@Test
public void testDeleteById() {
int res = sqlsession.delete(ClassMapper.class.getName()+".deleteByCno", 1003);
if(res > 0) {
// 提交事务,默认是手动提交
sqlsession.commit();
logger.debug("删除成功");
}else {
sqlsession.rollback();
logger.debug("删除失败");
}
}
/**
* 测试修改
*/
@Test
public void testUpdate() {
Class1 class1 = new Class1();
class1.setCno(1002);
class1.setCname("C#");
class1.setCteacher("wang");
int res = sqlsession.update(ClassMapper.class.getName()+".update", class1);
if(res > 0) {
// 提交事务,默认是手动提交
sqlsession.commit();
logger.debug("修改成功");
}else {
sqlsession.rollback();
logger.debug("修改失败");
}
}
}