配置Mybatis
- 所需jar
mybatis-xxx.jar
jdbc驱动包 - 配置文件
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>
<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/123?useSSL=FALSE&&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="932567"/>
</dataSource>
</environment>
</environments>
<!-- 加在映射文件 -->
<mappers>
<mapper resource="entity/personMapper.xml" />
</mappers>
</configuration>
注释版:
<!-- 指定运行数据库环境,可在build的第二个参数强行指定 -->
<environments default="development">
<!-- 可定义多个 -->
<environment id="development">
<!--事务提交方式:
JDBC:利用JDBC方式处理事务(commit rollback close)
MANAGER:将事务交由 其他组件去托管(spring , jobss),默认关闭连接
-->
<transactionManager type="JDBC"/>
<!-- 数据源类型
UNPOOLED :传统JDBC模式,每次都打开关闭
POOLED : 使用数据库连接池(一般)
JNDI : 从tomcat中获取内置的数据库连接池
-->
<dataSource type="POOLED">
<!-- 数据库信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/123?useSSL=FALSE&&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="932567"/>
</dataSource>
</environment>
</environments>
personMapper.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="entity.personMapper">
<select id="selectPersonById" resultType="entity.Person" parameterType="int">
select * from person where id = #{id}
</select>
</mapper>
其中,namespace是唯一标识符,最好是包名+xml名
3. 编码
实体类(POJO)属性跟表属性名字一样
//加载MyBatis配置文件(为了访问数据库)
Reader reader = Resources.getResourceAsReader("src/config.xml");
//SqlSessionFactory - connection
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
//namespcae+使用方法的 id
String statement = "entity.personMapper.selectPersonById";
Person person = sqlSession.selectOne(statement,1);
若为增删改,且事务提交方式为JDBC, 需要sqlsesson.commit();
可看:
<update id="updateStudentByStuNo" parameterType="entity.Student">
update student set stuName = #{stuName} ,stuAge = #{stuAge} ,graName = #{graName} where stuNo = #{stuNo}
</update>
<!-- 返回列表返回值是单个类型,在java处selectList即可 -->
<select id="queryAllStudents" resultType="entity.Student">
select * from student
</select>
mapper动态代理(MyBatis接口开发)
不同之处:省略statement(namespace+方法id)
接口的定义:
public interface StudentMapper {
/**
* 1 根据 接口名 找到 mapper.xml文件 (根据的是namespace = 接口全类名)
* 2 根据 接口的方法名 找到 mapper.xml文件中的 方法id
* 3 接口方法的 输入参数 和 mapper.xml 标签中的parameterType 类型一致
* 4 接口方法的 返回值 和 mapper.xml 标签中的 resultType 类型一致
*/
public Student queryStudentByStuNo(int stuNo);
public List<Student> queryAllStudents();
}
配置文件:
<mapper namespace="mapper.StudentMapper">
<select id="queryStudentByStuNo" parameterType="int" resultType="entity.Student">
select * from student where stuno = #{stuno}
</select>
</mapper>
执行时:
public void testSelect() throws IOException {
Reader reader = Resources.getResourceAsReader("myBatisConfig.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(reader).openSession();
//通过session对象获取接口
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.queryStudentByStuNo(7);
System.out.println(student);
}
总结:通过session对象获取接口,在调用接口中的方法,程序会自动执行该方法对应的SQL
输入参数:parameterType
-
类型为简单类型(8个基本类型加String)
- #{任意值}
${value} - #{ } 自动给String类型加上’ ‘(自动类型转换)
${ } 原样输出,适合于动态排序(动态字段,需要人工加’ ') - #{ } 防止sql注入
${ } 不防止
- #{任意值}
-
类型为简单类型 规则同上 1.b
-
#{属性名}
${属性名} -
#{属性名.属性名}
${属性名.属性名}
-