(仅学习过程的总结,仅供备忘,可能存在错误)
一、配置形式进行
1.导包:myBatis.jar和数据库的jar包(如mysql-connector-java-8.0.15.jar)
2.创建实体类(orm):如Person
3.在同路径下配置personMapper.xml(其实该xml文件是实现把sql语句从代码中抽离写在这里)
namespace通常取 包名.该mapper名;
配置sql语句时要写id,后面通过namespace+id唯一确定sql语句
<?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="myBatisDemo.personMapper">
<select id="qureyPersonById" resultType="myBatisDemo.Person" parameterType="int">
select * from person where id = #{id}
</select>
<insert id="insertImf" parameterType="myBatisDemo.Person">
insert into person value(#{id},#{name},#{age})
</insert>
<delete id="deleteImf" parameterType="int">
delete from person where id = #{id}
</delete>
<update id="updateImf" parameterType="myBatisDemo.Person">
update person set name=#{name},age=#{age} where id = #{id}
</update>
<select id="selectAll" resultType="myBatisDemo.Person">
select * from person
</select>
</mapper>
4.配置myBatis配置文件conf.xml(src目录下)
该配置文件配置连接数据库的用户名、密码、url等,
以及引入mapper文件
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql_db?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="myBatisDemo/personMapper.xml"/>
</mappers>
</configuration>
5.进行数据库操作
//读入配置文件,放入SqlSessionFactoryBuilder工厂,获得SqlSession对象
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
//根据namespace+id唯一确定sql语句,执行操作
String statement = "myBatisDemo.personMapper.qureyPersonById";
Person person = session.selectOne(statement, 1);
// session.insert(statement, person);
// session.commit();
二、基于代理方式(约定由于配置)
具体步骤:
1.基础环境如上配置形式,导包、xml文件
2.不同之处:
不再用statement(即namespace+id),而是根据约定可直接定位出sql语句。
即编写一个接口,接口中:
1.接口的类名与mapper文件的namespace名一致(所以两个文件放一起)
2.接口的方法名与mapper文件的语句的id名一致
3.方法的返回值与resultType一致
4.方法的输入参数与parameterType一致
- //读入配置文件,放入SqlSessionFactoryBuilder工厂,获得SqlSession对象
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
PersonMapper sm = session.getMapper(PersonMapper.class);//利用反射调用接口(该接口不需要实现类)
sm.queryPersonById(1);//调用接口中的方法
三、设置别名
在conf.xml文件:
<typeAliases>
<!-- 单个设置别名 -->
<typeAlias type="myBatisDemo.Person" alias="person"/>
<!-- 批量设置别名 ,自动设置-->
<package name="myBatisDemo.Person" />
</typeAliases>
四、输入参数parameterType(输入参数也可以是HashMap<>,key值与配置文件中的#{}对应)
-
#{} 和 ${}
1)区别:
a.类型为 简单类型(8个基本类型+String):#{任意值},${vulue} 类型为对象,#{属性值},${属性值} b.#{}自动给String类型加上'',${}则原样输出(适用于动态排序) 例:String类型的value, #{value} = '${value}'; 动态排序:select * from student order by ${value} asc c.#{}可以防止sql注入,${}不防止
2)相同:
都可以获取对象的值(嵌套类型对象) a.获取对象的值 模糊查询 select stuno,stuname,stuage from student where stuage = #{stuage} or stuname like #{stuname} Student student = new Student(); student.setStuAge(24); student.setStuName("%w%"); ...... 或 select stuno,stuname,stuage from student where stuage = #{stuage} or stuname like '%${stuname}%' b.嵌套类型对象 #{address.homeAddress} Student student = new Student(); Address address = new Address(); address.setHomeAddress("mm"); address.setSchoolAddress("kk"); student.aetAddress(address); session.query(student);
五、myBatis调用存储过程(代理方式)(输入参数是HashMap<>)
1.在数据库写好存储过程
create PROCEDURE pro1(in gname VARCHAR(255), out scount INT)
BEGIN
select count(*) into scount from person where name = gname;
END
在这里插入代码片 2.在mapper配置文件中调用
<select id="callbackFn" statementType="CALLABLE" parameterType="HashMap">
{CALL pro1(#{gname,jdbcType=VARCHAR,mode=IN},#{sCount,jdbcType=INTEGER,mode=OUT})}
</select>
注:statementType="CALLABLE" parameterType="HashMap"
3.通过hashmap传参即获得返回结果
personMapper personMapper = session.getMapper(personMapper.class);
Map<String, Object> param = new HashMap<String, Object>();
param.put("gname", "da");
personMapper.callbackFn(param);//传参
System.out.println(param.get("sCount")); //获得返回值
注:增删改需要提交事务session.commit();
六、输出参数resultType
1.简单类型(8个基本类型+String)
2.实体对象类型、实体对象类型(用lis接收)
3.HashMap
<select id="st" resultType="HashMap">
<!-- 别名作为map的key-->
select stuno "no",stuname "name" from student where stuno = 1
</select>
注:HashMap虽然是一个集合,但他仅获得一个数据项的多个元素(如一个学生的学号、姓名),若要
获得多个,可以List<HashMap<String,Object>> resultList = studentMpapper.queryBy…();
注:当数据库表的字段名与实体类的属性名不一致时,可以通过resultMap来实现映射
<select id="st" resultMap="mapId" >
select id ,name from student where id = 1
</select>
<resultMap type="student" id="mapId">
<id property="stuNo" column="id" />//主键用id
<result property="stuName" column="name"/>
</resultMap>