1.在终端建库建表
<!--建库-->
create database if not exists has character set utf8 collate utf8_general_ci;
character set utf8: 字符集
collate utf8_general_ci:校队集
<!--建表-->
create table if not exists student
(sid Integer primary key auto_increment,
name varchar(20),
age Integer)charset=utf8;
2.pom.xml
<!-- 统一版本管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.junit>4.12</project.junit>
<project.mybatis>3.4.6</project.mybatis>
<project.jdbc.connector>8.0.11</project.jdbc.connector>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>${project.junit}</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${project.mybatis}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${project.jdbc.connector}</version>
</dependency>
</dependencies>
3.mybatis_config.xml
<!--为java类型起别名,在配置文件中就可以使用别名 目的: 书写简单方便-->
<typeAliases>
<typeAlias type="com.xalo.model.Student" alias="Student"/>
</typeAliases>
<!--数据库环境配置,一个环境对应一个数据库,和spring整合之后,就不在配置-->
<environments default="development">
<environment id="development">
<!-- 事物类型配置 JDBC:使用JDBC的事物管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源的配置 POOLED:使用mybatis默认的数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- useSSL=false: 是否使用加密 -->
<property name="url" value="jdbc:mysql://localhost:3306/has?useUnicode=true&characterEncoding=UTF8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
<!--映射文件导入-->
<!--当满足下面条件时,可以写成
1.接口和映射文件在同一包下
2.接口名和映射文件名一致-->
<mappers>
<package name="com/xalo/dao"/>
</mappers>
<!--当不满足以上两个条件时,映射文件的如下导入-->
<mappers>
<mapper resource="com/xalo/dao/studentDao.xml"/>
</mappers>
4.建包: com.xalo.model
mapper:mapper中写的都是sql语句,将sql语句和代码解耦
namespace:需要写成接口的完整类名(包名.接口名) 不同mapper中的sql语句的隔离
增删改常见属性:
id: 该条sql语句的唯一标识符sql语句的id必须是对应的方法名
parameterType:
传入该sql语句的参数的类型,必须和方法的参数类型保持一致
flushCache:
任何时候只要语句被调用,都会导致本地缓存和二级缓存被清空,默认为true(对应插入,更新和删除语句)
timeout:
这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数.默认为unset(依赖驱动)
#{ }:数值绑定
${ } 和#{ }的区别
#:将传入的数据当成一个字符串,会对自动传入的数据加一个双引号
$:将传入的数据直接显示生成在sql中
#:方式能够很大程度的防止sql注入
$:方式无法防止sql注入
MyBatis排序时使用order by动态参数时,用$而不是#
修改常见属性:
resultType:必须和方法的返回值保持一致
所有更新操作(增删改)操作,不用指定返回值类型,默认返回受影响的行数.
resultMap:将查询结果集合中的列一一映射到java对象的各个属性,
常用与多表查询以及查询时使用别名的情况
mybatis在3.4.4之后不能直接使用 #{index},替换为#{argindex}
index指的是参数的位置,从0开始.如果有多个参数就不需要指定paramerType.
//com.xalo.model
//(1) Student.java
public class Student{
private String name;
private Integer age;
//提供构造方法(无参,有参)
//提供setter getter方法
//提供toString()方法
}
//com.xalo.dao
//(2)StudentDao
public interface StudentDao {
public void addStudent(Student student);
//查询所有的学生
public List<Student> queryAllStudent();
//根据id查询学生
public Student queryStudentById(Integer id);
//查询姓名
public List<Student> queryAllStudentName();
//查询多条记录中的某几个字段
public List<Map<String, Object>> queryMulField2();
//不使用resultMap时,查询多条记录中的某几个字段
public List<Map<String, Object>> queryMulField();
//根据id修改姓名,方法的返回值代表修改的总数
public Integer updateNameById(String name,Integer id);
}
//studentDao.xml
/*mybatis面向接口的编程:
* 可以把该配置文件看作是接口的实现类,最终会根据该配置文件生成对应接口的实习类
* 1.namespace: 需要写成接口的完整类名(包名.接口名)
* 2.sql语句的id必须是对应的方法名
* 3.parameterType:必须和方法的参数的类型保持一致
* 4.resultType: 必须和方法的返回值保持一致
* 5.所有的更新操作(增删改)操作,不用指定返回值类型(resultType),默认返回受影响的行数
* 6.mybatis在3.4.4之后不能直接使用#{index},替换为 #{argindex} index:参数的位置,从0开始.
* 7.mapper中书写的是sql语句,将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="com.xalo.dao.inter.StudentDao">
<insert id="addStudent" parameterType="Student">
insert into student (name,age) values(#{name},#{age});
</insert>
<select id="queryAllStudent" resultType="Student">
select * from student;
</select>
<select id="queryStudentById" parameterType="Integer" resultType="Student">
select * from student where id = #{id};
</select>
<select id="queryAllStudentName" resultType="java.lang.String">
select name from student;
</select>
// 查询表中的某几个字段的值
<resultMap type="java.util.Map" id="stuMap">
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
// 查询结果为多条记录的某几个字段
<select id="queryMulField2" resultMap="stuMap">
select id,age from student;
</select>
// 不使用resultMap时, 查询表中某几个字段的值
<select id="queryMulField" resultType="java.util.Map">
select id,age from student;
</select>
<update id="updateNameById">
update student set name=#{arg0} where id = #{arg1};
</update>
</mapper>
//com.xalo.test
//(3) DaoTest 新建JUnit Test Case
//面向接口的编程,核心是代理模式
/*常用对象的作用域
*1.SqlSessionFactoryBuilder:作用是用来创建session工厂
* 所以session工厂创建成功,就可以将其所占有的资源释放掉,作用域就是一个局部变量
*2.SqlSessionFactory:作用是用来创建session对象,我们没有必要每创建一个session对象,就是一个新的session工厂对象;
* 所以 SqlSessionFactory对象的作用域为整个应用. 单例模式
*3.SqlSession:
* 作用使用CURD数据使用,由于该对象是非线程安全的,所以我们希望每个线程都拥有自己的session对象.
*/
public class DaoTest {
@Before
public void before() throws IOException {
//(1)读取mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml");
//(2)创建配置文件并创建session工厂
sf = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void addStudent(){
//(3)创建session对象
SqlSession session = sf.openSession();
//(4)创建要插入数据库中的对象
Student student = new Student(2,"鬼王",25);
//参数1: 映射文件的sql语句; 参数2: 要插入的对象
session.insert("com.xalo.model.Student.addStudent", student);
session.commit();
session.close();
System.out.println(student);
}
@Test
public void testInterface(){
SqlSession session = sf.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
//加载接口,使用接口中的方法
List<Student> list = studentDao.queryAllStudent(); //查询所有学生
List<Student> list = studentDao.queryAllStudentName(); //查询姓名
List<Map<String, Object>> list = studentDao.queryMulField2();//查询多条记录中的某几个字段
List<Map<String, Object>> list = studentDao.queryMulField();//不使用resultMap时,查询多条记录中的某几个字段
session.commit();
session.close();
System.out.println(list);
}
@Test
public void queryStudentById(){
SqlSession session = sf.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
//加载接口,使用接口中的方法
Student student = studentDao.queryStudentById(1);
session.commit();
session.close();
System.out.println(student);
}
@Test
public void updateNameById(){
SqlSession session = sf.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
//加载接口,使用接口中的方法
Integer count = studentDao.updateNameById("周帅", 1);
session.commit();
session.close();
System.out.println("修改成功" + count);
}
@After
public void after() {
}
}