MyBatis学习笔记

Posted 佳云分享网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis学习笔记相关的知识,希望对你有一定的参考价值。

1.对原生态jdbc程序中的问题总结

1.1 环境准备

java环境:jdk 1.8.0_92

eclipse:neon(indigo)

mysql:5.7.4

1.2 创建mysql测试数据库

sql_table.sql:记录表结构

sql_data.sql:记录测试数据,在实际的企业开发中,最后提供一个数据初始化脚本。

1.3 使用jdbc查询mysql数据库用户表中的记录。

1.3.1 创建java工程,加入mysql驱动包

1.3.2 编写测试类,代码:

package org.hxweb.web.ssm.jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**

* @see jdbc程序测试

* @author Administrator

*

*/

public class JdbcTest {

public static void main(String[] args) {

// 数据库连接

Connection connection = null;

// 预编译的Statement,使用预编译的Statement提高数据库性能

PreparedStatement preparedStatement = null;

// 结果 集

ResultSet resultSet = null;

try {

// 加载数据库驱动

Class.forName("com.mysql.jdbc.Driver");

// 通过驱动管理类获取数据库链接

connection = DriverManager.getConnection("jdbc:mysql://192.168.1.107:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false","root", "bd+?Ki)eb1kO");

// 定义sql语句 ?表示占位符

String sql = "select * from user where username = ?";

// 获取预处理statement

preparedStatement = connection.prepareStatement(sql);

// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值

preparedStatement.setString(1, "王五");

// 向数据库发出sql执行查询,查询出结果集

resultSet = preparedStatement.executeQuery();

// 遍历查询结果集

while (resultSet.next()) {

System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));

}

} catch (Exception e) {

e.printStackTrace();

} finally {

// 释放资源

if (resultSet != null) {

try {

resultSet.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (preparedStatement != null) {

try {

preparedStatement.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (connection != null) {

try {

connection.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

MyBatis学习笔记(一)

3. 入门程序

3.1 需求

根据用户id(主键)查询用户信息

根据用户名称模糊查询

添加用户

删除用户

更新用户

3.2 环境准备

java环境:jdk 1.8.0_92

eclipse:neon(indigo)

mysql:5.7.4

mybatis 3.3.0

maven依赖库加载

lib下:依赖包

mybatis-3.3.0.jar:核心 包

mybatis-3.3.0.pdf,操作指南

加入mysql的驱动包    

3.3 log4j.properties

#log4j.rootLogger=INFO,Console,File

log4j.rootLogger=DEBUG,Console,File  

#u5B9Au4E49u65E5u5FD7u8F93u51FAu76EEu7684u5730u4E3Au63A7u5236u53F0  

log4j.appender.Console=org.apache.log4j.ConsoleAppender  

log4j.appender.Console.Target=System.out  

#u53EFu4EE5u7075u6D3Bu5730u6307u5B9Au65E5u5FD7u8F93u51FAu683Cu5F0FuFF0Cu4E0Bu9762u4E00u884Cu662Fu6307u5B9Au5177u4F53u7684u683Cu5F0F  

log4j.appender.Console.layout = org.apache.log4j.PatternLayout  

log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  

#u6587u4EF6u5927u5C0Fu5230u8FBEu6307u5B9Au5C3Au5BF8u7684u65F6u5019u4EA7u751Fu4E00u4E2Au65B0u7684u6587u4EF6

log4j.appender.File = org.apache.log4j.RollingFileAppender  

#u6307u5B9Au8F93u51FAu76EEu5F55  

log4j.appender.File.File = logs/mybatis.log  

#u5B9Au4E49u6587u4EF6u6700u5927u5927u5C0F  

log4j.appender.File.MaxFileSize = 10MB  

# u8F93u51FAu6240u4EE5u65E5u5FD7uFF0Cu5982u679Cu6362u6210DEBUGu8868u793Au8F93u51FADEBUGu4EE5u4E0Au7EA7u522Bu65E5u5FD7  

log4j.appender.File.Threshold = ALL  

log4j.appender.File.layout = org.apache.log4j.PatternLayout  

log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n

3.4 创建SqlMapConfig.xml配置文件

配置mybatis的运行环境,数据源、事务等。

<!-- 和spring整合后 environments配置将废除-->

<environments default="development">

<environment id="development">

<!-- 使用jdbc事务管理,事务控制由mybatis-->

<transactionManager type="JDBC" />

<!-- 数据库连接池,由mybatis管理-->

<dataSource type="POOLED">

<property name="driver" value="com.mysql.jdbc.Driver" />

<!--解决办法 把JDBC连接MySQL的URL中,所有的&符号,都改为&amp;  (有分号!!!)-->

<property name="url" value="jdbc:mysql://192.168.1.107:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false" />

<property name="username" value="root" />

<property name="password" value="bd+?Ki)eb1kO" />

</dataSource>

</environment>

</environments>

3.5 根据用户id(注解)查询用户信息

3.5.1 创建用户表的pojo

package org.hxweb.web.ssm.pojo;

import java.util.Date;

public class User {

//属性名与数据用户表字段一致

private Integer id;

private String name;  //用户名

private String sex;   //性别

private Date birthday; //生日

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address

+ "]";

}

}

3.5.2 映射文件

映射文件命名:

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在映射文件中配置sql语句。

注意:(sql语句必须首先在客户端调试通过)

表名有时会区分大小写。

User.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命名空间,作用就是对sql进行分类化管理,理解sql隔离 

注意:使用mapper代理方法开发,namespace有特殊重要的作用

-->

<mapper namespace="test">

<!-- 在 映射文件中配置很多sql语句 -->

<!-- 需求:通过id查询用户表的记录 -->

<!-- 通过 select执行数据库查询

id:标识 映射文件中的 sql

将sql语句封装到mappedStatement对象中,所以将id称为statement的id

parameterType:指定输入 参数的类型,这里指定int型 

#{}表示一个占位符号

#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称

resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。

-->

<select id="findUserById" parameterType="int" resultType="org.hxweb.web.ssm.pojo.User">

SELECT * FROM user WHERE id=#{value}

</select>

<!-- 根据用户名称模糊查询用户信息,可能返回多条

resultType:指定就是单条记录所映射的java对象 类型

${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。

使用${}拼接sql,引起 sql注入

${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value

-->

<select id="findUserByName" parameterType="java.lang.String" resultType="org.hxweb.web.ssm.pojo.User">

SELECT * FROM user WHERE username LIKE '%${value}%'

</select>

<!-- 添加用户 

parameterType:指定输入 参数类型是pojo(包括 用户信息)

#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值

-->

<insert id="insertUser" parameterType="org.hxweb.web.ssm.pojo.User">

<!-- 

将插入数据的主键返回,返回到user对象中

SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键

keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性

order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序

resultType:指定SELECT LAST_INSERT_ID()的结果类型

-->

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

SELECT LAST_INSERT_ID()

</selectKey>

insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})

<!-- 

使用mysql的uuid()生成主键

执行过程:

首先通过uuid()得到主键,将主键设置到user对象的id属性中

其次在insert执行时,从user对象中取出id属性值

-->

<!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">

SELECT uuid()

</selectKey>

insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->

</insert>

<!-- 删除 用户

根据id删除用户,需要输入 id值

-->

<delete id="deleteUser" parameterType="java.lang.Integer">

delete from user where id=#{id}

</delete>

<!-- 根据id更新用户

分析:

需要传入用户的id

需要传入用户的更新信息

parameterType指定user对象,包括 id和更新信息,注意:id必须存在

#{id}:从输入 user对象中获取id属性值

-->

<update id="updateUser" parameterType="org.hxweb.web.ssm.pojo.User">

update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 

where id=#{id}

</update>

</mapper>

3.5.3 在SqlMapConfig.xml加载映射文件

在sqlMapConfig.xml中加载User.xml:

<!-- 加载 映射文件 -->

<mappers>

   <mapper resource="config/sqlmap/User.xml"/>

</mappers>

3.5.4 程序编写

// 根据id查询用户信息,得到一条记录结果

@Test

public void findUserByIdTest() throws IOException {

// mybatis配置文件

String resource = "config/SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 通过SqlSession操作数据库

// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id

// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数

// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象

// selectOne查询出一条记录

User user = sqlSession.selectOne("test.findUserById", 1);

System.out.println(user);

// 释放资源

sqlSession.close();

}

3.6 根据用户名称模糊查询

3.6.1.映射文件:

<!-- 根据用户名称模糊查询用户信息,可能返回多条

resultType:指定就是单条记录所映射的java对象 类型

${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。

使用${}拼接sql,引起 sql注入

${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value

-->

<select id="findUserByName" parameterType="java.lang.String" resultType="org.hxweb.web.ssm.pojo.User">

SELECT * FROM user WHERE username LIKE '%${value}%'

</select>

3.6.2 程序代码:

// 根据用户名称模糊查询用户列表

@Test

public void findUserByNameTest() throws IOException {

// mybatis配置文件

String resource = "config/SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// list中的user和映射文件中resultType所指定的类型一致

List<User> list =  sqlSession.selectList("test.findUserByName", "小明");

                 //sqlSession.selectOne("test.findUserByName", "小明");

System.out.println(list);

sqlSession.close();

}

3.6.3 小结:   

3.6.3.1 parameterType

在映射文件中通过parameterType指定输入 参数类型

3.6.3.2 resultType

在映射文件中通过resultType指定数据结果的类型

3.6.3.3 #{} 和 ${}

#{}:表示一个占位符号

${}:表示一个拼接符号,会引起sql注入,存在安全隐患,不建议使用${}。

3.6.3.4 selectOne 和 selectList

selectOne表示查询出一条记录进行映射。如果使用 selectOne 能够实现使用 selectList 也可以实现(list中只有一个对象)

selectList表示查出一个列表(多条记录)进行映射。如果使用 selectList 查询多条记录不能使用 selectOne ,selectList查询一条记录,selectOne 也可以实现。



欢迎关注我的大鱼号:佳云分享



以上是关于MyBatis学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习笔记(14)-spring和mybatis整合

springmvc+mybatis学习笔记(汇总)

mybatis学习笔记(14)-mybatis整合ehcache

Mybatis学习笔记

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

Mybatis学习笔记