发表于: 2020-04-21 22:22:14

1 1243


配置服务器,这里我没去新买了,就用国外的小水管试试。

安装好 mysql server 后先用 navicat 连接:

这里需要注意的是安装好了之后需要修改配置文件,因为安装好之后默认只能本地连接,想要其他机器访问最好是绑定客户端的 ip 地址,不过咱大局域网的 ip 地址我也不知道怎么找,直接注释掉这句算了。

尝试连接报错,显示没有权限连接:


粘贴如下神秘代码刷新搞定:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '我的数据库密码' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


navicat 成功连接数据库:

这里为了方便连接,已经把远程数据库的格式与本地数据库统一。


在配置文件 db.properties 中修改数据库 url 即可,测试连接成功:



用昨晚写的 mybatis 方法测试了一下,插入成功,自增主键返回也没有问题,就是中文显示乱码:

服务器上显示也乱码:


搜索了一下,原来是传输数据的过程中编码不对,再次修改 db 配置的 url 如下:

jdbc.url = jdbc:mysql://1xx.xx.xx.x2:3306/school?useUnicode=true&characterEncoding=utf-8
jdbc.user = root
jdbc.passwd = 我的数据库密码
jdbc.driverClass = com.mysql.jdbc.Driver


清空数据库后测试完全莫得问题:


==============================

去辅导师兄的日报里看了一眼,感觉我的代码写的太乱了,仿照师兄的目录改了一下,添加了一些功能,本来目的就是做增删改查,之前写的太少了。

修改后的目录结构:

DBTools.java

package cn.mogeek.mybatis;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public  class DBTools {
public static SqlSession getSqlSession(){
SqlSessionFactory sessionFactory;
InputStream inputStream = DBTools.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sessionFactory.openSession();
}
}

MybatisDao.java

package cn.mogeek.mybatis;

import cn.mogeek.domain.Disciple;

import java.io.IOException;
import java.util.List;

public interface MybatisDao {
public Disciple selectById(int id);

public int insert(Disciple disciple);

public void deleteById(int id);

public List<Disciple> selectAll();

public void update(Disciple disciple);
}

MybatisDaoImpl.java

package cn.mogeek.mybatis;

import cn.mogeek.domain.Disciple;
import org.apache.ibatis.session.SqlSession;

import java.io.IOException;
import java.util.List;

public class MybatisDaoImpl implements MybatisDao {
public Disciple selectById(int id){
SqlSession session = DBTools.getSqlSession();
Disciple disciple = session.selectOne("mapper.discipleMapper.getDisciple", id);
session.close();
return disciple;
}

public int insert(Disciple disciple){
SqlSession session = DBTools.getSqlSession();

session.insert("mapper.discipleMapper.insertDisciple", disciple);
session.commit();
session.close();
return disciple.getId();
}

public void deleteById(int id){
SqlSession sqlSession = DBTools.getSqlSession();
sqlSession.delete("mapper.discipleMapper.deleteDisciple", id);
sqlSession.commit();
sqlSession.clearCache();
sqlSession.close();
}

public List<Disciple> selectAll(){
SqlSession sqlSession = DBTools.getSqlSession();
List<Disciple> discipleList = sqlSession.selectList("mapper.discipleMapper.selectAllDisciples");
sqlSession.close();
return discipleList;
}

public void update(Disciple disciple){
SqlSession sqlSession = DBTools.getSqlSession();
sqlSession.update("mapper.discipleMapper.updateDisciple", disciple);
sqlSession.commit();
sqlSession.clearCache();
sqlSession.close();
}
}

映射配置:

discipleMapper.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="mapper.discipleMapper">
<!--name, object, graduated_school, brother, comefrom, daily_report, aims;-->
   
   <resultMap id="disciples" type="cn.mogeek.domain.Disciple">
<id property="id" column="id" javaType="int"></id>
<result property="qq" column="qq" javaType="int"></result>
<result property="name" column="name" javaType="String"></result>
<result property="aims" column="aims" javaType="String"></result>
<result property="object" column="object" javaType="String"></result>
<result property="brother" column="brother" javaType="String"></result>
<result property="comefrom" column="comefrom" javaType="String"></result>
<result property="graduated_school" column="graduated_school" javaType="String"></result>
<result property="daily_report" column="daily_report" javaType="String"></result>
</resultMap>

<!-- 根据id查询得到一个disciple对象-->
   <select id="getDisciple" parameterType="int" resultType="cn.mogeek.domain.Disciple">
select * from jnshu_copy1 where id = #{id}
</select>

<!--插入一个新的 disciple 对象-->
   <insert id="insertDisciple" parameterType="cn.mogeek.domain.Disciple" useGeneratedKeys="true" keyProperty="id">
insert into jnshu_copy1 (qq, name, object, graduated_school, brother, comefrom, daily_report, aims)
values (#{qq},#{name},#{object},#{graduated_school},#{brother},#{comefrom},#{daily_report},#{aims})
</insert>

<delete id="deleteDisciple" parameterType="int" >
delete from jnshu_copy1 where id=#{id}
</delete>

<select id="selectAllDisciples" resultMap="disciples">
select * from jnshu_copy1
</select>

<update id="updateDisciple" parameterType="cn.mogeek.domain.Disciple">
update jnshu_copy1
<set>
<if test="qq != null"> qq = #{qq}, </if>
<if test="name != null"> name = #{name}, </if>
<if test="object != null"> object = #{object}, </if>
<if test="graduated_school != null"> graduated_school = #{graduated_school}, </if>
<if test="brother != null"> brother = #{brother}, </if>
<if test="comefrom != null"> comefrom = #{comefrom}, </if>
<if test="daily_report != null"> daily_report = #{daily_report}, </if>
<if test="aims != null"> aims = #{aims}</if>
</set>
where id = #{id}
</update>

</mapper>


感觉字段有点多,不想每次更新的时候全部 set 一遍,discipleMapper.xml 只会修改部分改动的字段。

当然测试也是通过的,没有问题:


数据库设置的时自增长主键(id),在我测试的时候发现一个问题:

比如当下最大的 id 为 3,我删除了这条数据,那么当前最大的 id 为 2,此时当我执行插入的时候自动生成的 id 为 4 而不是 3

我之前怀疑是我没有清除 SqlSession 中的缓存导致的,后来 sqlsession.clearCacher() 清楚了缓存之后还是一样的结果。

经过搜索后发现删除之后重启 mysql 服务,那么这个删除的主键才会真正的被释放,再次插入的时候又可以用了。(经过验证确实是这样)


返回列表 返回列表
评论

    分享到