Mybatis初步搭建
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,是一个基于Java的持久层框架。
本文参考于:https://www.jianshu.com/p/c77e3691867d
为啥要用呢?
在我们传统的 JDBC 中,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,闲的繁琐又枯燥。
而我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。
如何使用呢?
我的愚见初略的理解是
本次使用的是oracle数据库。
第一步 导包
首先在maven的pom文件中导入oracle和mybatis的包。
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
第二步 创建实体类
创建一个pojo包,里面含有数据库字段所对应的实体类。
我的数据库是这样的:
package com.beans;
public class polo {
String name;
String password;
String studentid;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getStudentid() {
return studentid;
}
public void setStudentid(String studentid) {
this.studentid = studentid;
}
}
第三步 创建配置文件 mybatis.cfg.xml
在resources目录下建立一个叫mybatis.cfg.xml的文件,其作用是提供连接数据库用的驱动,数据名称,编码方式,账号密码等。以及加载mapper.xml文件
配置文件的大部分内容都是固定的
1.扫描包的地方填写的是扫描实体类所对应的包
2.连接数据库填的是自己的数据库信息
3.mapper则是后面写sql语句的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>
<!-- 扫描包 -->
<typeAliases>
<package name="com.beans"/>
</typeAliases>
<!-- 连接数据库 -->
<environments default="cybatis">
<environment id="cybatis">
<!--事务管理方式 jdbc -->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池的方式 POOLED JNDI -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="system"/>
<property name="password" value="sun"/>
</dataSource>
</environment>
</environments>
//之后写sql语句的mapper文件
<mappers>
<mapper resource="zhuce.xml"></mapper>
</mappers>
</configuration>
第四步 创建配置文件 *.xml和创建对应接口
*指的是里面含sql语句的文件,名字可以自己起
下面的两句话是所有的含sql的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">
*.xml文件接下来的代码如下:
- namespace是接口所对应的包,这就是和接口关联的操作
- insert语句就选insert方法,id是接口中自己起名的方法
- selectKey是查询序列的方法,keyProperty是查询出来以后的名字,resultType是查询出来的类型,order有两种选择BEFORE、AFTER,BEFORE是执行完上面的selectKey方法在执行sql语句,AFTER是执行完下面的在执行上面的
- 后面的values()里面需要放在#{*}
//namespace
<mapper namespace="com.inter.jiekou">
//insert
<insert id="insertuser">
//selectKey
<!-- <selectKey keyProperty="name" resultType="java.lang.Integer" order="BEFORE">-->
<!-- select t_users_seq.nextval from dual-->
<!-- </selectKey>-->
insert into xinxi0708(name,password,studentid) values(#{name},#{password},#{studentid})
</insert>
</mapper>
接口中代码如下:
方法名是上面insert方法里面的id
//接口文件,写好方法名 对应mapper.xml里面的方法名
public interface jiekou {
//增加数据
int insertuser(polo p);
}
第五步 创建一个SqlSessionFactory操作SqlSession的方法
mybatis.cfg.xml到java里面变成一个sqlsession对象,但是sqlsession不能直接被操控,只能使用sqlsessionfactory来操作数据
import org.apache.ibatis.io.Resources;
public class dbt {
static SqlSessionFactory sqlSessionFactory;
static {
try {
//读取配置文件
Reader re= Resources.getResourceAsReader("mybatis.cfg.xml");
//建立sqlSessionFactory
sqlSessionFactory=new SqlSessionFactoryBuilder().build(re);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getcc(){
return sqlSessionFactory.openSession();
}
public static void main(String[] args) {
System.out.println(getcc()); //得到连接数据库的会话
}
}
第六步 编写测试类
public class caozuozz {
public static void getccd(){
//首先需要一个数据
SqlSession ss= dbt.getcc(); //建立连接的会话
//取到ss下的usermapper.xml文件
jiekou jj=ss.getMapper(jiekou.class);
polo pp=new polo();
pp.setName("qwe");
pp.setPassword("wer");
pp.setStudentid("rty");
jj.insertuser(pp);
ss.commit();
}
public static void main(String[] args) {
getccd();
}
}
第五步第六步的代码也可以合并写成
e.g:偷别人的
public class TestMyBatis {
public static void main(String[] args) throws IOException {
// 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 然后根据 sqlSessionFactory 得到 session
SqlSession session = sqlSessionFactory.openSession();
// 最后通过 session 的 selectList() 方法调用 sql 语句 listStudent
List<Student> listStudent = session.selectList("listStudent");
for (Student student : listStudent) {
System.out.println("ID:" + student.getId() + ",NAME:" + student.getName());
}
}
}
本次的思考图我认为可能是这样的
第七步 结果集和查询:
增加,删除和修改返回的都是受影响的行数,也就是返回一个int值,但是查询不一样,查询返回的往往是一个对象或是一个具体的数据类型。
例如:修改的方法
<update id="updateu">
update t_users set username=#{username},password=#{password},account=#{account} where id=#{id}
</update>
当返回结果是一个对象或者多个对象的时候,我们需要创建一个结果集。
结果集代码也在mapper文件的下面。
子元素id代表resultMap的主键,而result代表其属性。id和result都是映射单列值到一个属性或字段的简单数据类型。
唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射
结果集内的标签名的意思:
resultMap的id是mapper文件内其他查询语句调用它的时候所需要的,type类型是返回的结果类型(javabean内的类)
1.property是该结果集在本页面的名字
2.column是数据库内的名字
3.javaType是返回类型
结果集具体代码如下:
<resultMap id="usermaps" type="User">
<!-- 第一个property是本页面的名字,第二个column是数据库内的名字,第三个javaType是返回类型-->
<id property="id" column="id" javaType="java.lang.Integer"></id>
<result property="username" column="username" javaType="java.lang.String"></result>
<result property="password" column="password" javaType="java.lang.String"></result>
<result property="account" column="account" javaType="java.lang.Double"></result>
</resultMap>
查询时的调用:
查询整张表的集合:
<select id="selectAll" resultMap="usermaps">
select *from t_users
</select>
当where个数为单个时的查询的集合:
parameterType在where个数为单个时要写,两个及以上不用写
<select id="selecuserbylid" resultMap="usermaps" parameterType="int">
select *from t_users where id=#{id}
</select>
当where个数为多个时的查询的集合:
不需要写parameterType,但是where查询内的要写成#{0}、#{1}…
注:在mybatis版本在3.4.4以上的时候写成#{arg0}、#{arg1}…
<!-- 多个参数时,不需要写parameterType-->
<!-- 在mybatis 3.4.4版本以上不能写#{0}而是要写#{arg0}-->
<select id="selects" resultMap="usermaps">
select *from t_users where username=#{arg0} and password=#{arg1}
</select>
查询单个的字段:
<select id="selectname" resultType="java.lang.String" parameterType="int">
select username from t_users where id=#{id}
</select>
查询时,多个框可能没有的情况:
第一种方法(selectif):
<select id="selectif" parameterType="User" resultMap="usermaps">
select *from t_users
<where>
<if test="account!=0">
and account>#{account}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
第二种方法:
<select id="selectwhen" parameterType="User" resultMap="usermaps">
select *from t_users
<where>
<choose>
<when test="username!=null">
username=#{username}
</when>
<when test="account!=0">
account>#{account}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
两种方法都行,但是第二种效率高一点,因为第一种每个if都要判断
本文地址:https://blog.csdn.net/weixin_46744534/article/details/107289902
上一篇: 夹娃展示目录结构